Aggiunta dell'effetto movimento della testa alla telecamera in Unity

L'effetto Head bobbing è ampiamente utilizzato nei giochi sparatutto in prima persona e svolge un ruolo chiave nell'aumentare l'immersione del giocatore.

In questo tutorial, mostrerò come creare un effetto di dondolamento della testa in Unity.

Passaggio 1: configurare il controller del lettore

Innanzitutto, dobbiamo creare un controller del giocatore:

  • Crea un nuovo oggetto di gioco (Oggetto di gioco -> Crea vuoto) e assegnagli un nome "Player"
  • Crea una nuova capsula (oggetto del gioco -> oggetto 3D -> capsula) e spostala all'interno dell'oggetto "Player"
  • Rimuovi il componente Capsule Collider dalla Capsule e cambia la sua posizione in (0, 1, 0)
  • Sposta la telecamera principale all'interno dell'oggetto "Player" e cambia la sua posizione in (0, 1.64, 0)
  • Crea un nuovo script, chiamalo "SC_CharacterController" e incolla al suo interno il codice qui sotto:

SC_CharacterController.cs

using UnityEngine;

[RequireComponent(typeof(CharacterController))]

public class SC_CharacterController : MonoBehaviour
{
    public float speed = 7.5f;
    public float jumpSpeed = 8.0f;
    public float gravity = 20.0f;
    public Camera playerCamera;
    public float lookSpeed = 2.0f;
    public float lookXLimit = 45.0f;

    CharacterController characterController;
    [HideInInspector]
    public Vector3 moveDirection = Vector3.zero;
    Vector2 rotation = Vector2.zero;

    [HideInInspector]
    public bool canMove = true;

    void Start()
    {
        characterController = GetComponent<CharacterController>();
        rotation.y = transform.eulerAngles.y;
    }

    void Update()
    {
        if (characterController.isGrounded)
        {
            // We are grounded, so recalculate move direction based on axes
            Vector3 forward = transform.TransformDirection(Vector3.forward);
            Vector3 right = transform.TransformDirection(Vector3.right);
            float curSpeedX = canMove ? speed * Input.GetAxis("Vertical") : 0;
            float curSpeedY = canMove ? speed * Input.GetAxis("Horizontal") : 0;
            moveDirection = (forward * curSpeedX) + (right * curSpeedY);

            if (Input.GetButton("Jump") && canMove)
            {
                moveDirection.y = jumpSpeed;
            }
        }

        // Apply gravity. Gravity is multiplied by deltaTime twice (once here, and once below
        // when the moveDirection is multiplied by deltaTime). This is because gravity should be applied
        // as an acceleration (ms^-2)
        moveDirection.y -= gravity * Time.deltaTime;

        // Move the controller
        characterController.Move(moveDirection * Time.deltaTime);

        // Player and Camera rotation
        if (canMove)
        {
            rotation.y += Input.GetAxis("Mouse X") * lookSpeed;
            rotation.x += -Input.GetAxis("Mouse Y") * lookSpeed;
            rotation.x = Mathf.Clamp(rotation.x, -lookXLimit, lookXLimit);
            playerCamera.transform.localRotation = Quaternion.Euler(rotation.x, 0, 0);
            transform.eulerAngles = new Vector2(0, rotation.y);
        }
    }
}
  • Collega lo script SC_CharacterController all'oggetto "Player" (noterai che ha aggiunto anche un altro componente chiamato Character Controller. Cambia il suo valore centrale in (0, 1, 0))
  • Assegna la telecamera principale alla variabile Player Camera in SC_CharacterController

Il controller del lettore è ora pronto:

Passaggio 2: aggiungi l'effetto dondolio della testa

L'effetto dondolamento della testa viene eseguito con l'aiuto di uno script e funziona spostando la telecamera su e giù mentre il giocatore si muove.

  • Crea un nuovo script, chiamalo SC_HeadBobber e incolla al suo interno il codice seguente:

SC_HeadBobber.cs

using UnityEngine;

public class SC_HeadBobber : MonoBehaviour
{
    public float walkingBobbingSpeed = 14f;
    public float bobbingAmount = 0.05f;
    public SC_CharacterController controller;

    float defaultPosY = 0;
    float timer = 0;

    // Start is called before the first frame update
    void Start()
    {
        defaultPosY = transform.localPosition.y;
    }

    // Update is called once per frame
    void Update()
    {
        if(Mathf.Abs(controller.moveDirection.x) > 0.1f || Mathf.Abs(controller.moveDirection.z) > 0.1f)
        {
            //Player is moving
            timer += Time.deltaTime * walkingBobbingSpeed;
            transform.localPosition = new Vector3(transform.localPosition.x, defaultPosY + Mathf.Sin(timer) * bobbingAmount, transform.localPosition.z);
        }
        else
        {
            //Idle
            timer = 0;
            transform.localPosition = new Vector3(transform.localPosition.x, Mathf.Lerp(transform.localPosition.y, defaultPosY, Time.deltaTime * walkingBobbingSpeed), transform.localPosition.z);
        }
    }
}
  • Allega lo script SC_HeadBobber alla fotocamera principale
  • Assegna lo script SC_CharacterController alla variabile "Controller"

Infine, premi Gioca per testarlo, il movimento della telecamera dovrebbe essere attivato in base al movimento del giocatore.

Fonte
📁HeadBobbing.unitypackage5.09 KB
Articoli suggeriti
Aggiunta dell'accovacciamento al lettore FPS in Unity
Creazione del movimento del giocatore in Unity
Telecamera in terza persona in Unity
Controller FPS Unity
Come eseguire il controllo della gru in Unity
Controller per auto per Unity
Tutorial per il salto a muro del giocatore 3D e 2D per Unity