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.