Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Unity > Уроки

Ответ
 
Опции темы
Старый 23.07.2010, 14:07   #1
Nuprahtor
Элита
 
Аватар для Nuprahtor
 
Регистрация: 26.07.2008
Сообщений: 1,972
Написано 1,095 полезных сообщений
(для 3,923 пользователей)
Unity-Небольшой туториал: дополняем FPSController

С помощью этого префаба юнити можно очень просто создать «болванку» для персонажа игрока в трехмерной игре.

Префаб First Person Controller находится в папке Standart Assets\Prefabs

Этот компонент содержит:

Character Controller – компонент, используемый в играх от третьего и первого лица. На этот компонент не действуют команды rigidbody-физики.

* Height - высота капсульного коллайдера.
* Radius - можно сказать, что это ширина коллайдера.
* Slope Limit – здесь указывается наклон, на который сможет передвигаться коллайдер.
* Step Offset – коллайдер сможет подняться на следующую ступень, только если она ближе к земле чем значение этой переменной.
* Min Move Distance – если персонаж передвинулся на меньшее значение, чем в этой переменной, он не сдвинется с места. Чаще всего используется, чтобы уменьшить дрожание.
* Skin width – два коллайдера могут проходить сквозь друг друга настолько, насколько равна эта переменная. Большое значение уменьшает дрожание, маленькое может привести к тому, что коллайдер будет застревать.
* Center – центровка капсульного коллайдера.

MouseLook – скрипт, с помощью которого направление камеры зависит от движения курсора мыши.

FPSWalker - скрипт, который отвечает за передвижение персонажа.

* Speed - скорость передвижения персонажа.
* JumpSpeed - высота прыжка персонажа.
* Gravity - гравитация, которая действует только на персонаж во время прыжка.

Для удобного доступа к переменным скрипта FPSWalker, я создаю управляющий скрипт (scr_player_status)(JavaScript)

var fps_walker;

    var st_moving;

    function Start () {
    fps_walker = GetComponent(FPSWalker);
    }
Этот скрипт ставится на главный объект префаба First Person Controller

Теперь с помощью переменной fps_walker мы можем получить доступ к скорости, мощности прыжка и гравитации. st_moving – переменная-флаг.

Чтобы продемонстрировать работу со скоростью, реализуем «уставание» – во время бега переменная, отвечающая за энергию, уменьшается. Низкая энергия приводит к низкой скорости.

Вверху скрипта выразим две переменные

    var st_energy = 100.0;
    var st_energy_max = 100.0;
Первая – это текущая энергия. Вторая – максимальный уровень энергии.

Теперь сделаем так, чтобы во время передвижения, персонаж терял очки энергии. Мы не будем изменять FPSWalker, и реализуем это все в scr_player_status.

function Update () {

    if (Input.GetKey ("w" ) && fps_walker.grounded == true)
    {
    st_moving = 1;
    st_energy = st_energy - 0.15;
    }
    else
    {st_moving = 0;}

    if (Input.GetKey ("s") && fps_walker.grounded == true)
    {
    st_moving = 1;
    st_energy = st_energy - 0.05;
    }
    else
    {st_moving = 0;}

    }
fps_walker.grounded == true – это проверка на то, находится ли персонаж в воздухе. Мы же не хотим, чтобы персонаж терял энергию в прыжке?

Нам нужно показывать количество очков энергии, поэтому добавим в наш скрипт функцию OnGUI()

 function OnGUI () {

    GUI.Label (Rect (25, 90, 200, 200), "Energy "+st_energy);
    }
Теперь добавим в наш скрипт зависимость скорости от энергии:

    if (st_energy < 40)
    {fps_walker.speed = 2;}
    if (st_energy > 40)
    {fps_walker.speed = 8;}
Теперь сделаем так, чтобы уровень энергии не мог принимать значения больше 100 и меньше 1

