Contrôleur FPS Unity
FPS (ou First-Person Shooter) est un jeu où le personnage principal est contrôlé à la première personne.
Les commandes habituelles sont W, A, S et D pour marcher, la souris Regard pour regarder autour, Espace pour sauter et Maj gauche pour sprinter, permettant au joueur de se déplacer librement dans le niveau.
Dans cet article, je vais montrer comment créer un contrôleur FPS dans Unity qui gérera la rotation de la caméra et le mouvement du joueur.
Mesures
Pour créer un contrôleur FPS, suivez les étapes ci-dessous:
- Créez un nouvel objet de jeu (GameObject -> Créer vide) et nommez-le "FPSPlayer"
- Créez une nouvelle capsule (GameObject -> Objet 3D -> Capsule) et déplacez-la à l'intérieur de l'objet "FPSPlayer"
- Supprimez le composant Capsule Collider de Capsule et modifiez sa position sur (0, 1, 0)
- Déplacez la caméra principale à l'intérieur de l'objet "FPSPlayer" et modifiez sa position sur (0, 1,64, 0)
- Créez un nouveau script, nommez-le "SC_FPSController" et collez le code ci-dessous à l'intérieur:
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);
}
}
}
- Attachez le script SC_FPSController à l'objet "FPSPlayer" (vous remarquerez qu'il a également ajouté un autre composant appelé Character Controller, changez sa valeur centrale en (0, 1, 0))
- Affecter la caméra principale à la variable Caméra du joueur dans SC_FPSController
Le contrôleur FPS est maintenant prêt !