
Итак. Всем привет. И сегодня я расскажу, как сделать простое движение персонажа. Сейчас только от третьего лица… Приступим…
Начнём, пожалуй, с создания персоажа. У меня это будет куб. Кто не знает, как создавать кубы или круги, поясняю – “GameObject” => “CreateOther” => “Cube”. Создаём таким же образом камеру и привязываем к кубу (то бишь просто в иерархии перетаскиваем камеру на куб).
Так… Теперь создадим поверхность, по которой персонаж будет ходить. Пусть это будет просто “Plane”. Ах, да… В конце урока будет ссылка с исходником по туториалу для тех, кто не понял.
Итак. Теперь создадим скрипт “Move”. Добавим переменную игрока и переменную скорости.
1 2 |
public GameObject player; public int speed = 5; |
Теперь укажем в методе старта, что это объект, на котором висит скрипт.
1 2 3 |
void Start () { player = (GameObject)this.gameObject; } |
Теперь сделаем само передвижение игрока вперёд при нажатии на “W” или стрелку вверх. Это делаем в методе void Update()! Для этого мы будем прибавлять позицию. Например вперёд.
1 2 3 4 |
if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow)) { player.transform.position += player.transform.forward * speed * Time.deltaTime; } |
Мы прибавили позицию вперёд (forward) и умножили на скорость, а точнее её переменную. И обязательно надо умножить на кадры в секунду (deltaTime).
Таким же образом сделаем движение назад. Только будем отнимать позицию.
1 2 3 4 |
if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow)) { player.transform.position -= player.transform.forward * speed * Time.deltaTime; } |
Таким же образом можем сделать и вправо и влево (right, left), но я сделаю просто поворот игрока, при нажатии на “A” или “D”.
Я буду использовать “Rotate()”. Чтобы поворачивать по оси “Y”, я буду использовать “up” и “down”. Кстати, для этого ещё надо объявить переменную “public int speedRotation = 3”. И пишем в условиях.
1 2 3 4 5 6 7 8 |
if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow)) { player.transform.Rotate(Vector3.down * speedRotation); } if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow)) { player.transform.Rotate(Vector3.up * speedRotation); } |
Ну… Сейчас пришло время анимировать. Я записываю анимацию в самой юнити. Это можно открыть в “Window” => “Animation”. В этом окне мы можем анимировать куб. Итак… Пропустим момент создания анимации. Давайте теперь создадим переменную анимации.
1 |
public AnimationClip anima; |
Теперь в старте добавим клип.
1 |
animation.AddClip(anima, "animCube"); |
Теперь мы будем его воспроизводить через “CrossFade”. Воспроизводить буду в условиях ходьбы вперёд и назад. Чтобы воспроизвести, нужно написать.
1 |
animation.CrossFade("animCube"); |
Итак… У нас получился хороший код. Сейчас мы сделаем прыжок. Всё так же просто. Опять мы будем прибавлять позицию. Только вверх (up).
И так же с новой переменной анимации “public AnimationClip anima2;”? так же добавим и переменной “public int jumpSpeed = 50;”. И мы получаем условие.
1 2 3 4 |
if (Input.GetKeyDown(KeyCode.Space)) { player.transform.position += player.transform.up * jumpSpeed * Time.deltaTime; } |
Всё… Наш код готов.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
using UnityEngine; using System.Collections; public class Move : MonoBehaviour { public GameObject player; public int speedRotation = 3; public int speed = 5; public AnimationClip anima; public int jumpSpeed = 50; void Start () { player = (GameObject)this.gameObject; animation.AddClip(anima, "animCube"); } void Update(){ if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow)) { player.transform.position += player.transform.forward * speed * Time.deltaTime; animation.CrossFade("animCube"); } if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow)) { player.transform.position -= player.transform.forward * speed * Time.deltaTime; } if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow)) { player.transform.Rotate(Vector3.down * speedRotation); } if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow)) { player.transform.Rotate(Vector3.up * speedRotation); } if (Input.GetKeyDown(KeyCode.Space)) { player.transform.position += player.transform.up * jumpSpeed * Time.deltaTime; } } } |
Надо только повесить его на куб и указать всё в инспекторе. Ах да… Можно поставить физику кубу, для более реалистичного прыжка.
Всем спасибо)
Источник: http://forum.hellroom.ru/index.php?topic=10940.0
Здравствуйте, очень помогла статья, спасибо. Однако у меня есть вопрос касательно того, как сделать чтобы можно было бы осматриваться.