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

如何让角色控制器贴合地面?解决地形移动与跳跃异常问题

角色地面贴合与移动异常问题

我通过Raycast检测地面角度,利用verticalVelocity向下推动角色实现地面贴合效果,但遇到一系列移动异常问题:

  • 上下楼梯时无法正常跳跃,添加if (!Input("Jump"))判断和0.3秒groundedTimer后仍有异常
  • 场景初始化时角色未被判定为地面状态,触发下落动画,临时在Start()中设置isGrounded = true;可解决但并非合理方案
  • 下楼梯时角色会先腾空再下落
  • 已解决基础跳跃问题,但上楼梯时跳跃距离大幅缩短(推测是上坡导致);斜坡/楼梯底部Raycast无法检测到地面,isGrounded反复变为false,导致角色反复弹跳
  • 不确定Raycast或SphereCast在复杂地形(粗糙地形、曲面物体)、楼梯/斜坡底部等场景的表现:替换为SphereCast会误触物体边缘;使用图层检测效果不稳定,添加隐形碰撞体的方案存疑

当前核心实现代码:

if (Physics.Raycast(transform.position, -transform.up, out RaycastHit hit, 1.3f))
{
    float angle = Vector3.Angle(Vector3.up, hit.normal);

    if (angle > 0.1f)
    {
        hitNormal = hit.normal;
        velocity.y = -15f; // 让角色贴合地面
    }
    else
    {
        hitNormal = Vector3.up;
    }
}
else
{
    hitNormal = Vector3.up;
}

if (!isGrounded)
{
    Debug.Log(isGrounded);
}

实用解决方案

1. 替换单一Raycast为多检测组合

单一Raycast极易在斜坡底部、楼梯缝隙处漏检,改用多射线+SphereCast组合检测覆盖角色底部区域:

  • SphereCast设置:半径取角色胶囊体半径的80%,检测起点设为胶囊体底部上方0.1f处,方向向下,避免误触物体边缘
  • 补充3-4条射线:从角色底部前后左右四个方向向下发射,填补SphereCast的盲区(比如楼梯台阶垂直面)
  • 只要任意检测命中地面图层,就判定isGrounded = true,同时记录所有命中法线的加权平均值,让角色贴合更平滑

2. 动态调整地面贴合的垂直速度

不要直接硬设velocity.y = -15f,改为根据地面距离平滑调整:

// 预先定义胶囊体底部到transform.position的偏移量capsuleBottomOffset
float groundGap = hit.distance - capsuleBottomOffset;
if (groundGap > 0.01f && !Input.GetButton("Jump"))
{
    // 平滑拉向地面,速度随间隙增大而提升
    velocity.y = Mathf.MoveTowards(velocity.y, -25f, Time.deltaTime * 60f);
}
else if (isGrounded && !Input.GetButton("Jump"))
{
    // 贴合地面时仅保留微小向下力,不干扰跳跃
    velocity.y = Mathf.Max(velocity.y, -0.3f);
}
  • 仅在未触发跳跃且isGrounded为true时应用贴合逻辑,跳跃时完全释放垂直方向的约束

3. 修正初始地面状态判定

不要直接在Start()中赋值isGrounded = true,改为初始执行一次可靠检测:

void Start()
{
    LayerMask groundLayer = LayerMask.GetMask("Ground");
    // 用SphereCast做初始检测,覆盖角色底部区域
    if (Physics.SphereCast(transform.position - Vector3.up * capsuleBottomOffset, capsuleRadius * 0.8f, -Vector3.up, out _, 0.6f, groundLayer))
    {
        isGrounded = true;
    }
}

4. 解决上坡时跳跃距离缩短问题

跳跃时固定使用世界空间的向上力,避免地面法线干扰:

  • 跳跃逻辑直接设置velocity.y = jumpForce,不要将跳跃力沿地面法线分解
  • 空中移动阶段保留完整的水平速度,不因为斜坡法线调整水平方向的速度分量

5. 消除斜坡/楼梯底部的弹跳问题

  • 将groundedTimer时长延长至0.5秒,短暂漏检时维持isGrounded状态
  • 当检测到地面丢失时,先判断角色垂直速度是否向下,若是则延迟0.2秒再切换isGrounded为false,避免楼梯底部的短暂腾空触发弹跳

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 04:57:36