Movimento avanzato dei giocatori in Unity

In questo tutorial esploreremo le meccaniche avanzate di movimento dei giocatori in Unity, tra cui sprint, accovacciamento e un sistema di telecamere fluido. Queste funzionalità aggiungono profondità e raffinatezza ai controlli dei giocatori, migliorando l'esperienza di gioco complessiva. Utilizzeremo il sistema di fisica di Unity per movimenti e interazioni realistici.

Impostazione della scena

Prima di immergerci nella codifica, impostiamo una scena di base con un oggetto giocatore e una telecamera:

  1. Crea un nuovo progetto Unity.
  2. Nella Gerarchia, crea un Cubo 3D, rinominalo Giocatore e ridimensionalo in modo che assomigli a un personaggio (ad esempio, X: 1, Y: 2, Z: 1).
  3. Aggiungere un componente Rigidbody al Player e impostare la proprietà Interpolate su Interpolate per una fisica fluida.
  4. Aggiungi un componente Capsule Collider, regolane l'altezza e il raggio in modo che corrispondano al modello del player.
  5. Crea un GameObject vuoto, chiamalo CameraRig e collegagli una Camera. Posiziona la telecamera dietro e leggermente sopra il giocatore.
  6. Rendi CameraRig un figlio dell'oggetto Player per seguirne i movimenti.

Implementazione del movimento avanzato dei giocatori

Implementeremo uno script che gestisce i movimenti di base, gli sprint, gli accovacciamenti e la rotazione fluida della telecamera.

Script di movimento del giocatore

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

Caratteristiche principali e spiegazione

Controllo del movimento e della velocità

Lo script usa Rigidbody di Unity per muovere il giocatore, consentendo interazioni basate sulla fisica. La velocità varia a seconda che il giocatore stia camminando, correndo o accovacciato. Accovacciarsi è attivato con il tasto LeftControl e lo sprint avviene tenendo premuto il tasto LeftShift.

Saltare

Il metodo HandleJumping applica una forza verso l'alto quando il giocatore preme il pulsante di salto (predefinito: barra spaziatrice), dato che il giocatore è a terra. Il rilevamento del terreno è gestito controllando le collisioni con gli oggetti contrassegnati con "Ground".

Controllo della telecamera

La rotazione della telecamera è controllata tramite il mouse, offrendo una prospettiva in prima o terza persona in base al posizionamento della telecamera. L'angolo di visuale è bloccato per evitare un'inclinazione eccessiva, che può disorientare i giocatori.

Conclusione

Questo tutorial fornisce le basi per il movimento avanzato del giocatore in Unity, coprendo vari aspetti come il controllo basato sulla fisica, lo sprint, l'accovacciamento e la gestione della telecamera. Queste tecniche possono essere ulteriormente personalizzate ed espanse per adattarsi a diversi generi e stili di gioco, migliorando l'esperienza del giocatore con controlli reattivi e realistici.

Ricorda, il movimento del giocatore è un aspetto critico del gameplay e dovrebbe essere regolato attentamente per garantire un'esperienza di gioco soddisfacente. Sperimenta valori e funzionalità diverse per trovare la configurazione migliore per il tuo progetto.