Tredjepersonskamera i Unity

En Tredjepersonskamera är en typ av kamera placerad bakom spelaren, vanligtvis något förskjuten åt sidan, vilket ger en visuell representation av spelnivån och spelaren själv.

För att göra en Third-Person Shooter (TPS) kamera i Unity kommer vi att använda en kombination av en vanlig spelarrörelse och en tredjepersonsvy.

Sharp Coder Videospelare

Steg 1: Skapa Player Controller

Först skapar vi en spelarkontroller som hanterar rotation och rörelse:

  • Skapa ett nytt spelobjekt (Spelobjekt -> Skapa tomt) och namnge det "Player"
  • Skapa en ny kapsel (spelobjekt -> 3D-objekt -> kapsel) och flytta den inuti "Player"-objektet
  • Ta bort Capsule Collider-komponenten från Capsule och ändra dess position till (0, 1, 0)
  • Skapa ett nytt GameObject och namnge det "CameraParent" och flytta det inuti "Player"-objektet, ändra dess position till (0, 1.64, 0)
  • Flytta huvudkameran inuti "CameraParent"-objektet och flytta den bakom spelaren (I mitt fall flyttade jag den till denna position: (0.5, 0.6, -2.9))

Tredjepersonskamera i Unity

  • Skapa ett nytt skript, kalla det SC_TPSController och klistra in koden nedan 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);
        }
    }
}
  • Bifoga SC_TPSController-skriptet till "Player"-objektet (Du kommer att märka att det också lade till en annan komponent som heter Character Controller. Ändra dess mittvärde till (0, 1, 0))
  • Tilldela "CameraParent"-objektet till variabeln "Player Camera Parent"

Steg 2: Lägg till kamerakollisionsdetektion

Kamera kollisionsdetektering kommer att bestå av ett skript som kontrollerar om det finns något mellan kameran och spelaren, och kommer automatiskt att flytta kameran närmare, vilket förhindrar kameran från att klippa igenom objekten.

  • Skapa ett nytt skript, döp det till SC_CameraCollision och klistra sedan in koden nedan 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);
        }
    }
}
  • Bifoga SC_CameraCollision-skriptet till huvudkameran
  • Tilldela "CameraParent"-objektet till variabeln "Reference Transform"
  • Justera värdena "Collision Offset" och "Camera Speed" om kameran klipper igenom väggarna

TPS-kameran är nu klar, tryck på Play för att testa den.

Källa
📁TPSCamera.unitypackage172.07 KB
Föreslagna artiklar
Implementera Parkour System i Unity
Helikopterkontroller för Unity
Lägga till stöd för dubbla hopp till en 2D Platformer Character Controller i Unity
Hur man gör krankontroll i Unity
Bilkontroller för Unity
Character Controller Hur man lägger till förmåga att pusha stela kroppar i enhet
Flygplanskontroller för Unity