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); }
效果参考
- 正常状态(未旋转物体):

- 原代码异常状态(物体旋转后射线收缩为圆锥):

注意:Unity中四元数乘法的变换叠加是从右向左生效的,写旋转逻辑时一定要注意顺序,顺序错了变换结果就完全不对。
内容的提问来源于stack exchange,提问作者Paul Brink
相关产品推荐
相关产品推荐

