Читать книгу Делаем PC игру вместе - Ар'лан ис'Дрекхэм - Страница 14
«Делаем PC игру вместе»
11. Голова
ОглавлениеВернемся в редактор, выделим наш объект Player в окне Hierarchy, нажмем на нем правой кнопкой мыши Create Empty (Создать Пустой). Таким образом, у нашего объекта Player появится дочерний объект, назовем его Head (Чтобы переименовать любой объект в Unity3d можно нажать клавишу F2). Этот объект Head и будет нашей головой. Нужно выставить значение Y = 0.7 для параметра Position его компонента Transform, так как мы понимаем, что голова должна быть выше уровня «живота». Теперь добавим глаза голове нашего игрока, для этого на только что созданном объекте Head в окне Inspector нажмем Add Component и введем в поиске Camera, добавим ее. Если в вашей сцене присутствует (смотрите в окне Hierarchy) камера, которая называется «Main Camera’, то удалите ее, так как она больше не нужна. Возвращаемся к коду.
Чтобы наша программа, наш сценарий, мог управлять только что созданной головой с глазами, нужно программно взаимодействовать с ней, т.е. нужно получить на нее ссылку, ссылку на объект голова. Вообще в Unity3d все является объектами и на всех них можно получить ссылку и, соответственно, управлять ими. Так запомните.
Сначала, «в теле» класса FPCharacter объявим ссылочную переменную на компонент Transform и 4 цифровых переменных:
Transform HeadTransf;
float RotatX;
public float SensVert = 2.0f;
public float MinVert = -70f;
public float MaxVert = 70f;
А теперь запишем строку кода получения ссылки на объект в методе Start ():
HeadTransf = transform.GetChild (0);
Метод GetChild () нужен для создания ссылки на дочерний объект. Когда мы создавали объект Head, то вы видели, что он появился как бы под объектом Player, т.е. является его дочерним объектом, и до поры до времени повторяет все движения и вращения своего «родителя», все это простая иерархия. Такая иерархия может быть многоуровневой – дочерний объект, дочерний объект дочернего объекта и т.д., и является фундаментальной особенностью Unity3d, крайне простой в создани и редактировании прямо на лету, и очень полезной почти во всех видах работ в среде разработки Unity3d, как программистских, так и в художественных.
GetChild (0) означает, что мы получаем дочерний объект с индексом 0, т.е. просто первый сверху вниз в иерархии. В программировании всегда начало отсчета происходит от нуля, т.е. если у вас есть 10 объектов, то получить каждый из них можно по порядку начиная от 0 и заканчивая 9. Чтобы привыкнуть к такой манере считать и быстро ориентироваться в ней, ведь в природе такое невозможно, в природе ничего нельзя назвать нулевым номером, потому что если у вас в руках 10 яблок, то любое первое яблоко, это номер 1, а десятое – 10, так вот, чтобы быстро ориентироваться в такой системе отсчета когда у вас есть указанное количество элементов или объектов, то просто отнимайте единицу от их общего количества и никаких сложностей не будет. Если у вас есть 23 яблока, значит в программировании обращаться к ним нужно как 0—22.
Теперь, в методе Update () внизу напишем такие строки:
RotatX = RotatX – Input.GetAxis («Mouse Y») * SensVert;
RotatX = Mathf.Clamp (RotatX, MinVert, MaxVert);
HeadTransf. localEulerAngles = new Vector3 (RotatX, HeadTransf. localEulerAngles. y, 0);
Первая из них считывает движение мыши по оси Y; вторая ограничивает вертикальные движения используя две переменные MinVert и MaxVert, имитируя реальные ограничения головы человека вверх-вниз; третья строка формирует вектор вращения нашей виртуальной головы, т.е. применяет сфомированное вращение.
Общий вид нашей программы теперь такой, сверьте его со своим вариантом:
using UnityEngine;
public class FPCharacter: MonoBehaviour
{
public float speed = 2.0f;
public float speedfast = 50.0f;
public float gravity = -9.8f;
public float SensHoriz = 2.0f;
public float SensVert = 2.0f;
public float MinVert = -70f;
public float MaxVert = 70f;
CharacterController CharControl;
float _speedfast;
Transform HeadTransf;
float RotatX;
void Start ()
{
CharControl = GetComponent <CharacterController> ();
HeadTransf = transform.GetChild (0);
}
void Update ()
{
if (Input.GetKey (KeyCode. LeftShift))
{
_speedfast = speedfast;
}
else
{
_speedfast = 1;
}
float offsetX = Input.GetAxis («Horizontal») * speed * _speedfast;
float offsetZ = Input.GetAxis («Vertical») * speed * _speedfast;
Vector3 movement = new Vector3 (offsetX, 0, offsetZ);
movement = Vector3.ClampMagnitude (movement, speedfast);
movement. y = gravity;
movement *= Time.deltaTime;
movement = transform.TransformDirection (movement);
CharControl.Move (movement);
transform.Rotate (0, Input.GetAxis («Mouse X») * SensHoriz, 0);
RotatX = RotatX – Input.GetAxis («Mouse Y») * SensVert;
RotatX = Mathf.Clamp (RotatX, MinVert, MaxVert);
HeadTransf. localEulerAngles = new Vector3 (RotatX, HeadTransf. localEulerAngles. y, 0);
}
}
Сохраним наш сценарий и переключимся в редактор.
Нажмем кнопку «Пуск» и теперь можно походить по плоскости и покрутить головой используя мышь. Основа нашего персонажа игрока готова.