Unity FPS-Controller
FPS (oder First-Person-Shooter) ist ein Spiel, bei dem die Hauptfigur aus der Ich-Perspektive gesteuert wird.
Die üblichen Steuertasten sind W, A, S und D zum Gehen, Mauszeigertaste zum Umsehen, Leertaste zum Springen und linke Umschalttaste zum Sprinten, sodass sich der Spieler frei im Level bewegen kann.
In diesem Beitrag zeige ich, wie man in Unity einen FPS-Controller erstellt, der die Kameradrehung und die Spielerbewegung steuert.
Schritte
Um einen FPS-Controller zu erstellen, befolgen Sie die folgenden Schritte:
- Erstelle ein neues Spielobjekt (GameObject -> Create Empty) und nenne es "FPSPlayer"
- Erstelle eine neue Kapsel (GameObject -> 3D-Objekt -> Kapsel) und verschiebe sie in das "FPSPlayer"-Objekt
- Entfernen Sie die Capsule Collider-Komponente aus Capsule und ändern Sie ihre Position auf (0, 1, 0).
- Bewegen Sie die Hauptkamera in das "FPSPlayer"-Objekt und ändern Sie ihre Position auf (0, 1,64, 0).
- Erstellen Sie ein neues Skript, nennen Sie es "SC_FPSController" und fügen Sie den folgenden Code darin ein:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(CharacterController))]
public class SC_FPSController : MonoBehaviour
{
public float walkingSpeed = 7.5f;
public float runningSpeed = 11.5f;
public float jumpSpeed = 8.0f;
public float gravity = 20.0f;
public Camera playerCamera;
public float lookSpeed = 2.0f;
public float lookXLimit = 45.0f;
CharacterController characterController;
Vector3 moveDirection = Vector3.zero;
float rotationX = 0;
[HideInInspector]
public bool canMove = true;
void Start()
{
characterController = GetComponent<CharacterController>();
// Lock cursor
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
void Update()
{
// We are grounded, so recalculate move direction based on axes
Vector3 forward = transform.TransformDirection(Vector3.forward);
Vector3 right = transform.TransformDirection(Vector3.right);
// Press Left Shift to run
bool isRunning = Input.GetKey(KeyCode.LeftShift);
float curSpeedX = canMove ? (isRunning ? runningSpeed : walkingSpeed) * Input.GetAxis("Vertical") : 0;
float curSpeedY = canMove ? (isRunning ? runningSpeed : walkingSpeed) * Input.GetAxis("Horizontal") : 0;
float movementDirectionY = moveDirection.y;
moveDirection = (forward * curSpeedX) + (right * curSpeedY);
if (Input.GetButton("Jump") && canMove && characterController.isGrounded)
{
moveDirection.y = jumpSpeed;
}
else
{
moveDirection.y = movementDirectionY;
}
// 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)
if (!characterController.isGrounded)
{
moveDirection.y -= gravity * Time.deltaTime;
}
// Move the controller
characterController.Move(moveDirection * Time.deltaTime);
// Player and Camera rotation
if (canMove)
{
rotationX += -Input.GetAxis("Mouse Y") * lookSpeed;
rotationX = Mathf.Clamp(rotationX, -lookXLimit, lookXLimit);
playerCamera.transform.localRotation = Quaternion.Euler(rotationX, 0, 0);
transform.rotation *= Quaternion.Euler(0, Input.GetAxis("Mouse X") * lookSpeed, 0);
}
}
}
- Fügen Sie das Skript SC_FPSController an das Objekt "FPSPlayer" an (Sie werden feststellen, dass auch eine weitere Komponente namens Character Controller hinzugefügt wurde. Ändern Sie deren mittleren Wert in (0, 1, 0)).
- Weisen Sie die Hauptkamera der Player-Kamera-Variable in SC_FPSController zu.
Der FPS-Controller ist jetzt bereit!