在 Unity 中为 FPS 播放器添加蹲伏功能
添加 蹲伏 机制可以加深沉浸感并为游戏玩法提供战术深度,尤其是在第一人称和潜行游戏中。本指南以我们的 Unity FPS Controller 教程为基础,展示了如何在 Unity 中添加平滑的蹲伏功能。
先决条件
- 基本熟悉Unity 接口。
- 了解 Unity 'CharacterController'。
- Unity FPS 控制器 教程中的 FPS 控制器脚本。
脚步
- 在 Unity FPS Controller 教程中名为 'SC_FPSController' 的 class 中,添加以下变量来处理蹲伏:
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;
问题:
- 为什么在蹲伏期间使用 'Vector3.Lerp()' 进行相机转换?: 'Vector3.Lerp()' 函数用于在两个向量之间平滑插值。在这种情况下,它允许相机在站立和蹲伏位置之间流畅地转换,而不是突然捕捉。
- 'crouchTransitionSpeed' 的作用是什么?: 'crouchTransitionSpeed' 决定了蹲伏和站立相机位置之间的转换速度。值越高,转换速度越快。
- 是否可以自定义蹲伏键?:当然可以。蹲伏键当前设置为 'C' ('KeyCode.C')。将其替换为任何所需的 'KeyCode' 以调整蹲伏键。
结论
在 Unity 中加入平滑的蹲伏机制,其中涉及调整 collider 大小和摄像机位置,可以显着提升玩家的沉浸感。本指南提供了一种通过自然、流畅的过渡来实现这一目标的方法。