Agregar efecto de movimiento de cabeza a la cámara en Unity

El efecto de movimiento de cabeza se utiliza ampliamente en los juegos de disparos en primera persona y desempeña un papel clave a la hora de aumentar la inmersión del jugador.

En este tutorial, mostraré cómo crear un efecto de movimiento de cabeza en Unity.

Paso 1: configurar el controlador del reproductor

Primero, necesitamos crear un controlador de jugador:

  • Crea un nuevo objeto de juego (Objeto de juego -> Crear vacío) y asígnale un nombre "Player"
  • Crea una nueva Cápsula (Objeto de juego -> Objeto 3D -> Cápsula) y muévela dentro del Objeto "Player"
  • Retire el componente Capsule Collider de Capsule y cambie su posición a (0, 1, 0)
  • Mueva la cámara principal dentro del objeto "Player" y cambie su posición a (0, 1.64, 0)
  • Cree un nuevo script, asígnele el nombre "SC_CharacterController" y pegue el siguiente código dentro de él:

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);
        }
    }
}
  • Adjunte el script SC_CharacterController al objeto "Player" (notará que también agregó otro componente llamado Controlador de caracteres. Cambie su valor central a (0, 1, 0))
  • Asigne la cámara principal a la variable Cámara del reproductor en SC_CharacterController

El controlador del reproductor ya está listo:

Paso 2: agregue el efecto de balanceo de la cabeza

El efecto Head Bobbing se realiza con la ayuda de un guión y funciona moviendo la cámara hacia arriba y hacia abajo cuando el jugador se mueve.

  • Cree un nuevo script, asígnele el nombre SC_HeadBobber y pegue el siguiente código en su interior:

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);
        }
    }
}
  • Adjunte el script SC_HeadBobber a la cámara principal
  • Asigne el script SC_CharacterController a la variable "Controller"

Finalmente, presiona Reproducir para probarlo; el movimiento de la cámara debe activarse al moverse el jugador.

Fuente
📁HeadBobbing.unitypackage5.09 KB
Artículos sugeridos
Agregar agacharse al reproductor FPS en Unity
Cámara en tercera persona en Unity
Creando movimiento de jugadores en unidad
Joystick móvil de entrada táctil en Unity
Controlador de helicóptero para Unity
Controlador de coche para Unity
Controlador de personajes Cómo agregar la capacidad de empujar cuerpos rígidos en Unity