Search
Write a publication
Pull to refresh

Помучался, помучался с готовым и сделал свой скрипт управления персонажем

Здраствуй, хабр!
Недавно я столкнулся с проблем в 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 и пр.)
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.