Gizmos
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只在Scene视图中起作用,不会影响实际游戏运行逻辑
- 可以使用
Handles绘制更高级的Gizmos - 复杂场景可封装Gizmo可视化模块,提升调试效率
Gizmos API
Static Properties
| 属性名 | 类型 | 说明 |
|---|---|---|
color | Color | 设置下一个 Gizmo 图形的颜色 |
matrix | Matrix4x4 | 设置变换矩阵,影响后续绘制的 Gizmo 的位置/旋转/缩放 |
exposure | Texture | 设置用于 Light Probe 曝光可视化的纹理(高级光照调试使用) |
probeSize | float | 设置 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; // 清除变换
}
