How to Develop a Game
Gizmos
PublishDate: 2025-06-01 | CreateDate: 2025-06-01 | LastModify: 2025-06-01 | Creator:ljf12825

Gizmos是一种用于在Scene视图中可视化调试信息的工具,常用于开发阶段来辅助设计和调试,但不会在游戏运行时显示在Game视图中

Gizmos的作用

Gizmos主要用于以下目的:

使用方式

可以在脚本中通过OnDrawGizmos()OnDrawGizmosSelected()函数来自定义Gizmo的绘制

1.OnDrawGizmos()

无论是否选中物体,都会绘制

void OnDrawGizmos()
{
    Gizmos.color = Color.yellow;
    Gizmos.DrawWireSphere(transform.position, 1f)l
}

2.OnDrawGizmosSelected()

只有在选中该GameObject时才会绘制

void OnDrawGizmosSelected()
{
    Gizmos.color = Color.red;
    Gizmos.DrawWireCube(transform.position, Vector3.one * 2);
}

Tips

Gizmos API

Static Properties

属性名类型说明
colorColor设置下一个 Gizmo 图形的颜色
matrixMatrix4x4设置变换矩阵,影响后续绘制的 Gizmo 的位置/旋转/缩放
exposureTexture设置用于 Light Probe 曝光可视化的纹理(高级光照调试使用)
probeSizefloat设置 Light Probe Gizmo 的显示大小

Static Method

方法描述
CalculateLOD(Vector3 position, float radius)计算某个位置与半径下的合适 LOD(Level of Detail),用于 Scene 视图中的 Gizmo 可视化。常用于优化大场景调试可视化。
DrawCube(Vector3 center, Vector3 size)画一个实心立方体,常用于表示物体边界或区域。
DrawFrustum(Vector3 center, float fov, float maxRange, float minRange, float aspect)画一个视锥体(如摄像机视野),支持通过 Gizmos.matrix 设置变换位置和方向。
DrawGUITexture(Rect position, Texture texture)在 Scene 中绘制一个 GUI 纹理。已过时,推荐使用 Editor GUI 工具替代。
DrawIcon(Vector3 center, string name, bool allowScaling = true)在场景中某位置绘制一个图标,图标必须是 Unity 的内置图标名。
DrawLine(Vector3 from, Vector3 to)画一条线段,基础调试最常用。
DrawLineList(NativeArray<Vector3> points)每两个点组成一段线,适用于批量线段绘制(如网格边、路径等)。
DrawLineStrip(NativeArray<Vector3> points)将多个点首尾相连,绘制连续的折线段(如折线图、轨迹线等)。
DrawMesh(Mesh mesh, Vector3 position, Quaternion rotation, Vector3 scale)在指定位置绘制一个完整 Mesh(实心),可以用来调试自定义模型、碰撞体。
DrawRay(Vector3 from, Vector3 direction)画一条射线(从起点沿方向延伸),用于调试方向、视野、攻击方向等。
DrawSphere(Vector3 center, float radius)绘制一个实心球体。
DrawWireCube(Vector3 center, Vector3 size)绘制一个线框立方体,调试边界、区域划分常用。
DrawWireMesh(Mesh mesh, Vector3 position, Quaternion rotation, Vector3 scale)绘制一个 mesh 的线框形式(仅显示轮廓)。适合调试模型形状、LOD 结构等。
DrawWireSphere(Vector3 center, float radius)绘制一个线框球体,最常用于范围可视化(攻击/感知/触发等)。

示例

可视化角色视野

void OnDrawGizmosSelected()
{
    Gizmos.color = Color.green;
    Gizmos.DrawRay(transform.position, transform.forward * 5f);

    float fov = 45f;
    Quaternion leftRay = Quaternion.Euler(0, -fov, 0);
    Quaternion rightRay = Quaternion.Euler(0, fov, 0);

    Gizmos.DrawRay(transform.position, leftRay * transform.forward * 5f);
    Gizmos.DrawRay(transform.position, rightRay * transform.forward * 5f);
}

绘制摄像机视锥

void OnDrawGizmos()
{
    Gizmos.color = Color.green;
    Gizmos.matrix = transform.localToWorldMatrix;
    Gizmos.DrawFrustum(Vector3.zero, 60f, 10f, 0.3f, 1.77f); // 画出视野锥体
    Gizmos.matrix = Matrix4x4.identity; // 清除变换
}