我已经在 Unity 6 中制作了一个 3D 平台游戏,使用 CharacterController 作为人形角色(静态,未使用刚体,虽然我使用了一个单独的球形角色,但这不是本问题的重点)。
问题是经典问题:慢慢地向平台边缘走去,CC 的底部捕捉到角落,角色就...浮在那里。isGrounded vẫn保持为真,因为技术上来说,胶囊仍然接触到某物。我的角色就像尚未看向下方的卡通角色一样在空中振荡。
CC 的设置为半径 0.37,高度 1.76,Y 坐标 0.88,皮肤宽度 0.001,步进偏移 0.1。运动完全是静态的,手动重力,地面时限制到 -2。
我已经尝试了在几乎每个关于这个问题的帖子中找到的解决方案:用自定义地面检查替换 cc.isGrounded。从底部半球 + 一条直线从中心的射线。 如果球形射线击中但直线射线没有击中,我就知道角色中心已经超过了边缘。这部分实际上工作得很好,我使用 Gizmo 展示的边缘状态是正确的。
但是,无法解决的问题是使角色实际上掉落下来。 我正在应用一个基于球形射线击中时的滑动力(Vector3.ProjectOnPlane 等)通过 cc.Move(),但是 CC 自己的碰撞解析器就会吞没它。胶囊正在接触平台边缘,所以 cc.Move() 会说:“不行,不能那样走”并推回。滑动力和碰撞抵消掉,角色就卡在那里。由于技术上讲是着地,所以重力几乎没有作用(限制到 -2)。
所以,我到了一个可以完美检测到边缘但是无法实际做任何事的阶段,因为 CCfighting我。
有没有人在发布的平台游戏中解决过这个问题?是什么方法?在边缘上改变重力?暂时缩小 CC 半径?还是使用 OnControllerColliderHit?或者这是 CC 基本限制,大家都使用刚体/自定义物理学制作平台游戏?
真的不想重写整个运动系统,因为其他一切都工作得很好(斜坡,楼梯,所有我的平台游戏机制)。这几乎是唯一的问题。
评论 (0)