在Unity中制作3D游戏的玩家控制器时(学校项目),我想让玩家能够跳跃。我想确保玩家只有站在地面上时才能跳跃。为了检查这一点,我制作了一个射线阵列,看看它们是否会与地面碰撞。
// IsGrounded returns false. Rays dont detect ground?
// Ray start is not in Colllider of ground
// Checks if the player is standing on the ground or not
bool IsGrounded ()
{
Ray[] rays = new Ray[4];
{
new Ray(transform.position + (transform.forward * 0.2f) + (Vector3.up * 0.1f), Vector3.down);
new Ray(transform.position + (-transform.forward * 0.2f) + (Vector3.up * 0.1f), Vector3.down);
new Ray(transform.position + (transform.right * 0.2f) + (Vector3.up * 0.1f), Vector3.down);
new Ray(transform.position + (-transform.right * 0.2f) + (Vector3.up * 0.1f), Vector3.down);
};
for (int i = 0; i < rays.Length; i++)
{
if (Physics.Raycast(rays[i], 0.2f, groundLayerMask))
{
Debug.Log("true");//doesnt return true while on ground
return true;
}
}
Debug.Log("false");//returns false while on ground
return false;
}
我曾经问过我的一个朋友,他已经在unity编程很长一段时间了,他说这个脚本很好,应该可以工作。当然,代码可能有错误(因为它没有按预期工作),我们想知道是否是这样/是否有更好的方法来编写这个脚本。
玩家所站的平面是它可以检测到的层的一部分(默认),我的朋友把这个改成了一个专用层,看看“默认层”是不是问题所在。这没有帮助。
他写了一些代码(他层删除:sadface:),其检测到所有4条射线都投射在那里。
光线的起点在我想碰撞的地面上方,他提到有足够的间隙来避免这个问题,因为我把它从原点向上移动了0.1。
最后,控制台向我返回“假”,表明射线没有与地面的网格碰撞,然而我们(我的朋友和我)想不出任何原因。
1条答案
按热度按时间wmvff8tz1#
我不知道你为什么不用sphereCast或者boxCast来解决这个问题,不管怎么说,下面的代码是一个比较简单的例子,你不需要定义数组和冗长复杂的计算,只要把下面的代码作为方法唯一需要的行,并正确设置下面的变量就可以了:
为地面定义一个单独的层并仔细检查角色的尺寸是很重要的。另外,
groundInfo
变量提供了其他有用的信息,如normal和hitPoint。