Controller FPS Unity

FPS (o Sparatutto in prima persona) è un gioco in cui il personaggio principale è controllato da una prospettiva in prima persona.

I soliti controlli sono W, A, S e D per camminare, Mouse Guarda per guardarsi intorno, Spazio per saltare e Maiusc sinistro per scattare, consentendo al giocatore di muoversi liberamente attorno al livello.

In questo post mostrerò come realizzare un controller FPS in Unity che gestirà la rotazione della telecamera e il movimento del giocatore.

Passi

Per creare un controller FPS, procedi nel seguente modo:

  • Crea un nuovo oggetto di gioco (GameObject -> Crea vuoto) e assegnagli un nome "FPSPlayer"
  • Crea una nuova capsula (GameObject -> Oggetto 3D -> Capsule) e spostala all'interno dell'oggetto "FPSPlayer"
  • Rimuovi il componente Capsule Collider dalla Capsule e cambia la sua posizione in (0, 1, 0)
  • Sposta la telecamera principale all'interno dell'oggetto "FPSPlayer" e cambia la sua posizione in (0, 1.64, 0)

  • Crea un nuovo script, chiamalo "SC_FPSController" e incolla al suo interno il codice seguente:
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);
        }
    }
}
  • Collega lo script SC_FPSController all'oggetto "FPSPlayer" (noterai che ha aggiunto anche un altro componente chiamato Character Controller, cambia il suo valore centrale in (0, 1, 0))
  • Assegna la videocamera principale alla variabile Player Camera in SC_FPSController

Controller FPS Unity

Il controller FPS è ora pronto!

Articoli suggeriti
Aggiunta dell'accovacciamento al lettore FPS in Unity
Tutorial per il salto a muro del giocatore 3D e 2D per Unity
Controller del personaggio Come aggiungere la capacità di spingere corpi rigidi in Unity
Unity Come creare controlli touch mobili
Come aggiungere il supporto della piattaforma mobile al controller del personaggio in Unity
Controller planetario basato su corpo rigido per l'unità
Creazione del movimento del giocatore in Unity