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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 04:55:16