Unity 3D Шутер: Движение игрока с Rigidbody

Добавление 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#. В следующем уроке начнём работу над мультиплеером.

Что будем искать? Например,программа