Third-Person-Kamera in Unity

Eine Third-Person-Kamera ist eine Art Kamera, die hinter dem Spieler platziert wird, normalerweise leicht zur Seite verschoben, und eine visuelle Darstellung des Spiellevels und des Spielers selbst liefert.

Um in Unity eine Third-Person-Shooter-Kamera (TPS) zu erstellen, verwenden wir eine Kombination aus einer regulären Spielerbewegung und einer Third-Person-Ansicht.

Sharp Coder Videoplayer

Schritt 1: Erstellen Sie den Player-Controller

Zuerst erstellen wir einen Player-Controller, der Drehung und Bewegung übernimmt:

  • Erstellen Sie ein neues Spielobjekt (Spielobjekt -> Leer erstellen) und benennen Sie es "Player"
  • Erstellen Sie eine neue Kapsel (Spielobjekt -> 3D-Objekt -> Kapsel) und verschieben Sie sie in das "Player"-Objekt
  • Entfernen Sie die Capsule Collider-Komponente aus der Capsule und ändern Sie ihre Position in (0, 1, 0).
  • Erstellen Sie ein neues GameObject, nennen Sie es "CameraParent", verschieben Sie es in das "Player"-Objekt und ändern Sie seine Position in (0, 1,64, 0).
  • Bewegen Sie die Hauptkamera in das Objekt "CameraParent" und hinter den Player (in meinem Fall habe ich sie an diese Position verschoben: (0,5, 0,6, -2,9))

Third-Person-Kamera in Unity

  • Erstellen ein neues Skript, nennen Sie es SC_TPSController und fügen Sie den folgenden Code ein:

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);
        }
    }
}
  • Hängen Sie das SC_TPSController-Skript an das "Player"-Objekt an (Sie werden feststellen, dass es auch eine weitere Komponente namens „Character Controller“ hinzugefügt hat. Ändern Sie den Mittelwert in (0, 1, 0))
  • Weisen Sie das Objekt "CameraParent" der Variablen "Player Camera Parent" zu

Schritt 2: Kamerakollisionserkennung hinzufügen

Die Kamera-Kollisionserkennung besteht aus einem Skript, das prüft, ob sich etwas zwischen der Kamera und dem Player befindet, und die Kamera automatisch näher heranbewegt, um so zu verhindern, dass die Kamera die Objekte durchschneidet.

  • Erstellen Sie ein neues Skript, nennen Sie es SC_CameraCollision und fügen Sie dann den folgenden Code ein:

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);
        }
    }
}
  • Hängen Sie das SC_CameraCollision-Skript an die Hauptkamera an
  • Weisen Sie das Objekt "CameraParent" der Variablen "Reference Transform" zu
  • Passen Sie die Werte "Collision Offset" und "Camera Speed" an, falls die Kamera durch die Wände schneidet

Die TPS-Kamera ist jetzt bereit. Drücken Sie „Play“, um sie zu testen.

Quelle
📁TPSCamera.unitypackage172.07 KB
Empfohlene Artikel
Implementierung des Parkour-Systems in Unity
Hubschrauber-Controller für Unity
Hinzufügen von Double Jump-Unterstützung zu einem 2D-Platformer-Charakter-Controller in Unity
So erstellen Sie eine Kransteuerung in Unity
Auto-Controller für Unity
Charakter-Controller So fügen Sie die Fähigkeit hinzu, starre Körper in Einheit zu schieben
Flugzeugcontroller für Unity