Добавление Rigidbody и настройка физики
Добавьте к игроку компонент Rigidbody. Rigidbody добавляет физику, обеспечивая взаимодействие с другими объектами. Игрок не будет проходить сквозь твердые объекты. Например, с включенной галочкой Use Gravity игрок будет подвержен гравитации и падать вниз, оставаясь на твердой поверхности. В данном уроке игрок будет левитировать, поэтому отключите гравитацию, убрав галочку Use Gravity. Заморозьте вращение Rigidbody по координатам X, Y и Z (Freeze Rotation). Это необходимо, так как вращение будет осуществляться с помощью мыши: движение мыши влево/вправо/вверх/вниз будет соответствовать повороту игрока.
Создание скриптов Player Motor и Player Controller
Создайте два скрипта: Player Motor и Player Controller. Player Controller будет отслеживать действия пользователя (направление движения и поворота), а Player Motor будет применять эти действия к игроку. Рекомендуется создать папку Scripts для организации проекта.
Скрипт Player Motor
Откройте скрипт Player Motor в MonoDevelop или Visual Studio. Необходим только using UnityEngine;.
Переменные и функции
- private float speed = 5f; — переменная скорости движения, объявленная с атрибутом [SerializeField] для редактирования в Unity.
- private PlayerMotor motor; — переменная для доступа к скрипту PlayerMotor.
- void Start() — функция, присваивающая значение переменной motor с помощью GetComponent<PlayerMotor>();. Использование RequireComponent в PlayerMotor гарантирует наличие компонента и исключает проверку на null.
- void Update() — функция считывания данных от пользователя (Input.GetAxisRaw(«Horizontal») и Input.GetAxisRaw(«Vertical»)). Значения Horizontal и Vertical берутся из настроек Unity (Edit > Project Settings > Input). Они варьируются от -1 до 1.
- Vector3 moveHorizontal = transform.right * xMove; — вычисление горизонтального вектора движения.
- Vector3 moveVertical = transform.forward * zMove; — вычисление вертикального вектора движения.
- Vector3 velocity = (moveHorizontal + moveVertical).normalized * speed; — объединение векторов и нормализация для получения вектора с длиной 1, умноженного на скорость.
- motor.Move(velocity); — вызов функции Move в скрипте Player Motor.
Скрипт Player Motor
В скрипте Player Motor создайте:
- private Rigidbody rb; — переменная для компонента Rigidbody.
- private Vector3 velocity = Vector3.zero; — переменная для скорости движения.
- void Start() — функция, присваивающая значение переменной rb с помощью GetComponent<Rigidbody>();. Использование RequireComponent гарантирует наличие компонента.
- public void Move(Vector3 _velocity) — функция, принимающая вектор скорости и присваивающая его переменной velocity.
- void FixedUpdate() — функция, вызываемая каждые 0.02 секунды, используемая для физики. Вызывает функцию PerformMovement.
- void PerformMovement() — функция, проверяющая, не равен ли вектор скорости нулю. Если не равен, перемещает объект с помощью rb.MovePosition(rb.position + velocity * Time.fixedDeltaTime);.
Добавление Box Collider к объектам сцены
Для предотвращения прохождения игрока сквозь объекты добавьте компонент Box Collider к объектам сцены. Для других типов объектов (сферы, капсулы и т.д.) используйте соответствующие коллайдеры.
Добавление поворота с помощью мыши
Добавим возможность поворачивать игрока с помощью мыши.
Переменные и функции в Player Controller
- [SerializeField] private float lookSpeed = 3f; — переменная для скорости поворота.
- float yRot; — переменная для хранения значения поворота по оси Y.
- Vector3 rotation; — переменная для вектора поворота.
- motor.Rotate(rotation); — вызов функции Rotate в Player Motor.
Функция Rotate в Player Motor
- public void Rotate(Vector3 _rotation) — применяет поворот к игроку с использованием кватернионов.
Добавление поворота камеры вверх/вниз
Добавим возможность поворачивать камеру вверх/вниз. В скрипте Player Controller:
- [SerializeField] private Transform cam; — переменная для ссылки на камеру (перетащите камеру в поле в инспекторе).
- float xRot; — переменная для хранения значения поворота по оси X.
- Vector3 camRotation; — переменная для вектора поворота камеры.
- cam.Rotate(camRotation); — применение поворота к камере.
В этом уроке реализованы базовые механики движения и поворота игрока в 3D шутере, используя Unity и скрипты C#. В следующем уроке начнём работу над мультиплеером.