Unity Editor预览模式下绘制线条被灰色区域遮挡求助
Unity Preview Window: Handles Lines Blocked by Gray Background
我来帮你搞定这个问题!你遇到的线条被灰色预览背景遮挡的情况,核心原因是Handles的绘制时机和上下文没处理对——你的现有代码只完成了预览相机的参数设置,却没在正确的渲染阶段绘制线条,也没收尾预览渲染流程。
问题拆解
- 你调用了
m_PreviewUtility.BeginPreview()但没调用EndPreview(),导致预览背景会直接覆盖后续绘制的内容; - 没有切换到预览相机的空间上下文,Handles绘制的坐标可能不在相机可视范围内,或者层级低于背景;
- 缺少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渲染逻辑。
如果还有问题,可以检查一下:
- 线条的坐标是否在预览相机的可视范围内(可以调整相机的
nearClipPlane、farClipPlane或者线条位置); InitPreview()方法是否正确初始化了m_PreviewUtility和m_PreviewBounds。
内容的提问来源于stack exchange,提问作者J.Titor.0




