一、介绍
Gizmos 是 Unity 编辑器中的一种可视化工具,用于在 Scene 视图中绘制调试信息、辅助线、形状等。它们不会出现在最终的游戏中,仅在编辑器中可见,方便开发者进行调试和设
-
与Handles的区别
- Gizmos:仅用于可视化,无交互功能。
- Handles:提供可交互的控件(如拖拽手柄、旋转工具),通常用于自定义编辑器扩展(如通过
[CustomEditor]
实现的编辑器脚本)。
二、用途
- 调试和可视化:在 Scene 视图中显示游戏对象的范围、路径或特定属性。
- 辅助设计:帮助开发者在设计阶段快速布局和调整游戏元素。
- 交互式编辑:通过 Gizmos 提供交互控件,如拖动、旋转等。
三、用法
3.1 绘制图形:
-
绘制线条:
Gizmos.color = Color.red; // 设置线条颜色 Gizmos.DrawLine(Vector3.zero, new Vector3(1, 0, 0)); // 从原点画到 (1, 0, 0)
-
绘制立方体:
Gizmos.color = Color.green; Gizmos.DrawWireCube(Vector3.zero, Vector3.one); // 在原点画一个边长为 1 的立方体
-
绘制球体:
Gizmos.color = Color.blue; Gizmos.DrawWireSphere(Vector3.zero, 1.0f); // 在原点画一个半径为 1 的球体
-
绘制网格:
Gizmos.color = Color.yellow; Gizmos.DrawWireGrid(Vector3.zero, Vector3.one, 10); // 在原点画一个 10x10 的网格
3.2 在 MonoBehaviour 中使用
通常在 OnDrawGizmos
或 OnDrawGizmosSelected
方法中使用 Gizmos:
OnDrawGizmos
:在每一帧都会调用,无论对象是否被选中。OnDrawGizmosSelected
:仅当对象被选中时调用。
using UnityEngine;
public class GizmoExample : MonoBehaviour
{
private void OnDrawGizmos()
{
// 绘制一个红色立方体,表示对象的范围
Gizmos.color = Color.red;
Gizmos.DrawWireCube(transform.position, new Vector3(2, 2, 2));
}
private void OnDrawGizmosSelected()
{
// 当对象被选中时,绘制一个绿色球体
Gizmos.color = Color.green;
Gizmos.DrawWireSphere(transform.position, 1.0f);
}
}
3.3. 自定义 Gizmos
除了内置的 Gizmos 方法,还可以通过 Handles
类创建更复杂的交互式 Gizmos(通常用于编辑器脚本中):
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(GizmoExample))] 使用属性来指定这个编辑器类用于 GizmoExample 脚本
public class GizmoExampleEditor : Editor
{
// 在 Scene 视图中绘制自定义 Gizmos 的方法
private void OnSceneGUI()
{
GizmoExample example = (GizmoExample)target;
Handles.color = Color.cyan;
// 在目标对象的位置绘制一个圆盘
// example.transform.position: 圆盘的中心位置
// Vector3.up: 圆盘的法线方向(这里是 Y 轴正方向)
// 1.5f: 圆盘的半径
Handles.DrawWireDisc(example.transform.position, Vector3.up, 1.5f);
}
}
3.4 示例:绘制球形
将脚本挂载到cube上
using UnityEngine;
public class DrawSphere : MonoBehaviour
{
private void OnDrawGizmos()
{
Gizmos.DrawSphere(transform.position, 0.8f);
}
}
3.5 场景视图渲染机制
Gizmos的绘制直接集成在Unity场景视图的渲染管线中,其图形通过OpenGL/DirectX等底层API渲染,但与游戏运行时的渲染完全隔离。开发者无需手动处理渲染逻辑,仅需调用Gizmos的静态方法(如DrawWireCube
、DrawLine
)即可。
3.6 坐标系与矩阵变换
Gizmos的绘制默认使用世界坐标系,但可通过修改Gizmos.matrix
属性切换到局部坐标系:
void OnDrawGizmos() {
Gizmos.matrix = transform.localToWorldMatrix; // 切换到局部坐标系
Gizmos.DrawCube(Vector3.zero, Vector3.one); // 在局部坐标系原点绘制立方体
}
四、 性能优化
-
性能影响
-
Gizmos的绘制仅在编辑器模式下生效,不会影响游戏运行性能。但过度复杂的Gizmos绘制可能导致编辑器帧率下降,尤其在大型场景中。避免在
Update
中调用 Gizmos。
-
-
可见性控制
- 开发者可通过场景视图顶部的
Gizmos
下拉菜单全局启用/禁用Gizmos显示。 - 某些Gizmos(如地形调试警告)需通过菜单手动勾选才会显示。
- 开发者可通过场景视图顶部的
-
资源管理
- 自定义图标需放置在
Assets/Gizmos
文件夹下,并通过Gizmos.DrawIcon
方法引用。 - 避免在Gizmos方法中执行复杂计算(如物理模拟、大量对象遍历),以免拖慢编辑器响应速度。
- 自定义图标需放置在
五、应用场景
- 显示攻击范围:在角色周围绘制一个圆形或扇形区域,表示攻击范围。
- 路径规划:绘制一条折线,表示 AI 的移动路径。
- 碰撞体积:可视化对象的碰撞器范围,方便调试。
示例:显示对象的移动路径
using UnityEngine;
public class PathGizmo : MonoBehaviour
{
public Vector3[] pathPoints; // 路径点数组
private void OnDrawGizmos()
{
if (pathPoints == null || pathPoints.Length < 2) return;
Gizmos.color = Color.magenta;
for (int i = 0; i < pathPoints.Length - 1; i++)
{
Gizmos.DrawLine(pathPoints[i], pathPoints[i + 1]);
}
// 绘制路径点
Gizmos.color = Color.yellow;
foreach (var point in pathPoints)
{
Gizmos.DrawSphere(point, 0.2f);
}
}
}