Camera la persoana a treia in Unity

O Camera pentru persoana a treia este un tip de cameră plasată în spatele jucătorului, de obicei ușor deplasată în lateral, oferind o reprezentare vizuală a nivelului de joc și a jucătorului însuși.

Pentru a realiza o cameră de tip Third-Person Shooter (TPS) în Unity, vom folosi o combinație între o mișcare obișnuită a jucătorului și o vizualizare la persoana a treia.

Sharp Coder Video player

Pasul 1: Creați controlerul jucătorului

Mai întâi, vom crea un controler Player care se va ocupa de rotație și mișcare:

  • Creați un nou obiect de joc (Obiect de joc -> Creați gol) și denumiți-l "Player"
  • Creați o nouă capsulă (Obiect de joc -> Obiect 3D -> Capsulă) și mutați-o în interiorul obiectului "Player"
  • Scoateți componenta Capsule Collider din Capsule și schimbați-i poziția în (0, 1, 0)
  • Creați un nou GameObject și denumiți-l "CameraParent" și mutați-l în interiorul obiectului "Player", schimbați-i poziția în (0, 1.64, 0)
  • Mutați camera principală în interiorul obiectului "CameraParent" și mutați-o în spatele Playerului (În cazul meu, am mutat-o ​​în această poziție: (0.5, 0.6, -2.9))

Camera Persoana a treia in Unity

  • Creați un nou Script, numiți-l SC_TPSController și inserați codul de mai jos în el:

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);
        }
    }
}
  • Atașați scriptul SC_TPSController la obiectul "Player" (Veți observa că a adăugat și o altă componentă numită Character Controller. Schimbați-i valoarea centrală la (0, 1, 0))
  • Atribuiți obiectul "CameraParent" variabilei "Player Camera Parent"

Pasul 2: Adăugați Detectarea coliziunilor camerei

Detectarea coliziunilor Camera va consta într-un script care va verifica dacă există ceva între Cameră și Player și va muta automat Camera mai aproape, împiedicând astfel Camera să se taie printre obiecte.

  • Creați un nou script, numiți-l SC_CameraCollision, apoi inserați codul de mai jos în interiorul acestuia:

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);
        }
    }
}
  • Atașați scriptul SC_CameraCollision la Camera principală
  • Atribuiți obiectul "CameraParent" variabilei "Reference Transform"
  • Modificați valorile "Collision Offset" și "Camera Speed" în cazul în care Camera trece prin pereți

Camera TPS este acum gata, apăsați pe Play pentru a o testa.

Sursă
📁TPSCamera.unitypackage172.07 KB
Articole sugerate
Implementarea sistemului Parkour în Unity
Adăugarea efectului de balansare a capului la cameră în Unity
Controler de jucător RTS și MOBA pentru Unity
Adăugarea ghemuirii la FPS Player în Unity
Controler Unity FPS
Adăugarea suportului pentru salt dublu la un controler de caractere 2D platformer în Unity
Tutorial 3D Worm Controller pentru Unity