Controler Unity FPS

FPS (sau First-Person Shooter) este un joc în care personajul principal este controlat dintr-o perspectivă la persoana întâi.

Comenzile obișnuite sunt W, A, S și D pentru a merge, Mouse Look pentru a privi în jur, Spațiu pentru a sări și Left Shift pentru a sprinta, permițând jucătorului să se miște liber în jurul nivelului.

În această postare, voi arăta cum să creez un controler FPS în Unity care se va ocupa de rotația camerei și mișcarea jucătorului.

Pași

Pentru a crea un controler FPS, urmați pașii de mai jos:

  • Creați un nou obiect de joc (GameObject -> Create Empty) și denumiți-l "FPSPlayer"
  • Creați o nouă capsulă (GameObject -> 3D Object -> Capsule) și mutați-o în interiorul obiectului "FPSPlayer"
  • Scoateți componenta Capsule Collider din Capsule și schimbați-i poziția în (0, 1, 0)
  • Mutați camera principală în interiorul obiectului "FPSPlayer" și schimbați-i poziția la (0, 1.64, 0)

  • Creați un nou script, numiți-l "SC_FPSController" și inserați codul de mai jos în interiorul acestuia:
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);
        }
    }
}
  • Atașați scriptul SC_FPSController la obiectul "FPSPlayer" (Veți observa că a adăugat și o altă componentă numită Character Controller, schimbați-i valoarea centrală la (0, 1, 0))
  • Atribuiți camera principală variabilei Player Camera în SC_FPSController

Controler Unity FPS

Controlerul FPS este acum gata!