forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Уроки (http://forum.boolean.name/forumdisplay.php?f=145)
-   -   Unity-Небольшой туториал: дополняем FPSController (http://forum.boolean.name/showthread.php?t=12990)

Nuprahtor 23.07.2010 14:07

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);
        }

Мой первый опыт в создании подобных уроков. Надеюсь, новичкам будет полезно.
Если что-то будет непонятно- спрашивайте.

kremenizator 13.06.2011 00:12

Ответ: Unity-Небольшой туториал: дополняем FPSController
 
Круто! Спасибо!

Randomize 13.06.2011 04:19

Ответ: Unity-Небольшой туториал: дополняем FPSController
 
Опять мышь не блокируется!?

cahekp 13.06.2011 08:46

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

Думаю, такую штуку: st_energy = st_energy - 0.15;
лучше заменить на, допустим: st_energy = st_energy - 0.25*Time.deltaTime;

Nuprahtor 13.06.2011 14:00

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


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot