Unity 3D 中的角色控制器碰撞和倾斜

Character Controller collision and slopes in Unity 3D

我正在为第 3 人 platforming/action 游戏制作移动系统。由于角色控制器只是停在倾斜度大于最大倾斜度的倾斜表面上,我已经编写了一些不错的倾斜逻辑,但它遇到了边缘情况。

RaycastHit hit;
Physics.Raycast(transform.position, Vector3.down, out hit);
if (isGrounded)
{
    if (Vector3.Angle(transform.up, hit.normal) > CC.slopeLimit)
    {
        gravVector.x += (1f - hit.normal.y) * hit.normal.x * slideFriction * Time.deltaTime;
        gravVector.z += (1f - hit.normal.y) * hit.normal.z * slideFriction * Time.deltaTime;
        if (gravVector.y > -maxGravity * Vector3.Angle(transform.up, hit.normal) / 90)
        {
            gravVector.y -= Vector3.Angle(transform.up, hit.normal) / 90 * accGravity * Time.deltaTime;
        }
        return gravVector;
    }
    //else gravity is straight down n stuff
}

因为我使用从玩家原点直接向下的 Raycast 来找到玩家所在表面的法线,所以玩家可以滑到斜坡的尽头,而 Capsule 仍然会与斜坡发生碰撞但光线投射要么击中平坦表面,要么什么都没有,玩家会卡在倾斜表面末端的坠落状态。

有没有办法在不使用一些疯狂的球形光线投射系统或其他东西的情况下获得玩家所在表面的法线?我尝试使用角色控制器和玩家周围的一些其他碰撞器来获取接触点,但我就是无法让这些东西起作用。

您可以考虑使用 Physics.SphereCast 投射到更大的区域,例如,您的控制器的胶囊碰撞器的大小。它不是 "some insane spherical raycast system" - 它是 Unity 中相当高效的内置功能,适用于此类情况。