Lägger till Crouching till FPS Player i Unity

Att lägga till en hukande-mekanism kan fördjupa nedsänkningen och ge taktiskt djup till spelet, särskilt i förstapersons- och stealth-baserade spel. Den här guiden bygger på vår Unity FPS Controller handledning och visar hur du lägger till en smidig hukfunktion i Unity.

Förutsättningar

Steg

  • I klassen med namnet 'SC_FPSController', från handledningen Unity FPS Controller, lägg till följande variabler för att hantera hukning:
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;
  • Ändra metoden 'Start()' för att lagra den ursprungliga höjden på 'CharacterController' och ställ in kamerapositioner:
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 metoden 'Update()' kontrollerar du om du trycker på hukningstangenten och växlar variabeln 'isCrouching':
if (Input.GetKeyDown(KeyCode.C) && canMove)
{
    isCrouching = !isCrouching;

    if (isCrouching)
    {
        characterController.height = crouchHeight;
        walkingSpeed = crouchSpeed;
    }
    else
    {
        characterController.height = originalHeight;
        walkingSpeed = 7.5f;
    }
}
  • Utanför det föregående blocket, implementera den mjuka övergången för kamerans position mellan hukande och 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);
}
  • Justera spelarens rörelsehastighet baserat på det aktuella tillståndet:
float curSpeedX = canMove ? (isRunning ? runningSpeed : (isCrouching ? crouchSpeed : walkingSpeed)) * Input.GetAxis("Vertical") : 0;
float curSpeedY = canMove ? (isRunning ? runningSpeed : (isCrouching ? crouchSpeed : walkingSpeed)) * Input.GetAxis("Horizontal") : 0;

Frågor:

  1. Varför använda 'Vector3.Lerp()' för kameraövergång under hukning?: Funktionen 'Vector3.Lerp()' används för att interpolera smidigt mellan två vektorer. I detta sammanhang gör det att kameran kan växla flytande mellan stående och hukande positioner istället för att knäppa plötsligt.
  2. Vilken roll har 'crouchTransitionSpeed'?: 'crouchTransitionSpeed' avgör hur snabbt övergången mellan hukande och stående kamerapositioner sker. Ett högre värde ger en snabbare övergång.
  3. Är det möjligt att anpassa huknyckeln?: Absolut. Huknyckeln är för närvarande inställd på 'C' ('KeyCode.C'). Byt ut den mot valfri 'KeyCode' för att justera huknyckeln.

Slutsats

Att införliva en mjuk hukande mekanik i Unity, vilket innebär att justera både collider storlek och kameraposition, kan avsevärt höja spelarens fördjupning. Denna guide har gett en metod för att uppnå detta med en naturlig, flytande övergång.

Föreslagna artiklar
Character Controller Hur man lägger till förmåga att pusha stela kroppar i enhet
Hur man lägger till stöd för rörlig plattform till karaktärskontrollern i Unity
Lägger till Head Bobbing-effekt till kameran i enhet
Lägga till stöd för dubbla hopp till en 2D Platformer Character Controller i Unity
Rigidbody-baserad Planetary Player Controller for Unity
Top-Down Player Controller Handledning för Unity
Implementera Parkour System i Unity