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.
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))
- 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.