if (st_energy > st_energy_max)
    {
    st_energy = st_energy_max;
    }

    if (st_energy < 1.0)
    {
    st_energy = 1;
    }
Теперь сделаем восстановление энергии в то время, когда персонаж стоит на месте

    if (st_moving == 0)
    {st_energy = st_energy+0.30;}
Вот весь скрипт (ставьте его на главный объект префаба First Person Controller)

var st_energy = 100.0;
        var st_energy_max = 100.0;

        var st_moving;
        var fps_walker;
        function Start () {
        fps_walker = GetComponent(FPSWalker);
        fps_walker.speed = 8;
        }

        function Update () {
        /////
        if (st_energy > st_energy_max)
        {
        st_energy = st_energy_max;
        }

        if (st_energy < 1.0)
        {
        st_energy = 1;
        }

        if (st_moving == 0)
        {st_energy = st_energy+0.030;}
        /////
        if (st_energy < 40)
        {fps_walker.speed = 1;}
        if (st_energy > 40)
        {fps_walker.speed = 8;}
        /////

        if (Input.GetKey ("w") && fps_walker.grounded == true)
        {
        st_moving = 1;
        st_energy = st_energy - 0.15;
        }
        else
        {st_moving = 0;}

        if (Input.GetKey ("s") && fps_walker.grounded == true)
        {
        st_moving = 1;
        st_energy = st_energy - 0.05;
        }
        else
        {st_moving = 0;}

        }

        function OnGUI () {

        GUI.Label (Rect (25, 90, 200, 200), "Energy  "+st_energy);
        }
Мой первый опыт в создании подобных уроков. Надеюсь, новичкам будет полезно.
Если что-то будет непонятно- спрашивайте.
(Offline)
 
Ответить с цитированием
Эти 9 пользователя(ей) сказали Спасибо Nuprahtor за это полезное сообщение:
baton4ik (30.07.2010), BlackDragon (25.07.2010), den (23.07.2010), Dream (23.07.2010), Illidan (23.07.2010), impersonalis (13.06.2011), Nex (09.08.2010), pax (23.07.2010), Slayer (12.10.2010)
Старый 13.06.2011, 00:12   #2
kremenizator
AnyKey`щик
 
Регистрация: 11.06.2011
Сообщений: 3
Написано одно полезное сообщение
Ответ: Unity-Небольшой туториал: дополняем FPSController

Круто! Спасибо!
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Nuprahtor (13.06.2011)
Старый 13.06.2011, 04:19   #3
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,354
Написано 2,470 полезных сообщений
(для 6,850 пользователей)
Ответ: Unity-Небольшой туториал: дополняем FPSController

Опять мышь не блокируется!?
(Offline)
 
Ответить с цитированием
Старый 13.06.2011, 08:46   #4
cahekp
Разработчик
 
Аватар для cahekp
 
Регистрация: 14.12.2008
Адрес: Томск
Сообщений: 530
Написано 270 полезных сообщений
(для 883 пользователей)
Ответ: Unity-Небольшой туториал: дополняем FPSController

А как же Time.deltaTime?
Без него же энергия будет очень медленно восстанавливаться, если игра жутко тормозит, и наоборот - очень быстро, если игра "летает".

Думаю, такую штуку: st_energy = st_energy - 0.15;
лучше заменить на, допустим: st_energy = st_energy - 0.25*Time.deltaTime;
__________________
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Nuprahtor (13.06.2011)
Старый 13.06.2011, 14:00   #5
Nuprahtor
Элита
 
Аватар для Nuprahtor
 
Регистрация: 26.07.2008
Сообщений: 1,972
Написано 1,095 полезных сообщений
(для 3,923 пользователей)
Ответ: Unity-Небольшой туториал: дополняем FPSController

Да, совсем забыл о дельтатайме, когда писал тутор.
Но вообще, тутор уже устарел, так как в 3 Unity добавили улучшенную версию фпс-вокера
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 09:55.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com