Unity如何在Game视图中绘制类似Cinemachine的参考线?
在Unity Game视图绘制参考线的实现方法
方法一:用OnGUI()实现(适配2D/3D参考线)
Handles类默认仅在Scene视图生效,要在Game视图显示,需在OnGUI()中切换绘制矩阵,结合ViewportToWorldPoint转换坐标:
using UnityEditor; using UnityEngine; [ExecuteInEditMode] // 编辑模式下也能生效,可按需移除 public class GameViewGuides : MonoBehaviour { void OnGUI() { // 绑定相机的投影与世界矩阵,确保Handles在Game视图正确绘制 Handles.matrix = Camera.main.projectionMatrix * Camera.main.worldToCameraMatrix; Handles.color = Color.red; // 绘制世界空间的水平参考线(距离相机10米处) var leftWorldPos = Camera.main.ViewportToWorldPoint(new Vector3(0.2f, 0.5f, 10f)); var rightWorldPos = Camera.main.ViewportToWorldPoint(new Vector3(0.8f, 0.5f, 10f)); Handles.DrawLine(leftWorldPos, rightWorldPos); // 绘制屏幕空间的垂直参考线 GUI.color = Color.blue; var leftScreenRect = new Rect(Screen.width * 0.2f, 0, 2, Screen.height); var rightScreenRect = new Rect(Screen.width * 0.8f, 0, 2, Screen.height); GUI.DrawTexture(leftScreenRect, Texture2D.whiteTexture); GUI.DrawTexture(rightScreenRect, Texture2D.whiteTexture); } }
方法二:用GL类实现(高性能3D参考线)
通过相机的OnPostRender()回调,调用底层图形API绘制,不会被UI遮挡,适合复杂3D场景:
using UnityEngine; [RequireComponent(typeof(Camera))] public class GameView3DGuides : MonoBehaviour { private Camera _mainCam; void Awake() { _mainCam = GetComponent<Camera>(); } void OnPostRender() { GL.PushMatrix(); GL.LoadOrtho(); // 切换正交投影,适配屏幕空间坐标(0-1范围) GL.Begin(GL.LINES); GL.Color(Color.green); // 绘制屏幕中心十字线 GL.Vertex3(0.5f, 0, 0); GL.Vertex3(0.5f, 1, 0); GL.Vertex3(0, 0.5f, 0); GL.Vertex3(1, 0.5f, 0); GL.End(); GL.PopMatrix(); } }
方法三:用UI元素快速实现(静态2D参考线)
无需写代码,直接通过Canvas创建Image:
- 创建Canvas,设置Render Mode为
Screen Space - Overlay - 添加Image,设置Width=2、Height=Screen.height,调整Position到屏幕左右20%位置,设置颜色
- 复制Image即可得到对称参考线,适合固定布局的场景
关键提示
Handles.DrawLine需绑定相机矩阵才能在Game视图显示,否则会因投影问题不可见GL类的绘制必须在OnPostRender()或OnRenderObject()回调中执行- 若需编辑模式下预览,保留
[ExecuteInEditMode]标签,注意脚本生命周期逻辑
内容的提问来源于stack exchange,提问作者Sid Chou
相关产品推荐
相关产品推荐

