Unity RayCast命中物体但场景与游戏视图无法显示射线问题求助
解决Unity射线无法在视图中显示的问题
嘿,我来帮你搞定这个射线看不到的问题!你的代码逻辑其实没问题(射线能检测到碰撞就说明射线是有效的),主要是射线绘制的时机和变量初始化的问题,咱们一步步来排查:
一、先看你第二个版本代码的核心问题
你在OnDrawGizmos里用了ray变量,但这个变量只在Start()里初始化——而OnDrawGizmos在编辑模式下就会运行,这时候Start()还没执行,ray的origin和direction都是默认的Vector3.zero,相当于在世界原点画了一条射线,自然看不到。
另外,就算在运行时,ray也只会在Start()里赋值一次,如果物体移动了,射线也不会跟着更新位置和方向。
二、两种可行的修复方案
方案1:修复OnDrawGizmos的射线初始化
把射线的初始化逻辑移到OnDrawGizmos里,让它每次绘制时都实时获取当前物体的位置和方向:
public class RayCast : MonoBehaviour { public LayerMask layersToHit; void Start() { CheckForColliders(); } void CheckForColliders() { Ray ray = new Ray(transform.position, transform.forward); if (Physics.Raycast(ray, out RaycastHit hit, Mathf.Infinity, layersToHit)) { Debug.Log(hit.collider.gameObject.name + " was hit "); } } private void OnDrawGizmos() { // 实时创建射线,确保每次绘制都用当前物体的位置和方向 Ray ray = new Ray(transform.position, transform.forward); Gizmos.color = Color.red; // 画100单位长的射线 Gizmos.DrawRay(ray.origin, ray.direction * 100f); // 可选:如果想在命中时画到碰撞点的射线,可以在这里加检测 if (Physics.Raycast(ray, out RaycastHit hit, 100f, layersToHit)) { Gizmos.color = Color.green; Gizmos.DrawRay(ray.origin, ray.direction * hit.distance); // 还可以在碰撞点画个小球标记 Gizmos.DrawSphere(hit.point, 0.1f); } } }
方案2:用Debug.DrawRay在运行时持续显示
如果你只需要在运行时看射线,可以把Debug.DrawRay放到Update()里,这样每一帧都会重新绘制:
public class RayCast : MonoBehaviour { public LayerMask layersToHit; void Update() { Ray ray = new Ray(transform.position, transform.forward); // 不带时长参数的话,每一帧都会重新绘制,一直显示 Debug.DrawRay(ray.origin, ray.direction * 100f, Color.blue); if (Physics.Raycast(ray, out RaycastHit hit, Mathf.Infinity, layersToHit)) { Debug.Log(hit.collider.gameObject.name + " was hit "); // 画一条到碰撞点的红色射线,持续10秒 Debug.DrawRay(ray.origin, ray.direction * hit.distance, Color.red, 10f); } } }
三、别忘了检查Unity的Gizmos开关
就算代码对了,也要确保:
- 在Scene视图右上角,勾选
Gizmos按钮,并且确保你的脚本对应的Gizmos图标没被隐藏 - 在Game视图右上角,同样勾选
Gizmos(默认Game视图不显示Gizmos,需要手动打开)
这样调整后,你应该就能在视图里看到射线啦!
内容的提问来源于stack exchange,提问作者Jellyfish
相关产品推荐
相关产品推荐

