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 innerhalb des "FPSPlayer"-Objekts
  • 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

Unity FPS-Controller

Der FPS-Controller ist jetzt fertig!

Quelle
📁FPSController.unitypackage53.91 KB