Расширенное перемещение игрока в Unity

В этом уроке мы рассмотрим расширенную механику движения игрока в Unity, включая спринт, приседание и плавную систему камеры. Эти функции добавляют глубину и отточенность управлению игроком, улучшая общий игровой опыт. Мы будем использовать физическую систему Unity для реалистичного движения и взаимодействия.

Подготовка сцены

Прежде чем погрузиться в кодирование, давайте настроим простую сцену с объектом игрока и камерой:

  1. Создайте новый проект Unity.
  2. В иерархии создайте 3D-куб, переименуйте его в Player и масштабируйте его так, чтобы он напоминал персонажа (например, X: 1, Y: 2, Z: 1).
  3. Добавьте компонент Rigidbody к Player и установите свойство Interpolate на Interpolate для плавной физики.
  4. Добавьте компонент Capsule Collider, отрегулируйте его высоту и радиус в соответствии с моделью игрока.
  5. Создайте пустой GameObject, назовите его CameraRig и прикрепите к нему Camera. Расположите камеру позади и немного выше игрока.
  6. Сделайте CameraRig дочерним элементом объекта Player, чтобы отслеживать его движения.

Реализация расширенного движения игрока

Мы реализуем скрипт, который обрабатывает базовые движения, бег, приседание и плавное вращение камеры.

Скрипт движения игрока

using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    public float walkSpeed = 5f;
    public float sprintSpeed = 10f;
    public float crouchSpeed = 2.5f;
    public float jumpForce = 5f;
    public float gravity = 20f;

    public Transform cameraTransform;
    public float lookSensitivity = 2f;
    public float maxLookAngle = 80f;

    private Rigidbody rb;
    private float currentSpeed;
    private bool isCrouching = false;
    private bool isGrounded = false;

    private void Start()
    {
        rb = GetComponent();
        rb.freezeRotation = true; // Prevent the Rigidbody from rotating
    }

    private void Update()
    {
        HandleMovement();
        HandleJumping();
        HandleCrouching();
        HandleCameraRotation();
    }

    private void HandleMovement()
    {
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");

        Vector3 move = transform.right * moveHorizontal + transform.forward * moveVertical;
        move = move.normalized * currentSpeed * Time.deltaTime;

        Vector3 velocity = rb.velocity;
        velocity.x = move.x;
        velocity.z = move.z;
        rb.velocity = velocity;
    }

    private void HandleJumping()
    {
        if (Input.GetButtonDown("Jump") && isGrounded)
        {
            rb.velocity = new Vector3(rb.velocity.x, jumpForce, rb.velocity.z);
        }
    }

    private void HandleCrouching()
    {
        if (Input.GetKeyDown(KeyCode.LeftControl))
        {
            isCrouching = !isCrouching;
            currentSpeed = isCrouching ? crouchSpeed : walkSpeed;
            transform.localScale = new Vector3(1, isCrouching ? 0.5f : 1, 1);
        }

        if (Input.GetKey(KeyCode.LeftShift) && !isCrouching)
        {
            currentSpeed = sprintSpeed;
        }
        else if (!isCrouching)
        {
            currentSpeed = walkSpeed;
        }
    }

    private void HandleCameraRotation()
    {
        float mouseX = Input.GetAxis("Mouse X") * lookSensitivity;
        float mouseY = Input.GetAxis("Mouse Y") * lookSensitivity;

        Vector3 rotation = cameraTransform.localEulerAngles;
        rotation.y += mouseX;
        rotation.x -= mouseY;
        rotation.x = Mathf.Clamp(rotation.x, -maxLookAngle, maxLookAngle);

        cameraTransform.localEulerAngles = rotation;
    }

    private void OnCollisionStay(Collision collision)
    {
        if (collision.gameObject.CompareTag("Ground"))
        {
            isGrounded = true;
        }
    }

    private void OnCollisionExit(Collision collision)
    {
        if (collision.gameObject.CompareTag("Ground"))
        {
            isGrounded = false;
        }
    }
}

Основные характеристики и пояснения

Управление движением и скоростью

Скрипт использует Rigidbody Unity для перемещения игрока, позволяя взаимодействовать на основе физики. Скорость меняется в зависимости от того, идет ли игрок, бежит или приседает. Приседание переключается клавишей LeftControl, а приседание происходит при удержании клавиши LeftShift.

Прыжки

Метод HandleJumping применяет направленную вверх силу, когда игрок нажимает кнопку прыжка (по умолчанию: пробел), при условии, что игрок приземлился. Обнаружение земли обрабатывается проверкой столкновений с объектами, помеченными "Ground".

Управление камерой

Вращение камеры контролируется с помощью мыши, обеспечивая вид от первого или третьего лица в зависимости от положения камеры. Угол обзора фиксируется, чтобы предотвратить чрезмерный наклон, который может дезориентировать игроков.

Заключение

Этот урок дает основу для продвинутого движения игрока в Unity, охватывая различные аспекты, такие как управление на основе физики, спринт, приседание и управление камерой. Эти методы могут быть дополнительно настроены и расширены для соответствия различным игровым жанрам и стилям, улучшая игровой опыт с помощью отзывчивого и реалистичного управления.

Помните, что движение игрока является критически важным аспектом игрового процесса и должно быть тщательно настроено, чтобы обеспечить удовлетворительный игровой опыт. Экспериментируйте с различными значениями и функциями, чтобы найти наилучшую настройку для вашего проекта.