- 示例工程
【免费下载链接】Unity3DTraining
【Unity杂货铺】unity大杂烩~
导读
Unity3DTraining仓库的 GizmoKitCollection.md 是一份面向 Unity 开发者的Gizmos 拓展工具清单,集中收录了社区中若干成熟的 Gizmos 增强方案。本文以这份清单为主体,逐项解读这些工具的能力边界与适用场景,并回到仓库内部,用 DrawCircle.cs、DebugUILine.cs、SpringBoneEditor.cs 三份真实源码演示"手写 Gizmos"的典型套路。读完本文,你将掌握:原生 Gizmos 的能力与局限、6 类社区拓展工具的分工、如何用Gizmos.matrix与Handles完成复杂场景可视化,以及接入第三方工具前的评估要点。
一、为什么需要 Gizmos 拓展工具
Unity 内置的Gizmos静态类提供了一组仅在 Scene 视图与调试状态下生效的绘制 API,是日常开发中可视化碰撞体、触发器、路径点、攻击范围最直接的手段。其核心入口是 MonoBehaviour 上的两个回调:
OnDrawGizmos():每帧都会绘制,在编辑器与运行时(Game 视图)均可生效;OnDrawGizmosSelected():仅当对象被选中时绘制,适合层级较多时的选择性显示。
原生 API 虽然简单,但存在两个明显短板:
- 图元种类有限:只提供
DrawLine、DrawCube、DrawSphere、DrawWireCube、DrawWireSphere、DrawMesh、DrawIcon等基础能力,没有圆环、扇形、箭头、多边形、文本标签等游戏开发中的高频图形; - 默认不进入运行时构建:内置 Gizmos 是调试设施,发布后的 Player 中默认不可见,若需要在真实设备上展示调试信息(如 AI 感知范围、网络路径),就必须自行扩展。
正是这两个缺口催生了社区里一大批"Gizmos 拓展工具",而 GizmoKitCollection.md 正是 UnityEditorExtension/README.md 中"收集整理一些 Gizmos 相关工具"这一条目指向的专用清单(见该 README 的编辑器拓展列表部分)。
二、文档收集的 6 个 Gizmos 拓展工具逐一解读
GizmoKitCollection.md 正文以清单形式收录了 6 个工具(原文为外部链接形式,此处按工具名与定位归纳):
| 工具 | 来源/作者 | 定位(据链接命名与说明推断) | 典型适用场景 |
|---|---|---|---|
| UnityTools | CaptainHillman | Unity 编辑器工具合集 | 需要一套打包好的通用编辑器增强能力 |
| SensorKit | UWA 实验室 | 传感器/感知范围类可视化工具 | AI 视野、听觉、感知半径调试 |
| unitilities | christianchomiak | Unity 开发工具集合 | 日常开发中多种小工具的聚合 |
| Unity3d Gizmo Mesh Preview | editkid | 在 Gizmos 中预览网格(Mesh) | 在场景视图中直接预览网格模型 |
| Gizmo Extensions | UWA 实验室 | Gizmos 绘制能力的扩展集合 | 补齐原生 API 缺失的图元 |
| popcron/gizmos | popcron | 运行时与编辑器双端绘制 Gizmos | 构建版本内保留调试可视化 |
结合工具命名与清单来源,可以给出如下选型建议(具体能力边界需以各工具仓库内的文档为准):
- 追求开箱即用、不想维护代码:优先考察
UnityTools与unitilities这类工具合集,它们通常直接以.unitypackage或源码目录方式导入; - 需要 AI/传感器范围可视化:
SensorKit的定位高度契合,可避免手写扇形、锥体等复杂的 Gizmos 数学; - 需要场景内预览美术模型:
Unity3d Gizmo Mesh Preview专注 Mesh 预览,适合资产检查与摆放调试; - 需要在发布版本中保留调试绘制:原生 Gizmos 在构建后默认失效,
popcron/gizmos明确宣称支持"drawing runtime gizmos in builds and editor",这类场景应优先选它; - 希望只补图元、不引入重框架:
Gizmo Extensions作为扩展集合更轻量,可结合下文第三节的仓库示例自行评估其实现思路。
事实边界说明:除链接标题自带的描述外,上述工具的具体接口、版本与性能细节本文不作展开,以免以讹传讹;接入前请以各工具仓库 README 与更新记录为准。
三、仓库内的 Gizmos 实战示例:三种典型编写形态
在引入第三方库之前,先理解原生 Gizmos 的三种典型编写形态,能帮助你更准确地判断"哪些该自己写、哪些该用现成工具"。Unity3DTraining仓库恰好提供了三个互不重复的范本。
3.1 用Gizmos.matrix+DrawLine绘制圆环
SomeTest/GizmosDrawCircle 是一个独立的 Unity 练习工程,其核心脚本 DrawCircle.cs 展示了如何用折线段逼近一个平滑圆环:
void OnDrawGizmos() { if (m_Transform == null) return; if (m_Theta < 0.0001f) m_Theta = 0.0001f; // 设置矩阵:让绘制坐标跟随物体本地坐标系 Matrix4x4 defaultMatrix = Gizmos.matrix; Gizmos.matrix = m_Transform.localToWorldMatrix; // 设置颜色 Color defaultColor = Gizmos.color; Gizmos.color = m_Color; // 按角度步进绘制线段,逼近圆环 Vector3 beginPoint = Vector3.zero; Vector3 firstPoint = Vector3.zero; for (float theta = 0; theta < 2 * Mathf.PI; theta += m_Theta) { float x = m_Radius * Mathf.Cos(theta); float z = m_Radius * Mathf.Sin(theta); Vector3 endPoint = new Vector3(x, 0, z); if (theta == 0) firstPoint = endPoint; else Gizmos.DrawLine(beginPoint, endPoint); beginPoint = endPoint; } Gizmos.DrawLine(firstPoint, beginPoint); // 闭合首尾 // 恢复默认颜色与矩阵 Gizmos.color = defaultColor; Gizmos.matrix = defaultMatrix; }这份代码(关键逻辑位于 DrawCircle.cs 的OnDrawGizmos,约 18–57 行)包含三个值得复用的技巧:
- 角度步进参数
m_Theta控制平滑度:值越低,采样点越多、圆越平滑,但每帧绘制的线段数也越多,需要注意性能与视觉效果的平衡;代码里m_Theta < 0.0001f的钳制用于防止除零/死循环风险; Gizmos.matrix = m_Transform.localToWorldMatrix:将整个绘制坐标系切换到物体的本地空间,之后(x, 0, z)的坐标会自动随物体的位移、旋转、缩放而变换,实现"圆环挂在物体上"的效果;- 保存/恢复现场:先
Gizmos.matrix/Gizmos.color保存默认值,绘制结束后还原,避免污染同一帧内其他组件的 Gizmos 绘制。
对照上文"原生无圆环"的短板,这正是社区Gizmo Extensions一类工具所做的事情——把这类几何逼近代码封装成Gizmos.DrawCircle(...)式的便捷 API。
3.2 遍历场景绘制 UGUI 射线检测区域
SomeTest/UnityEditorTest/DebugUILine.cs 是另一个方向:用 Gizmos 做整场景的 UI 调试可视化。它通过#if UNITY_EDITOR限定仅在编辑器编译,遍历所有可射线检测的MaskableGraphic,用RectTransform.GetWorldCorners取世界坐标四角后连线成矩形:
static Vector3[] fourCorners = new Vector3[4]; void OnDrawGizmos() { foreach (MaskableGraphic g in GameObject.FindObjectsOfType<MaskableGraphic>()) { if (g.raycastTarget) { RectTransform rectTransform = g.transform as RectTransform; rectTransform.GetWorldCorners(fourCorners); Gizmos.color = Color.blue; for (int i = 0; i < 4; i++) Gizmos.DrawLine(fourCorners[i], fourCorners[(i + 1) % 4]); } } }要点解析:
- 静态复用数组:
fourCorners声明为static,避免每帧分配新数组,是 Gizmos 场景中控制 GC 的典型手法; GetWorldCorners返回世界坐标:配合Gizmos.DrawLine直接绘制世界空间线段,无需再处理矩阵变换;- 以"真实可点击区域"为目标:只绘制
raycastTarget == true的图元,让策划/美术直观看到"哪些 UI 区域真正响应点击",这是把 Gizmos 用作团队协作检查工具的好例子。
3.3 用Handles做出可交互手柄(编辑器拓展进阶)
Gizmos 只能"画",UnityEditor.Handles则能"交互"。DynamicBones/SpringBone/Assets/Editor/SpringBoneEditor.cs 的OnSceneGUI(约 33–46 行)展示了完整套路:
private void OnSceneGUI() { var t = target as SpringBone; var so = new SerializedObject(t); Handles.DrawDottedLine(t.transform.position, t.transform.TransformPoint(t.springEnd), 4.0f); var currentPos = t.transform.TransformPoint(t.springEnd); var size = HandleUtility.GetHandleSize(currentPos) * 0.2f; EditorGUI.BeginChangeCheck(); var movedPos = Handles.FreeMoveHandle(currentPos, Quaternion.identity, size, Vector3.one * 0.5f, Handles.SphereHandleCap); if (EditorGUI.EndChangeCheck()) { so.FindProperty("springEnd").vector3Value = t.transform.InverseTransformPoint(movedPos); so.ApplyModifiedProperties(); } }这里出现了三个进阶 API,均是社区编辑器拓展工具的常见底层实现:
Handles.DrawDottedLine:绘制虚线,适合表现"弹簧末端到骨骼"这类辅助连线;Handles.FreeMoveHandle+HandleUtility.GetHandleSize:在场景视图中生成一个可拖拽的小球手柄,GetHandleSize让手柄大小随视口缩放自适应;EditorGUI.BeginChangeCheck()/EndChangeCheck():配合SerializedObject与ApplyModifiedProperties(),把拖拽结果安全写回序列化属性并支持 Undo。
从源码结构看,本仓库的SpringBone演示工程是把"运行时物理模拟(DynamicBones)"与"编辑器可视化手柄"结合的范例,也印证了社区工具清单中UnityTools、Gizmo Extensions等合集的内部实现往往正是Gizmos+Handles的组合。
四、接入第三方 Gizmos 工具前的评估清单
结合第二节的工具定位与第三节的原生能力边界,接入前建议按以下维度核对:
- 编辑器/运行时双端需求:只在开发期调试,原生
Gizmos+OnDrawGizmos足够;需要发布版本内可视化(如线上问题排查、AI 行为演示),则应选popcron/gizmos这类明确支持 builds 内绘制的方案; - Unity 版本与渲染管线兼容性:工具若直接操纵
Gizmos.matrix或依赖Handles,在较新 Unity 版本(如 2021+)与 SRP 管线下的行为可能有差异,导入前应核对仓库更新记录; - 性能与 GC:Gizmos 每帧执行,优先选择复用静态数组、避免每帧
new的写法(可对照 DebugUILine.cs 的static数组); - 作用域隔离:第三方工具绘制时是否"保存/恢复
Gizmos.color与Gizmos.matrix",会影响同一场景其他组件的可视化是否正确(对照 DrawCircle.cs 的现场恢复写法); - 许可证与依赖:合集类工具往往夹带大量无关代码,优先考虑按需抽取,避免污染工程。
五、小结
- GizmoKitCollection.md 是仓库维护者沉淀的一份Gizmos 拓展工具导航,覆盖了工具合集(UnityTools、unitilities)、感知可视化(SensorKit)、网格预览(Gizmo Mesh Preview)、图元扩展(Gizmo Extensions)与运行时绘制(popcron/gizmos)五个方向;
- 仓库自身则提供了三条"手写 Gizmos"的完整实践链路:几何逼近圆环(DrawCircle.cs)、全场景 UI 区域可视化(DebugUILine.cs)、可拖拽编辑器手柄(SpringBoneEditor.cs);
- 建议的落地路径是:先用仓库内示例摸清原生
Gizmos/Handles的能力边界,再按第四节清单对照选择第三方工具,避免为单一功能引入重量级框架。
- 示例工程
【免费下载链接】Unity3DTraining
【Unity杂货铺】unity大杂烩~
相关推荐
Unity运行时编辑器RuntimeUnityEditor:实时调试与场景编辑的完整指南
Unity运行时编辑器RuntimeUnityEditor:实时调试与场景编辑的完整指南 RuntimeUnityEditor是一款专为Unity3D引擎设计的
如何打造终极智能家居控制中心:Home Assistant仪表盘设计完全指南
如何打造终极智能家居控制中心:Home Assistant仪表盘设计完全指南 想要创建一个既美观又实用的智能家居控制界面吗?Home Assistant多房间管
物联网Unity MCP 工具完全参考:从场景搭建到性能剖析的 AI 驱动 Unity 编辑器自动化实战指南
Unity MCP 工具完全参考:从场景搭建到性能剖析的 AI 驱动 Unity 编辑器自动化实战指南 本指南以 Unity MCP(Model Context
MCP 服务AI 应用游戏开发工具调用
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考