Raycast 在不同的 Y 位置不返回任何命中
Raycast not returning any hits at different Y position
我发现 Raycast 有一个奇怪的问题。下面代码的基本思想是:当玩家撞到墙上,但按下 F 键时,他们会执行翻墙动作。我进行光线投射以检查它们是否确实撞到了墙而不是其他物体,并且离墙足够近以进行翻转。
所以在第一关,一切都很好。下一个级别,翻转不起作用。最初我认为第二层的墙壁不能有碰撞器或设置为 isTrigger 或其他东西,三重检查一切。然后我在相关代码中添加了大量的 Debug 语句以查看发生了什么,令我惊讶的是在第二层时,Raycast 从未命中任何东西!即使调试射线明显穿过墙壁,其设置方式与第 1 层中的墙壁相同。这是一张洋红色调试射线明显穿过第 2 层墙壁的图像:
左下角是屏幕截图中显示的墙的检查器值,它没有 return 光线投射命中。右下方是 1 层的一堵墙,它确实可以正常工作。您可以看到它们的设置方式完全相同(保存它们的 X 和 Z 比例被翻转,因为它们是不同的方向,但同样的错误也会发生在相同方向的墙壁上)。
基本上,我能辨别出第 1 层和第 2 层的墙壁之间的唯一区别是这些层本身位于不同的 Y 位置,这不会以任何方式影响光线投射。我很困惑为什么它在级别 1 中有效,但在级别 2 或更高级别无效。
if (Input.GetKey(KeyCode.F)){
// Raycast to see if we hit a wall
RaycastHit hit;
Vector3 fwd = transform.TransformDirection(Vector3.forward);
Debug.DrawRay(this.transform.position, fwd, Color.magenta, 2.0f);
if (Physics.Raycast(this.transform.position, fwd, out hit, 2.0f)){
if (hit.collider.gameObject.name.Contains("Wall")){
Debug.LogWarning("WALLFLIP: Attempted wallFlip, raycast did indeed hit a wall!");
// Stuff happens here such as flip animation, not relevant
}
}else{
Debug.LogWarning("WALLFLIP: Raycast hit nothing");
}
}
更新 1: 看到一个建议使用 RaycastAll() 而不是 Raycast() 的 SO 线程。实施时,RaycastAll() return 是第 1 级中长度为 1 的列表,但 return 是第 2 级中的空列表,它确认射线没有击中任何东西,即使 Debug 射线明显击中了。
更新 2: Saw this SO thread 关于在 FixedUpdate() 而不是 Update() 中执行 Raycast 内容。所以我将 WallFlip 代码从 Update 移到 FixedUpdate,没有看到任何变化。在 FixedUpdate 级别 1 工作时,但在级别 2 中没有光线投射命中 returned.
更新 3: 感谢用户 Sharundaar,我现在知道 2 层的地板干扰了 Raycast(见下面他的回答)。仍然对 1 级中没有发生这种情况感到困惑,或者为什么地板没有 return 在 Raycast() 上命中。下面是第 2 层地板游戏对象的检查器(第 1 层地板除了 xyz 位置和 X Z 比例之外是相同的)。我以前从未遇到过非常奇怪的问题,但是嘿,从玩家位置偏移 0.5f Y 的光线投射有效。 *耸肩*
所以从你的来源我设法让它在另一个层面上工作。问题是你的 transform.position 在地下,所以光线投射到地板上而不是墙上(我不太清楚为什么它在第一层特别有效)。
我所做的如下:
Vector3 raycastOffset = new Vector3(0, 0.5f, 0);
if (Physics.Raycast(this.transform.position + raycastOffset, fwd, out hit, 2.0f))
这当然是一个快速修复,您需要进一步调查。
我也变了
Vector3 fwd = transform.TransformDirection(Vector3.forward);
来自
Vector3 fwd = transform.forward;
哪个应该更干净。
经过一些调查,您的问题实际上出在地板实体上,我认为本质上是 MeshCollider 无法很好地计算碰撞,尝试用正确调整的盒子碰撞器替换它,看看它会导致什么你.
我发现 Raycast 有一个奇怪的问题。下面代码的基本思想是:当玩家撞到墙上,但按下 F 键时,他们会执行翻墙动作。我进行光线投射以检查它们是否确实撞到了墙而不是其他物体,并且离墙足够近以进行翻转。
所以在第一关,一切都很好。下一个级别,翻转不起作用。最初我认为第二层的墙壁不能有碰撞器或设置为 isTrigger 或其他东西,三重检查一切。然后我在相关代码中添加了大量的 Debug 语句以查看发生了什么,令我惊讶的是在第二层时,Raycast 从未命中任何东西!即使调试射线明显穿过墙壁,其设置方式与第 1 层中的墙壁相同。这是一张洋红色调试射线明显穿过第 2 层墙壁的图像:
左下角是屏幕截图中显示的墙的检查器值,它没有 return 光线投射命中。右下方是 1 层的一堵墙,它确实可以正常工作。您可以看到它们的设置方式完全相同(保存它们的 X 和 Z 比例被翻转,因为它们是不同的方向,但同样的错误也会发生在相同方向的墙壁上)。
基本上,我能辨别出第 1 层和第 2 层的墙壁之间的唯一区别是这些层本身位于不同的 Y 位置,这不会以任何方式影响光线投射。我很困惑为什么它在级别 1 中有效,但在级别 2 或更高级别无效。
if (Input.GetKey(KeyCode.F)){
// Raycast to see if we hit a wall
RaycastHit hit;
Vector3 fwd = transform.TransformDirection(Vector3.forward);
Debug.DrawRay(this.transform.position, fwd, Color.magenta, 2.0f);
if (Physics.Raycast(this.transform.position, fwd, out hit, 2.0f)){
if (hit.collider.gameObject.name.Contains("Wall")){
Debug.LogWarning("WALLFLIP: Attempted wallFlip, raycast did indeed hit a wall!");
// Stuff happens here such as flip animation, not relevant
}
}else{
Debug.LogWarning("WALLFLIP: Raycast hit nothing");
}
}
更新 1: 看到一个建议使用 RaycastAll() 而不是 Raycast() 的 SO 线程。实施时,RaycastAll() return 是第 1 级中长度为 1 的列表,但 return 是第 2 级中的空列表,它确认射线没有击中任何东西,即使 Debug 射线明显击中了。
更新 2: Saw this SO thread 关于在 FixedUpdate() 而不是 Update() 中执行 Raycast 内容。所以我将 WallFlip 代码从 Update 移到 FixedUpdate,没有看到任何变化。在 FixedUpdate 级别 1 工作时,但在级别 2 中没有光线投射命中 returned.
更新 3: 感谢用户 Sharundaar,我现在知道 2 层的地板干扰了 Raycast(见下面他的回答)。仍然对 1 级中没有发生这种情况感到困惑,或者为什么地板没有 return 在 Raycast() 上命中。下面是第 2 层地板游戏对象的检查器(第 1 层地板除了 xyz 位置和 X Z 比例之外是相同的)。我以前从未遇到过非常奇怪的问题,但是嘿,从玩家位置偏移 0.5f Y 的光线投射有效。 *耸肩*
所以从你的来源我设法让它在另一个层面上工作。问题是你的 transform.position 在地下,所以光线投射到地板上而不是墙上(我不太清楚为什么它在第一层特别有效)。
我所做的如下:
Vector3 raycastOffset = new Vector3(0, 0.5f, 0);
if (Physics.Raycast(this.transform.position + raycastOffset, fwd, out hit, 2.0f))
这当然是一个快速修复,您需要进一步调查。
我也变了
Vector3 fwd = transform.TransformDirection(Vector3.forward);
来自
Vector3 fwd = transform.forward;
哪个应该更干净。
经过一些调查,您的问题实际上出在地板实体上,我认为本质上是 MeshCollider 无法很好地计算碰撞,尝试用正确调整的盒子碰撞器替换它,看看它会导致什么你.