Cámara en tercera persona en Unity

Una Cámara en tercera persona es un tipo de cámara colocada detrás del jugador, generalmente ligeramente desplazada hacia un lado, brindando una representación visual del nivel del juego y del propio jugador.

Para crear una cámara de disparos en tercera persona (TPS) en Unity usaremos una combinación de un movimiento normal del jugador y una vista en tercera persona.

Sharp Coder Reproductor de video

Paso 1: crea el controlador del reproductor

Primero, crearemos un controlador de jugador que se encargará de la rotación y el movimiento:

  • 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)
  • Crea un nuevo GameObject y llámalo "CameraParent" y muévelo dentro del Objeto "Player", cambia su posición a (0, 1.64, 0)
  • Mueve la Cámara Principal dentro del Objeto "CameraParent" y muévela detrás del Reproductor (En mi caso la moví a esta posición: (0.5, 0.6, -2.9))

Cámara en tercera persona en Unity

  • Cree un nuevo script, llámelo SC_TPSController y pegue el siguiente código dentro de él:

SC_TPSController.cs

using UnityEngine;

[RequireComponent(typeof(CharacterController))]

public class SC_TPSController : MonoBehaviour
{
    public float speed = 7.5f;
    public float jumpSpeed = 8.0f;
    public float gravity = 20.0f;
    public Transform playerCameraParent;
    public float lookSpeed = 2.0f;
    public float lookXLimit = 60.0f;

    CharacterController characterController;
    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);
            playerCameraParent.localRotation = Quaternion.Euler(rotation.x, 0, 0);
            transform.eulerAngles = new Vector2(0, rotation.y);
        }
    }
}
  • Adjunte el script SC_TPSController al objeto "Player" (notará que también agregó otro componente llamado Controlador de caracteres. Cambie su valor central a (0, 1, 0))
  • Asigne el objeto "CameraParent" a la variable "Player Camera Parent"

Paso 2: agregar detección de colisiones de cámara

La detección de colisión de Camera consistirá en un script que verificará si hay algo entre la cámara y el reproductor, y automáticamente acercará la cámara, evitando así que la cámara atraviese los objetos.

  • Cree un nuevo script, asígnele el nombre SC_CameraCollision y luego pegue el siguiente código dentro de él:

SC_CameraCollision.cs

using UnityEngine;

public class SC_CameraCollision : MonoBehaviour
{
    public Transform referenceTransform;
    public float collisionOffset = 0.3f; //To prevent Camera from clipping through Objects
    public float cameraSpeed = 15f; //How fast the Camera should snap into position if there are no obstacles

    Vector3 defaultPos;
    Vector3 directionNormalized;
    Transform parentTransform;
    float defaultDistance;

    // Start is called before the first frame update
    void Start()
    {
        defaultPos = transform.localPosition;
        directionNormalized = defaultPos.normalized;
        parentTransform = transform.parent;
        defaultDistance = Vector3.Distance(defaultPos, Vector3.zero);

        //Lock cursor
        Cursor.lockState = CursorLockMode.Locked;
        Cursor.visible = false;
    }

    // LateUpdate is called after Update
    void LateUpdate()
    {
        Vector3 currentPos = defaultPos;
        RaycastHit hit;
        Vector3 dirTmp = parentTransform.TransformPoint(defaultPos) - referenceTransform.position;
        if (Physics.SphereCast(referenceTransform.position, collisionOffset, dirTmp, out hit, defaultDistance))
        {
            currentPos = (directionNormalized * (hit.distance - collisionOffset));

            transform.localPosition = currentPos;
        }
        else
        {
            transform.localPosition = Vector3.Lerp(transform.localPosition, currentPos, Time.deltaTime * cameraSpeed);
        }
    }
}
  • Adjunte el script SC_CameraCollision a la cámara principal
  • Asigne el objeto "CameraParent" a la variable "Reference Transform"
  • Modifique los valores "Collision Offset" y "Camera Speed" en caso de que la cámara atraviese las paredes

La cámara TPS ya está lista, presione Reproducir para probarla.

Fuente
📁TPSCamera.unitypackage172.07 KB
Artículos sugeridos
Implementación del sistema Parkour en Unity
Agregar efecto de movimiento de cabeza a la cámara en Unity
Controlador de reproductor RTS y MOBA para Unity
Agregar agacharse al reproductor FPS en Unity
Tutorial del controlador de gusanos 3D para Unity
Controlador de nave espacial en Unity
Controlador de jugador planetario basado en cuerpo rígido para Unity