Главная » Статьи » 2D Шутер на Unity3D

4.Разбивка на тайлы и движение перса (Часть 2)

Я надеюсь, Вы не испугались такого объемного кода, что я привел на прошлом уроке? Нет? Тогда идем дальше. Я объясню скрипт построчно, поэтому я сразу дал такой код (Вы можете его скачать – из прошлого урока). Скрипт занимается передвижением персонажа. Если Вы кликнете по кнопке "Play”, то вы сможете поиграть в игру и, конечно же, довольно неуклюже передвигаться персонажем.

Давайте сначала посмотрим на нашу функцию Update:

void Update () {

  FindInput();

  ProcessMovement();

  if (thisIsPlayer == true)

  {

    HandleCamera();

  }

}

Мы вызываем функцию FindInput, чтобы узнать какие клавиши были нажаты, и установки переменных которые передаются функции ProcessMovement функция для передвижения персонажа. Если мы (игрок) персонаж, то скрипт вызывает функцию HandleCamera – центрирует камеру вокруг игрока.

Следующий метод:

void FindPlayerInput ()

{

// Находим вектор для передвижения

inputMovement = new      Vector3(Input.GetAxis("Horizontal"),0,Input.GetAxis("Vertical") );

// Находим вектор для мыши

tempVector2 = new Vector3(Screen.width * 0.5f,0,Screen.height *

0.5f); // Позиция в середине экрана

tempVector = Input.mousePosition; // Позиция мыши на экране

tempVector.z = tempVector.y; /* положение мыши дает 2D координаты, В tempVector я меняю координату Y на Z и устанавливаю для Y значение 0.*/

tempVector.y = 0;

inputRotation = tempVector - tempVector2; // Направление куда мы смотрим/целимся/стреляем.

}

Разбираем этот метод:

Мы используем векторы. Если вы не знакомы с векторами, то рекомендую изучить их, так как они лучшие друзья, когда дело доходит до управления перемещением объекта в 3D мире. Первая строка этого метода находит, на какие клавиши нажал игрок. Помните, какой Инпут назывался Horizontal? Если нет идем в Едиторе - edit - project settings – input.

Метод - Input.GetAxis("Horizontal") – возвращает нам значения от (-1) до 1. Нажатие на клавишу А даст нам (-1), а на D = 1.

Дальше мы находим поворот перса, inputRotation это Vector3, который вычисляет вектор от центра экрана до позиции мыши на экране. В не буду вдаваться в математику, но эта строка работает, так как это надо.

В следующем методе мы работаем над передвижением:

void ProcessMovement()

{

  rigidbody.AddForce (inputMovement.normalized * moveSpeed * Time.deltaTime);

  transform.rotation = Quaternion.LookRotation(inputRotation);

  transform.eulerAngles = new Vector3(0,transform.eulerAngles.y + 180,0);

  transform.position = new Vector3(transform.position.x, 0,transform.position.z);

}

Так как мы добавили компонент Rigidbody нашему персу, мы можем вызывать функцию AddForce функция передвигает перса(Только если добавлен компонент Rigidbody). Rigidbody (в коде) является указателем на свойство Rigidbody у объекта. Помните наш вектор который принимал нажатые клавиши? Сейчас мы положили эти клавиши на Х и Z. Мы ограничиваем вектор в размере 1, если бы мы не сделали этого то игрок передвигался бы с разной скоростью по полю, так как вектор может быть разных размеров. Мы умножаем вектор на скорость передвижения и на Time.deltaTime. Я не знаю имеет ли смысл умножать на Time.deltaTime, но как я понимаю она используется, чтобы сделать движение более гладким и последовательным в зависимости от частоты кадров.

2-я Строка. Quaternion (Кватернион), о том что это можете почитать здесь. Transform.rotation является, как раз таки, кватернионом, и не можем просто указать вектор чтобы объект повернулся. Если объект надо повернуть на направление вектора, то надо использовать метод LookRotation, а в скобках указать к какому векторму нужно повернуть объект, что мы и сделали во второй строке.

Так как это 2D игра, мы не хотим, чтобы объект вращался вокруг третьей оси(оси У), в третьей строке мы это и указываем игре. Мы просто сбрасываем поворот вокруг оси Х и Z на 0, и сохраняем оригинальный поворот по оси У.

В последней строке мы указываем, что положение объекта по оси У ВСЕГДА должно быть 0.

И последний метод HandleCamera:

void HandleCamera()

{

objCamera.transform.position = new Vector3(transform.position.x,15,transform.position.z);

objCamera.transform.eulerAngles = new Vector3(90,0,0);

}

Просто центрирует камеру вокруг перса.

Идем дальше добавим куб в сцену. Жмем на кнопку "Playи движемся вокруг куба, куб в данном случае служит как-бы ориентиром, так как если бы мы не добавили его нам бы казалось, что перс не движется.


Категория: 2D Шутер на Unity3D | Добавил: Шаке (29.06.2012)
Просмотров: 4216 | Комментарии: 1
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
/>meta http-equiv=