You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Unity Editor预览模式下绘制线条被灰色区域遮挡求助

Unity Preview Window: Handles Lines Blocked by Gray Background

我来帮你搞定这个问题!你遇到的线条被灰色预览背景遮挡的情况,核心原因是Handles的绘制时机和上下文没处理对——你的现有代码只完成了预览相机的参数设置,却没在正确的渲染阶段绘制线条,也没收尾预览渲染流程。

问题拆解

  1. 你调用了m_PreviewUtility.BeginPreview()但没调用EndPreview(),导致预览背景会直接覆盖后续绘制的内容;
  2. 没有切换到预览相机的空间上下文,Handles绘制的坐标可能不在相机可视范围内,或者层级低于背景;
  3. 缺少Handles绘制的核心逻辑块,代码里完全没看到实际的线条绘制代码。

修改后的完整代码

下面是修复后的代码,我标注了关键的新增部分:

Camera camera;
public override void OnPreviewGUI(Rect r, GUIStyle background) {
    InitPreview();
    Vector3 zoom;
    m_PreviewDir = Drag2D(m_PreviewDir, r, out zoom);
    m_ScrollZoom += zoom;
    m_ScrollZoom.y = Mathf.Max(-33f, Mathf.Min(m_ScrollZoom.y, 44));

    if (Event.current.type != EventType.Repaint) {
        return;
    }

    // 启动预览渲染流程
    m_PreviewUtility.BeginPreview(r, background);
    camera = m_PreviewUtility.camera;
    m_PreviewBounds.size = new Vector3(1, 1,1);
    float num = Mathf.Max(m_PreviewBounds.extents.magnitude, 0.0001f);
    float num2 = num * 3.8f;
    Quaternion quaternion = Quaternion.Euler(-m_PreviewDir.y, -m_PreviewDir.x, 0f);
    Vector3 position = m_PreviewBounds.center - quaternion * (Vector3.forward * num2) * (1 + m_ScrollZoom.y * 0.02f);
    camera.transform.position = position;
    camera.transform.rotation = quaternion;
    camera.nearClipPlane = 0.1f;
    camera.farClipPlane = 1000.0f;
    camera.fieldOfView = 80;

    // --------------------------
    // 关键新增:Handles绘制逻辑
    // --------------------------
    // 保存原Handles矩阵,切换到预览相机的世界空间上下文
    Matrix4x4 originalHandlesMatrix = Handles.matrix;
    Handles.matrix = camera.transform.localToWorldMatrix;

    // 设置线条颜色(用鲜明颜色避免和背景混淆)
    Handles.color = Color.yellow;
    // 示例:绘制一条从预览中心到(1,1,1)的线条
    Handles.DrawLine(m_PreviewBounds.center, m_PreviewBounds.center + Vector3.one);

    // 恢复原Handles矩阵,避免影响其他UI绘制
    Handles.matrix = originalHandlesMatrix;

    // 必须调用EndPreview,确保绘制内容渲染在背景之上
    m_PreviewUtility.EndPreview();
}

核心修复点说明

  • 必须调用m_PreviewUtility.EndPreview():这个方法会把你在BeginPreview之后绘制的所有内容(包括Handles)渲染在预览背景的上层,是解决遮挡问题的关键;
  • 切换Handles矩阵:预览窗口有独立的相机,通过Handles.matrix = camera.transform.localToWorldMatrix可以让你的线条在预览视角里正确显示;
  • 用鲜明颜色测试:如果线条颜色和灰色背景接近,也会看起来像被遮挡,先换高对比度颜色(比如黄色、红色)验证是否显示正常;
  • 确保在Repaint事件里绘制:你的代码已经判断了Event.current.type == EventType.Repaint,这部分是正确的——只有Repaint事件才会执行GUI渲染逻辑。

如果还有问题,可以检查一下:

  • 线条的坐标是否在预览相机的可视范围内(可以调整相机的nearClipPlanefarClipPlane或者线条位置);
  • InitPreview()方法是否正确初始化了m_PreviewUtilitym_PreviewBounds

内容的提问来源于stack exchange,提问作者J.Titor.0

火山引擎 最新活动