Unity3D射线从世界原点而非指定随机点发射问题
问题原因与解决方法
你的代码里Physics.Raycast的第二个参数传错了——这个参数需要的是射线的方向向量,而不是世界坐标点。你现在传的randomPoint + Vector3.down是一个具体的世界位置,Unity会把它当作方向向量处理,这就导致射线的方向变成了从原点指向这个位置,自然会出现你看到的“从(0,0,0)出发”的问题。
要实现“从随机点正下方发射射线”的需求,只需要把方向参数改成Vector3.down即可,这是Unity内置的向下方向向量(对应世界坐标系的-y方向)。
修正后的代码:
public Vector3 GetRandomPositionSpawnable (Vector3 origin, float radius) { Vector3 randomPoint = origin + Random.insideUnitSphere * radius; // 确保随机点在地面上方,避免射线向下无碰撞 randomPoint.y = Mathf.Max(randomPoint.y, 1f); if (Physics.Raycast(randomPoint, Vector3.down, out RaycastHit hit, Mathf.Infinity, LayerMask.GetMask("Scenery"))) { Tools.DebugSphere(randomPoint, 10, Color.yellow); Tools.DebugSphere(hit.point, 20, Color.red); Tools.DebugLine(randomPoint, hit.point, Color.white); return hit.point; } return Vector3.zero; }
额外说明:
- 新增的
randomPoint.y = Mathf.Max(randomPoint.y, 1f)是为了避免随机点生成在地面或地下,导致向下射线没有长度、无法检测到碰撞的情况。 - 如果你的场景高度有限,也可以把
Mathf.Infinity换成一个具体的数值(比如场景最大高度+10),这样性能会更优。
内容的提问来源于stack exchange,提问作者1RobotChicken
相关产品推荐
相关产品推荐

