Legger til Crouching til FPS Player i Unity

Å legge til en crouching-mekanisme kan fordype innlevelsen og gi taktisk dybde til spillingen, spesielt i førstepersons- og stealth-baserte spill. Denne veiledningen bygger på vår Unity FPS-kontroller-opplæring, og viser hvordan du legger til en myk hukefunksjon i Unity.

Forutsetninger

Trinn

public bool isCrouching = false;
public float crouchHeight = 0.5f;
public float crouchSpeed = 3.5f;
public float crouchTransitionSpeed = 10f;
private float originalHeight;
public float crouchCameraOffset = -0.5f;
private Vector3 cameraStandPosition;
private Vector3 cameraCrouchPosition;
  • Endre 'Start()'-metoden for å lagre den opprinnelige høyden til 'CharacterController' og angi kameraposisjoner:
void Start()
{
    characterController = GetComponent<CharacterController>();
    originalHeight = characterController.height;

    // Define camera positions for standing and crouching
    cameraStandPosition = playerCamera.transform.localPosition;
    cameraCrouchPosition = cameraStandPosition + new Vector3(0, crouchCameraOffset, 0);

    // Lock cursor
    Cursor.lockState = CursorLockMode.Locked;
    Cursor.visible = false;
}
  • I 'Update()'-metoden, sjekk om du trykker på kroketasten og bytter på 'isCrouching'-variabelen:
if (Input.GetKeyDown(KeyCode.C) && canMove)
{
    isCrouching = !isCrouching;

    if (isCrouching)
    {
        characterController.height = crouchHeight;
        walkingSpeed = crouchSpeed;
    }
    else
    {
        characterController.height = originalHeight;
        walkingSpeed = 7.5f;
    }
}
  • Utenfor forrige blokk implementerer du den jevne overgangen for kameraets posisjon mellom huking og stående:
if (isCrouching)
{
    playerCamera.transform.localPosition = Vector3.Lerp(playerCamera.transform.localPosition, cameraCrouchPosition, crouchTransitionSpeed * Time.deltaTime);
}
else
{
    playerCamera.transform.localPosition = Vector3.Lerp(playerCamera.transform.localPosition, cameraStandPosition, crouchTransitionSpeed * Time.deltaTime);
}
  • Juster spillerens bevegelseshastighet basert på gjeldende tilstand:
float curSpeedX = canMove ? (isRunning ? runningSpeed : (isCrouching ? crouchSpeed : walkingSpeed)) * Input.GetAxis("Vertical") : 0;
float curSpeedY = canMove ? (isRunning ? runningSpeed : (isCrouching ? crouchSpeed : walkingSpeed)) * Input.GetAxis("Horizontal") : 0;

Spørsmål:

  1. Hvorfor bruke 'Vector3.Lerp()' for kameraovergang under huking?: 'Vector3.Lerp()'-funksjonen brukes til å interpolere jevnt mellom to vektorer. I denne sammenhengen lar det kameraet skifte flytende mellom stående og hukende posisjoner i stedet for å knipse brått.
  2. Hva er rollen til 'crouchTransitionSpeed'?: 'crouchTransitionSpeed' bestemmer hvor raskt overgangen mellom huk- og stående kameraposisjoner skjer. En høyere verdi gir en raskere overgang.
  3. Er det mulig å tilpasse krøketasten?: Absolutt. Kroknøkkelen er for øyeblikket satt til 'C' ('KeyCode.C'). Bytt den ut med hvilken som helst 'KeyCode' for å justere krøketasten.

Konklusjon

Å innlemme en myk hukemekaniker i Unity, som innebærer å justere både collider-størrelsen og kameraposisjonen, kan øke spillerens fordypning betydelig. Denne veiledningen har gitt en metode for å oppnå dette med en naturlig, flytende overgang.

Foreslåtte artikler
Legger til Double Jump Support til en 2D Platformer Character Controller i Unity
Legger til Head Bobbing-effekt til kameraet i enhet
Karakterkontroller Hvordan legge til evne til å skyve rigidbodies i enhet
Hvordan legge til Moving Platform Support til Character Controller i Unity
Player 3D og 2D Wall Jump Tutorial for Unity
Rigidbody-basert Planetary Player Controller for Unity
Implementering av Parkour-systemet i Unity