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

Unity物体旋转后360度环形Raycast变圆锥问题的解决方法

问题根源

你当前代码的四元数变换顺序错误,导致射线方向计算逻辑不符合预期:
原代码中Quaternion.Euler(0, i, 0) * transform.forward的逻辑是:先取物体当前的正前方向量,再给这个向量叠加一个绕世界坐标系Y轴旋转i度的变换。当物体自身存在俯仰(X轴旋转)、滚转(Z轴旋转)时,所有旋转生成的射线方向都会被约束在以物体forward为轴的圆锥面上,原本的圆形射线阵列就会收缩变形。

修复代码

根据你需要的射线跟随逻辑二选一即可:

方案1:射线阵列跟随物体自身坐标系旋转(始终在物体本地水平面360度分布)

适合做物体自身周围的全方位检测,比如角色周身伤害判定、周围交互物检测,物体怎么转射线阵列就怎么转,永远保持正圆形。

Transform selfTrans = transform;
float rayLength = 2f;
for (float i = 0; i < 360; i++)
{
    // 先在本地坐标系生成绕自身Y轴的方向,再整体转换到世界空间
    Vector3 rayDir = selfTrans.rotation * Quaternion.Euler(0, i, 0) * Vector3.forward;
    Debug.DrawRay(selfTrans.position, rayDir * rayLength, Color.red, 1f);
}

方案2:射线阵列始终平行于世界水平面(不受物体俯仰/滚转影响)

适合做固定水平面的检测,比如地面周围的触发检测,不管物体怎么抬头低头、翻滚,射线永远在平行于地面的平面上呈正圆形分布。

Transform selfTrans = transform;
float rayLength = 2f;
for (float i = 0; i < 360; i++)
{
    // 直接基于世界坐标系生成水平方向,不叠加物体的X/Z轴旋转
    Vector3 rayDir = Quaternion.Euler(0, i, 0) * Vector3.forward;
    Debug.DrawRay(selfTrans.position, rayDir * rayLength, Color.red, 1f);
}
效果参考
  • 正常状态(未旋转物体):Before rotation
  • 原代码异常状态(物体旋转后射线收缩为圆锥):After rotation

注意:Unity中四元数乘法的变换叠加是从右向左生效的,写旋转逻辑时一定要注意顺序,顺序错了变换结果就完全不对。

内容的提问来源于stack exchange,提问作者Paul Brink

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:36:10