Unity FPS-controller
FPS (eller First-Person Shooter) er et spil, hvor hovedpersonen styres fra et førstepersonsperspektiv.
De sædvanlige kontroller er W, A, S og D til at gå, Mouse Look til at se sig omkring, Space til at hoppe og Venstre Shift til at spurte, hvilket giver spilleren mulighed for at bevæge sig frit rundt på niveauet.
I dette indlæg vil jeg vise, hvordan man laver en FPS-controller i Unity, der vil håndtere kamerarotation og afspillerbevægelse.
Trin
Følg nedenstående trin for at lave en FPS-controller:
- Opret et nyt spilobjekt (GameObject -> Create Empty) og navngiv det "FPSPlayer"
- Opret en ny kapsel (GameObject -> 3D Object -> Capsule) og flyt den ind i "FPSPlayer" objektet
- Fjern Capsule Collider-komponenten fra Capsule og skift dens position til (0, 1, 0)
- Flyt hovedkameraet inde i "FPSPlayer"-objektet og skift dets position til (0, 1.64, 0)
- Opret et nyt script, navngiv det "SC_FPSController" og indsæt koden nedenfor i det:
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);
}
}
}
- Vedhæft SC_FPSController-scriptet til "FPSPlayer"-objektet (Du vil bemærke, at det også tilføjede en anden komponent kaldet Character Controller, ændre dens midterværdi til (0, 1, 0))
- Tildel hovedkameraet til Player Camera-variablen i SC_FPSController
FPS-controlleren er nu klar!