在 Unity 中为 FPS 播放器添加蹲伏功能

添加 蹲伏 机制可以加深沉浸感并为游戏玩法提供战术深度,尤其是在第一人称和潜行游戏中。本指南以我们的 Unity FPS Controller 教程为基础,展示了如何在 Unity 中添加平滑的蹲伏功能。

先决条件

脚步

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;
  • 修改'Start()'方法来存储'CharacterController'的原始高度并设置相机位置:
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;
}
  • 'Update()' 方法中,检查蹲伏键按下并切换 'isCrouching' 变量:
if (Input.GetKeyDown(KeyCode.C) && canMove)
{
    isCrouching = !isCrouching;

    if (isCrouching)
    {
        characterController.height = crouchHeight;
        walkingSpeed = crouchSpeed;
    }
    else
    {
        characterController.height = originalHeight;
        walkingSpeed = 7.5f;
    }
}
  • 在上一个块之外,实现相机位置在蹲伏和站立之间的平滑过渡:
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);
}
  • 根据当前状态调整玩家的移动速度:
float curSpeedX = canMove ? (isRunning ? runningSpeed : (isCrouching ? crouchSpeed : walkingSpeed)) * Input.GetAxis("Vertical") : 0;
float curSpeedY = canMove ? (isRunning ? runningSpeed : (isCrouching ? crouchSpeed : walkingSpeed)) * Input.GetAxis("Horizontal") : 0;

问题:

  1. 为什么在蹲伏期间使用 'Vector3.Lerp()' 进行相机转换?'Vector3.Lerp()' 函数用于在两个向量之间平滑插值。在这种情况下,它允许相机在站立和蹲伏位置之间流畅地转换,而不是突然捕捉。
  2. 'crouchTransitionSpeed' 的作用是什么?'crouchTransitionSpeed' 决定了蹲伏和站立相机位置之间的转换速度。值越高,转换速度越快。
  3. 是否可以自定义蹲伏键?:当然可以。蹲伏键当前设置为 'C' ('KeyCode.C')。将其替换为任何所需的 'KeyCode' 以调整蹲伏键。

结论

在 Unity 中加入平滑的蹲伏机制,其中涉及调整 collider 大小和摄像机位置,可以显着提升玩家的沉浸感。本指南提供了一种通过自然、流畅的过渡来实现这一目标的方法。

推荐文章
Unity 如何制作移动触摸控件
Unity FPS 控制器
在 Unity 中向 2D 平台游戏角色控制器添加双跳支持
Unity 汽车控制器
角色控制器如何在 Unity 中添加推动刚体的功能
Unity 玩家 3D 和 2D 墙跳跃教程
在 Unity 中创建玩家运动