You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Raycast将玩家吸附到地面?解决楼梯移动异常

解决下楼梯卡顿跳跃的垂直吸附问题

你当前代码里的这行就是尝试将玩家吸附到地面的逻辑:

transform.position = new Vector3(hit.point.x, hit.point.y + controller.height / 2, hit.point.z);

但直接修改transform.position会绕过CharacterController的内置移动处理,容易导致卡顿或碰撞异常。更稳妥的实现方式有两种:


方法1:用CharacterController.Move实现吸附(推荐)

通过控制器的移动方法来调整位置,保留碰撞检测逻辑:

if (hit.distance < 1.6f)
{
    // 计算需要向下移动的距离:当前位置到地面的距离减去控制器半高,避免穿模
    float moveDownDistance = hit.distance - controller.height / 2;
    // 垂直向下移动玩家
    controller.Move(Vector3.down * moveDownDistance);
    // 重置垂直速度,防止继续下落
    velocity.y = 0;
}

方法2:修正直接赋值位置的逻辑

如果坚持直接修改位置,需要同步更新状态避免后续异常:

if (hit.distance < 1.6f)
{
    transform.position = new Vector3(hit.point.x, hit.point.y + controller.height / 2, hit.point.z);
    // 重置垂直速度,终止下落状态
    velocity.y = 0;
    // 强制更新接地状态,让后续逻辑正确判断
    isGrounded = true;
    wasPreviouslyGrounded = true;
}

另外,你代码里的注释// Velocity will be < 0 only if player is grounded存在错误——玩家空中下落时velocity.y也会小于0,这个判断逻辑需要修正,避免误触发吸附。

内容的提问来源于stack exchange,提问作者RelevantUni98

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 21:52:41