Tredjepersonskamera i Unity

Et Tredjepersonskamera er en type kamera plassert bak spilleren, vanligvis litt forskjøvet til siden, og gir en visuell representasjon av spillnivået og spilleren selv.

For å lage et Third-Person Shooter (TPS)-kamera i Unity vil vi bruke en kombinasjon av en vanlig spillerbevegelse og en tredjepersonsvisning.

Sharp Coder Videospiller

Trinn 1: Lag spillerkontrolleren

Først vil vi lage en spillerkontroller som vil håndtere rotasjon og bevegelse:

  • Opprett et nytt spillobjekt (Spillobjekt -> Lag tomt) og navngi det "Player"
  • Lag en ny kapsel (spillobjekt -> 3D-objekt -> kapsel) og flytt den inne i "Player"-objektet
  • Fjern Capsule Collider-komponenten fra Capsule og endre dens posisjon til (0, 1, 0)
  • Lag et nytt GameObject og navngi det "CameraParent" og flytt det inn i "Player"-objektet, endre dets posisjon til (0, 1.64, 0)
  • Flytt hovedkameraet inne i "CameraParent"-objektet og flytt det bak spilleren (i mitt tilfelle flyttet jeg det til denne posisjonen: (0.5, 0.6, -2.9))

Tredjepersonskamera i Unity

  • Lag et nytt skript, kall det SC_TPSController, og lim inn koden nedenfor i det:

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);
        }
    }
}
  • Fest SC_TPSController-skriptet til "Player"-objektet (Du vil legge merke til at det også la til en annen komponent kalt Character Controller. Endre senterverdien til (0, 1, 0))
  • Tilordne "CameraParent"-objektet til "Player Camera Parent"-variabelen

Trinn 2: Legg til kamerakollisjonsdeteksjon

Kamera kollisjonsdeteksjon vil bestå av et skript som vil sjekke om det er noe mellom kameraet og spilleren, og vil automatisk flytte kameraet nærmere, og dermed forhindre at kameraet klipper gjennom objektene.

  • Lag et nytt skript, gi det navnet SC_CameraCollision og lim inn koden nedenfor i det:

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);
        }
    }
}
  • Fest SC_CameraCollision-skriptet til hovedkameraet
  • Tilordne "CameraParent"-objektet til "Reference Transform"-variabelen
  • Juster "Collision Offset"- og "Camera Speed"-verdiene i tilfelle kameraet klipper gjennom veggene

TPS-kameraet er nå klart, trykk Play for å teste det.

Kilde
📁TPSCamera.unitypackage172.07 KB
Foreslåtte artikler
Implementering av Parkour-systemet i Unity
Helikopterkontrollør for Unity
Legger til Double Jump Support til en 2D Platformer Character Controller i Unity
Hvordan lage krankontroll i Unity
Bilkontroller for Unity
Karakterkontroller Hvordan legge til evne til å skyve rigidbodies i enhet
Flykontroller for Unity