Розширений рух гравця в Unity

У цьому підручнику ми дослідимо просунуту механіку руху гравців у Unity, зокрема спринт, присідання та плавну систему камери. Ці функції додають глибини й досконалості елементам керування гравцем, покращуючи загальний досвід гри. Ми будемо використовувати фізичну систему Unity для реалістичного руху та взаємодії.

Налаштування сцени

Перш ніж зануритися в кодування, давайте налаштуємо базову сцену з об’єктом гравця та камерою:

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

Реалізація просунутого руху гравця

Ми запровадимо сценарій, який оброблятиме основні рухи, спринт, присідання та плавне обертання камери.

Скрипт PlayerMovement

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;
        }
    }
}

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

Контроль руху та швидкості

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

Стрибки

Метод HandleJumping застосовує силу вгору, коли гравець натискає кнопку стрибка (за замовчуванням: пробіл), враховуючи, що гравець знаходиться на землі. Виявлення землі обробляється шляхом перевірки зіткнень з об'єктами з тегом "Ground".

Керування камерою

Обертанням камери керують за допомогою миші, забезпечуючи перспективу від першої чи третьої особи залежно від положення камери. Кут огляду обмежений, щоб запобігти надмірному нахилу, який може дезорієнтувати гравців.

Висновок

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

Пам’ятайте, що рух гравця є критично важливим аспектом ігрового процесу, і його слід ретельно налаштовувати, щоб забезпечити задоволення гравцям. Експериментуйте з різними значеннями та функціями, щоб знайти найкраще налаштування для вашого проекту.