我正在为第三人称平台/动作游戏制作运动系统。由于角色控制器只是停留在倾斜度大于最大倾斜度的倾斜表面上,因此我已经在其中编写了一些不错的倾斜逻辑,但遇到了边缘情况。
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
}
由于我使用的是从播放器原点开始向下的光线投射,以查找播放器所在表面的法线,因此播放器可以滑动到坡度的末端,并且胶囊仍然会与坡度发生碰撞,但是射线投射要么击中平坦的表面,要么根本不击中任何东西,并且播放器陷入掉落在倾斜表面末端的状态。
有没有一种方法可以在不使用某些疯狂的球形射线投射系统或其他任何东西的情况下获得播放器所在表面的法线?我尝试使用角色控制器和玩家周围的其他对撞机获取联系点,但是我无法使这些东西正常工作。
答案 0 :(得分:1)
您可以考虑使用Physics.SphereCast来投射较大区域,例如控制器的Capsule对撞机的大小。它不是“某种疯狂的球形射线广播系统”,而是Unity中一种相当有效的内置程序,适用于此类情况。