С помощью этого префаба юнити можно очень просто создать «болванку» для персонажа игрока в трехмерной игре.
Префаб 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);
}
Мой первый опыт в создании подобных уроков. Надеюсь, новичкам будет полезно.
Если что-то будет непонятно- спрашивайте.