Читать книгу Делаем PC игру вместе - Ар'лан ис'Дрекхэм - Страница 10
«Делаем PC игру вместе»
7. Контроллер Персонажа
ОглавлениеПродолжим, напишем такую строку кода:
CharacterController CharControl;
Это переменная типа CharacterController, которая называется CharControl. Объявление такой переменной происходит по аналогии того, что мы сделали выше. Чтобы лучше понять аналогию и запомнить принцип представьте так, что у нас была переменная типа float с названием speed. А сейчас у нас переменная типа CharacterController с названием CharControl. Закрепите в сознании, что все объявления в будущем будут происходить аналогично, тогда картина происходящего будет сразу ясна.
CharacterController это специализированный класс Unity3d созданный для универсального и быстрого создания движений и соприкосновений персонажей в игре, в нашем случае самого игрока.
Прежде чем продолжить нужно обязательно уяснить что в C# типы переменных могут быть с конкретным значением или только ссылки на другие переменные. Например, описанные выше переменные float являются типами значений, т.е. в них можно указать конкретно, что speed = 2.0f; Ссылочные же типы, такие как CharacterController являются только указателем (ссылкой) на соответствующий класс. Логика подсказывает, что если это ссылка, то нужно получить что-то на что можно ссылаться, т.е. получить конкретный класс или объект. Для этого используем один из главных методов, который я описывал ранее, он называется Start (). Напишем строчку метода Start () в «тело» нашего сценария FPCharacter:
using UnityEngine;
public class FPCharacter: MonoBehaviour
{
public float speed = 2.0f;
public float speedfast = 50.0f;
public float gravity = -9.8f;
CharacterController CharControl;
void Start ()
{
}
}
Запишем в этот метод строчку кода получения конкретного класса CharacterController:
void Start ()
{
CharControl = GetComponent <CharacterController> ();
}
Можно заметить, что объявление класса и метода выглядит похоже – между фигурными скобками находится основной код, так называемое «тело» структуры.
Теперь созданная нами переменная CharControl используя функцию GetComponent <> () (получить компонет) становится ссылкой на компонент CharacterController. Но хочется спросить, а где же этот компонент, который мы получили? Если функция получения начинается так как у нас сразу со слов GetComponent после знака равенства, значит получение чего либо происходит прямо «здесь», в этом игровом объекте на котором находится сценарий кода.
Общий вид программы теперь такой:
using UnityEngine;
public class FPCharacter: MonoBehaviour
{
public float speed = 2.0f;
public float speedfast = 50.0f;
public float gravity = -9.8f;
CharacterController CharControl;
void Start ()
{
CharControl = GetComponent <CharacterController> ();
}
}
Перед словом Start появилось новое слово void, оно означает «пустой», это наиболее часто используемый тип при указании метода. Дело в том, что метод в языке программирования C# может выдавать некоторый результат своих вычислений. В таком случае вместо void ставится тот тип, который и должен быть результатом. Например, если результатом вычислений будет число с запятой, то вместо void ставится float.
Как я рассказывал ранее метод Start () выполняется один раз. Теперь при запуске программы ссылка на компонет CharacterController будет храниться все время пока работает программа.
Переключаемся снова в редактор Unity3d, выделяем наш объект Player в окне Hierarchy и в окне Inspector нажимаем кнопку Добавить Компонент (Add Component). В открывшемся меню в строке поиска вводим несколько первых букв, например: char и мы сразу можем видеть, что в результатах поиска уже виден искомый компонент CharacterController – добавляем его. Теперь мы видим 3 компонента на нашем объекте Player: Transform, FPCharacter и CharacterController. Введите положение объекта (в компоненте Transform) равным 0,0,0, таким образом объект переместится в нулевое положение пространства сцены, осей координат. Возьмите за правило при создании и настройке нового объекта всегда ставить его в позицию 0,0,0 и вращение 0,0,0. Это избавит вас от множества путаниц связанных с расстановкой объектов «там где нужно». Чтобы приблизиться зрением к нашему объекту в окне Scene можно всегда нажимать клавишу F на клавиатуре, она сфокусирует изображение на выделенном объекте.
Мы видим наш объект как зеленый проволочный каркас, это границы компонента CharacterController, т.е. фактически размер и рост человека игрока. Нужно изменить несколько параметров, выставьте значения MinMoveDistance = 0, Radius = 0.35, Height = 1.8. Так у нас получается персонаж игры ростом 1.8 метра. Единица измерения равная 1 в Unity3d равна 1 метру. Соблюдение приблизительно точных размеров таких же как в действительности очень важно при создании игры, так как слишком завышенные размеры, например, если игрок будет размером не 1.8, а 18 единиц Unity3d, может негативно повлиять на множество разнообразных аспектов. Это же касается и избыточного уменьшения. Поэтому, если например, вы будете создавать какие-то 3д модели в программе 3д моделирования 3ds Max, то в ней нужно выставить System Unit Scale: 1 Unit = Meters, Display Unit Scale: Metric, Millimeters, точку вращения повернуть (зеленый маркер) вверх на 90 градусов и эскпортировать 3д модель в формате. FBX с установленным принудительно Units = Meters. При таком способе отправки моделей в среду разработки Unity3d ваши модели всегда будут соответствовать реальным размерам и всегда будут повернуты правильно. Разумеется, необходимо будет соблюдать правильные размеры при моделировании в программе 3ds Max по ее правилам.