Adicionando efeito de balanço de cabeça à câmera no Unity

O efeito Balançar a cabeça é amplamente utilizado em jogos de tiro em primeira pessoa e desempenha um papel fundamental no aumento da imersão do jogador.

Neste tutorial, mostrarei como criar um efeito de balançar a cabeça em Unity.

Etapa 1: configurar o controlador do player

Primeiro, precisamos criar um controlador de player:

  • Crie um novo Objeto de Jogo (Objeto de Jogo -> Criar Vazio) e nomeie-o "Player"
  • Crie uma nova Cápsula (Objeto de Jogo -> Objeto 3D -> Cápsula) e mova-a para dentro do Objeto "Player"
  • Remova o componente Capsule Collider da Capsule e mude sua posição para (0, 1, 0)
  • Mova a câmera principal dentro do objeto "Player" e mude sua posição para (0, 1,64, 0)
  • Crie um novo script, nomeie-o "SC_CharacterController" e cole o código abaixo dentro dele:

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);
        }
    }
}
  • Anexe o script SC_CharacterController ao objeto "Player" (você notará que ele também adicionou outro componente chamado Character Controller. Mude seu valor central para (0, 1, 0))
  • Atribua a câmera principal à variável Player Camera em SC_CharacterController

O controlador do Player agora está pronto:

Etapa 2: adicionar efeito de balanço de cabeça

O efeito Head Bobbing é feito com a ajuda de um script e funciona movendo a câmera para cima e para baixo quando o jogador está se movendo.

  • Crie um novo script, nomeie-o como SC_HeadBobber e cole o código abaixo dentro dele:

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);
        }
    }
}
  • Anexe o script SC_HeadBobber à câmera principal
  • Atribuir o script SC_CharacterController à variável "Controller"

Por fim, pressione Play para testar, o balanço da câmera deve ser ativado no movimento do jogador.

Fonte
📁HeadBobbing.unitypackage5.09 KB
Artigos sugeridos
Adicionando suporte de salto duplo a um controlador de personagem de plataforma 2D no Unity
Adicionando agachamento ao FPS Player no Unity
Tutorial de lanterna para Unity
Tutorial do controlador Worm 3D para Unity
Câmera de terceira pessoa no Unity
Controlador de helicóptero para Unity
Controlador de carro para Unity