Caméra à la troisième personne dans Unity

Une Caméra à la troisième personne est un type de caméra placée derrière le joueur, généralement légèrement décalée sur le côté, donnant une représentation visuelle du niveau de jeu et du joueur lui-même.

Pour créer une caméra de tir à la troisième personne (TPS) en Unity, nous utiliserons une combinaison d'un mouvement normal du joueur et d'une vue à la troisième personne.

Sharp Coder Lecteur vidéo

Étape 1: Créer le contrôleur de lecteur

Tout d’abord, nous allons créer un contrôleur Player qui gérera la rotation et le mouvement:

  • Créez un nouvel objet de jeu (Objet de jeu -> Créer vide) et nommez-le "Player"
  • Créez une nouvelle capsule (Objet de jeu -> Objet 3D -> Capsule) et déplacez-la à l'intérieur de l'objet "Player"
  • Retirez le composant Capsule Collider de Capsule et changez sa position en (0, 1, 0).
  • Créez un nouveau GameObject et nommez-le "CameraParent" et déplacez-le à l'intérieur de l'objet "Player", changez sa position en (0, 1.64, 0)
  • Déplacez la caméra principale à l'intérieur de l'objet "CameraParent" et déplacez-la derrière le joueur (dans mon cas, je l'ai déplacée vers cette position: (0,5, 0,6, -2,9))

Caméra à la troisième personne dans Unity

  • Créez un nouveau script, appelez-le SC_TPSController et collez-y le code ci-dessous:

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);
        }
    }
}
  • Attachez le script SC_TPSController à l'objet "Player" (vous remarquerez qu'il a également ajouté un autre composant appelé Character Controller. Changez sa valeur centrale en (0, 1, 0))
  • Attribuez l'objet "CameraParent" à la variable "Player Camera Parent"

Étape 2: ajouter la détection de collision de caméra

La détection de collision Camera consistera en un script qui vérifiera s'il y a quelque chose entre la caméra et le lecteur, et rapprochera automatiquement la caméra, empêchant ainsi la caméra de passer à travers les objets.

  • Créez un nouveau script, nommez-le SC_CameraCollision puis collez-y le code ci-dessous:

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);
        }
    }
}
  • Attachez le script SC_CameraCollision à la caméra principale
  • Attribuez l'objet "CameraParent" à la variable "Reference Transform"
  • Ajustez les valeurs "Collision Offset" et "Camera Speed" au cas où la caméra traverserait les murs

La caméra TPS est maintenant prête, appuyez sur Play pour la tester.

Source
TPSCamera.unitypackage172.07 KB