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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 17:25:24