You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 13:10:46