Unity FPS-controller

FPS (of First-Person Shooter) is een spel waarin het hoofdpersonage vanuit een first-person perspectief wordt bestuurd.

De gebruikelijke bedieningselementen zijn W, A, S en D om te lopen, Mouse Look om rond te kijken, Spatie om te springen en Linker Shift om te sprinten, waardoor de speler vrij door het level kan bewegen.

In dit bericht laat ik zien hoe je een FPS-controller in Unity maakt die de camerarotatie en de beweging van de speler regelt.

Stappen

Volg onderstaande stappen om een ​​FPS-controller te maken:

  • Maak een nieuw Game Object (GameObject -> Create Empty) en geef het de naam "FPSPlayer"
  • Maak een nieuwe Capsule (GameObject -> 3D Object -> Capsule) en verplaats deze naar binnen in het "FPSPlayer" Object
  • Verwijder het Capsule Collider-component uit Capsule en verander de positie naar (0, 1, 0)
  • Verplaats de hoofdcamera binnen het "FPSPlayer"-object en verander de positie naar (0, 1,64, 0)

  • Maak een nieuw script, noem het "SC_FPSController" en plak de onderstaande code erin:
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);
        }
    }
}
  • Koppel het SC_FPSController-script aan het "FPSPlayer"-object (je zult merken dat er ook een ander onderdeel is toegevoegd, genaamd Character Controller, verander de middelste waarde in (0, 1, 0))
  • Wijs de hoofdcamera toe aan de variabele Player Camera in SC_FPSController

Unity FPS-controller

De FPS-controller is nu klaar!