Unity FPS-Controller
FPS (oder Ego-Shooter) ist ein Spiel, bei dem die Hauptfigur aus der Ego-Perspektive gesteuert wird.
Die üblichen Steuerelemente sind W, A, S und D zum Gehen, Mausblick zum Umschauen, Leertaste zum Springen und linke Umschalttaste zum Sprinten, sodass sich der Spieler bewegen frei im Level bewegen kann.
In diesem Beitrag werde ich zeigen, wie man in Unity einen FPS-Controller erstellt, der die Kameradrehung und Spielerbewegungen verwaltet.
Schritte
Um einen FPS-Controller zu erstellen, führen Sie die folgenden Schritte aus:
- Erstellen Sie ein neues Spielobjekt (GameObject -> Leere erstellen) und benennen Sie es "FPSPlayer"
- Erstellen Sie eine neue Kapsel (GameObject -> 3D-Objekt -> Kapsel) und verschieben Sie sie in das "FPSPlayer"-Objekt
- Entfernen Sie die Capsule Collider-Komponente aus der Capsule und ändern Sie ihre Position in (0, 1, 0).
- Bewegen Sie die Hauptkamera in das Objekt "FPSPlayer" und ändern Sie ihre Position in (0, 1,64, 0).
- Erstellen ein neues Skript, nennen Sie es "SC_FPSController" und fügen Sie den folgenden Code 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);
}
}
}
- Hängen Sie das SC_FPSController-Skript an das "FPSPlayer"-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 die Hauptkamera der Player-Kameravariable in SC_FPSController zu
Der FPS-Controller ist jetzt fertig!