☰
Unity Gizmos 拓展工具集收集与实战指南:从调试可视化到场景编辑利器
2026/9/25 3:24:56 网站建设 项目流程
  • 示例工程

【免费下载链接】Unity3DTraining

【Unity杂货铺】unity大杂烩~

项目地址:https://gitcode.com/gh_mirrors/un/Unity3DTraining
点击查看免费下载

导读

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 虽然简单,但存在两个明显短板:

  1. 图元种类有限:只提供DrawLine、DrawCube、DrawSphere、DrawWireCube、DrawWireSphere、DrawMesh、DrawIcon等基础能力,没有圆环、扇形、箭头、多边形、文本标签等游戏开发中的高频图形;
  2. 默认不进入运行时构建:内置 Gizmos 是调试设施,发布后的 Player 中默认不可见,若需要在真实设备上展示调试信息(如 AI 感知范围、网络路径),就必须自行扩展。

正是这两个缺口催生了社区里一大批"Gizmos 拓展工具",而 GizmoKitCollection.md 正是 UnityEditorExtension/README.md 中"收集整理一些 Gizmos 相关工具"这一条目指向的专用清单(见该 README 的编辑器拓展列表部分)。

二、文档收集的 6 个 Gizmos 拓展工具逐一解读

GizmoKitCollection.md 正文以清单形式收录了 6 个工具(原文为外部链接形式,此处按工具名与定位归纳):

工具来源/作者定位(据链接命名与说明推断)典型适用场景
UnityToolsCaptainHillmanUnity 编辑器工具合集需要一套打包好的通用编辑器增强能力
SensorKitUWA 实验室传感器/感知范围类可视化工具AI 视野、听觉、感知半径调试
unitilitieschristianchomiakUnity 开发工具集合日常开发中多种小工具的聚合
Unity3d Gizmo Mesh Previeweditkid在 Gizmos 中预览网格(Mesh)在场景视图中直接预览网格模型
Gizmo ExtensionsUWA 实验室Gizmos 绘制能力的扩展集合补齐原生 API 缺失的图元
popcron/gizmospopcron运行时与编辑器双端绘制 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 行)包含三个值得复用的技巧:

  1. 角度步进参数m_Theta控制平滑度:值越低,采样点越多、圆越平滑,但每帧绘制的线段数也越多,需要注意性能与视觉效果的平衡;代码里m_Theta < 0.0001f的钳制用于防止除零/死循环风险;
  2. Gizmos.matrix = m_Transform.localToWorldMatrix:将整个绘制坐标系切换到物体的本地空间,之后(x, 0, z)的坐标会自动随物体的位移、旋转、缩放而变换,实现"圆环挂在物体上"的效果;
  3. 保存/恢复现场:先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 工具前的评估清单

结合第二节的工具定位与第三节的原生能力边界,接入前建议按以下维度核对:

  1. 编辑器/运行时双端需求:只在开发期调试,原生Gizmos+OnDrawGizmos足够;需要发布版本内可视化(如线上问题排查、AI 行为演示),则应选popcron/gizmos这类明确支持 builds 内绘制的方案;
  2. Unity 版本与渲染管线兼容性:工具若直接操纵Gizmos.matrix或依赖Handles,在较新 Unity 版本(如 2021+)与 SRP 管线下的行为可能有差异,导入前应核对仓库更新记录;
  3. 性能与 GC:Gizmos 每帧执行,优先选择复用静态数组、避免每帧new的写法(可对照 DebugUILine.cs 的static数组);
  4. 作用域隔离:第三方工具绘制时是否"保存/恢复Gizmos.color与Gizmos.matrix",会影响同一场景其他组件的可视化是否正确(对照 DrawCircle.cs 的现场恢复写法);
  5. 许可证与依赖:合集类工具往往夹带大量无关代码,优先考虑按需抽取,避免污染工程。

五、小结

  • 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大杂烩~

项目地址:https://gitcode.com/gh_mirrors/un/Unity3DTraining
点击查看免费下载

相关推荐

上一篇:Qwen3技术架构全景解读:六大突破性创新如何重新定义大语言模型效能标准
下一篇:性能炸裂!阿里QwQ-32B模型深度测评:小参数如何比肩671B大模型?

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询