Помучался, помучался с готовым и сделал свой скрипт управления персонажем
Invite pending
Здраствуй, хабр!
Недавно я столкнулся с проблем в Unity3D(далее — юнити), которая возникла у меня при создании игры-платформера. Дело в том, что по умолчанию в юнити Character Controller, даже вместе с PlatformInput.js, при зажимании кнопки назад(стрелка вниз('S')) персонаж идёт в сторону камеры (спиной), ну а если нажать кнопку вперёд('W'), то игрок-персонаж упирается в заднюю стену (в платформере). Здесь у меня и встал вопрос о том, как сделать своё управление.
Помучавшись с Character Controller, поискав в гугле, поизучав script-reference(далее — spe), я написал свой скрипт управления. С результатом вы сможете ознакомиться в конце статьи. А здесь я хотел бы поделиться опытом с людьми, которые тоже столкнулись с такой же проблемой. Итак, приступим.
Для начала создадим документ control.js (да, забыл сказать, я использую java script, т.к. c# не знаю)
Увидим такое:
создадим новую переменную speed: int и функцию walk() для ходьбы:
дальше надо разобраться с вызовом этой функции. запехнём «слушатель» нажатия клавиш в функцию Update():
значит, мы должны создать функцию для прыжка (можно конечно запихнуть и в update(), но я привык всё выносить в отдельную функцию):
вот в плане кода и всё. Осталось настроить всё. Особенно в плане Rigidbody, для этого сделайте также:

чтобы он неулетал и не упал на землю лицом (так, кстати можно, сделать плавание, если разморозить вращение по осям)
И видео на закуску:
Если вам понравилось, то я продолжу такие уроки и у меня уже есть идии для парочоки таковых: настройка кадровой анимации и управление под сенсо-тачи (Андройд, Ios и пр.)
Недавно я столкнулся с проблем в Unity3D(далее — юнити), которая возникла у меня при создании игры-платформера. Дело в том, что по умолчанию в юнити Character Controller, даже вместе с PlatformInput.js, при зажимании кнопки назад(стрелка вниз('S')) персонаж идёт в сторону камеры (спиной), ну а если нажать кнопку вперёд('W'), то игрок-персонаж упирается в заднюю стену (в платформере). Здесь у меня и встал вопрос о том, как сделать своё управление.
Помучавшись с Character Controller, поискав в гугле, поизучав script-reference(далее — spe), я написал свой скрипт управления. С результатом вы сможете ознакомиться в конце статьи. А здесь я хотел бы поделиться опытом с людьми, которые тоже столкнулись с такой же проблемой. Итак, приступим.
Для начала создадим документ control.js (да, забыл сказать, я использую java script, т.к. c# не знаю)
Увидим такое:
#pragma strict
function Start () {
}
function Update () {
}
создадим новую переменную speed: int и функцию walk() для ходьбы:
public var c_amera : GameObject;//переменная с камерой
pulic var speed : float;//создаём публичною переменную скорости типа float
function walk(delta : float)//delta-это входные данные, которые отвечают за то расстояние, на которое сместиться наш персонаж за один вызов функции
{
if(delta>0)//проверяем, что если delta имеет отрицательное значение, то разворачиваем игрока вправо, нет - влево(заметьте: абсолютное значение, чтобы он не крутился)
transform.eulerAngles.y =90;//собственно поворачиваем вправо
else
transform.eulerAngles.y =-90;//влево
transform.position.x +=delta;/смещаем персонажа на delta'у по x (для 2D игр - это горизонтальная ось)
c_amera.transform.position.x=transform.position.x;//приравниваем положение камеры к положению персонажа
c_amera.transform.position.y=transform.position.y+2;//+по высоте, потому что, когда персонаж спрыгивает, то скорей всего скрипт не узнает этого (пока я не нашёл способа это узнать)
}
дальше надо разобраться с вызовом этой функции. запехнём «слушатель» нажатия клавиш в функцию Update():
function Update()
{
var h = Input.GetAxisRaw("Horizontal");//получаем значение нажатия клавиш вверх/вниз, где 0-ничего не нажато, <0.02-вниз, >0.02-вверх, собственно 0.02 - это и есть мёртвая зона, то есть "мягкость" нажатия клавиш
var v = Input.GetAxisRaw("Vertical");//ан-но с горизонтом
c_amera.transform.position.x=transform.position.x;//опять же смещяем камеру на позицию игрока
c_amera.transform.position.y=transform.position.y+2;//а то мало-ли он до сих пор прыгает
if(h > 0.02)//собсвенно отвечает за нажатие кнопки влево
walk(speed);//вызываем функцию walk() И передеаём положительное значение speed'а, то есть поворачиваемся влево и идём туда
if(h < -0.02)
walk(-speed);//идём вправо
if(v>0.5)//а вот мы и добрались до использования кнопки вверх, то есть прыжка
jump();
}
значит, мы должны создать функцию для прыжка (можно конечно запихнуть и в update(), но я привык всё выносить в отдельную функцию):
var jump : int = -1;//создаём переменную-свитчер
public var speedofjump : float; //скорость прыжка
function jump()
{
if(jumped<=0)
{
jumped++;//изначально задумывалось для двойного прыжка
gameObject.rigidbody.useGravity = false;//прыходиться выключать гравитацию, чтобы во время прыжка персонаж не дрыгался
for(var i=0;i<20;i++)
{
transform.position.y+=speedofjump;//поднимаем персонажа на speedofjump-координат
yield WaitForSeconds(0.01);//задержка, небольшая, чтобы более плавно он прыгал
c_amera.transform.position.x=transform.position.x;//сдвигаем камеру
c_amera.transform.position.y=transform.position.y+2;//и по высоте
}
gameObject.rigidbody.useGravity = true;//включаем обратно гравитацию, чтобы он обратно приземлился
yield WaitForSeconds(1);//ждём приземления(когда сам прыжок заканчвается)
jumped--;
}
}
вот в плане кода и всё. Осталось настроить всё. Особенно в плане Rigidbody, для этого сделайте также:

чтобы он неулетал и не упал на землю лицом (так, кстати можно, сделать плавание, если разморозить вращение по осям)
И видео на закуску:
Если вам понравилось, то я продолжу такие уроки и у меня уже есть идии для парочоки таковых: настройка кадровой анимации и управление под сенсо-тачи (Андройд, Ios и пр.)