当前位置: 首页 > backend >正文

Unity3D Gizmos 调试可视化

利用 Gizmos 直观地看到一些调试信息。

Unity3D Gizmos 调试可视化

在 Unity 开发中,很多时候我们需要在 Scene / Game 视图 里直观地看到一些调试信息,比如角色的攻击范围、AI 的巡逻路径、摄像机的视野等。

这时候,Unity 提供的 Gizmos 系统就是非常好用的工具。

基本用法

只要在脚本里实现 OnDrawGizmosOnDrawGizmosSelected 方法,就能绘制调试辅助图形。

using UnityEngine;public class GizmosDemo : MonoBehaviour
{[SerializeField] private float radius = 2f;private void OnDrawGizmos(){// 设置颜色Gizmos.color = Color.green;// 画一个球体Gizmos.DrawWireSphere(transform.position, radius);// 画一个立方体Gizmos.color = Color.yellow;Gizmos.DrawWireCube(transform.position + Vector3.up * 2, Vector3.one);// 画一条射线Gizmos.color = Color.red;Gizmos.DrawRay(transform.position, transform.forward * 5f);}private void OnDrawGizmosSelected(){Gizmos.color = Color.cyan;Gizmos.DrawWireSphere(transform.position, radius * 1.5f);}
}
  • OnDrawGizmos -> 始终显示(场景中会很乱)
  • OnDrawGizmosSelected -> 只有选中物体时显示(推荐)

注:如果在视图中没有显示绘制的图形,请检查右上角的图形开关,勾选对应的脚本。

Gizmos显示开关

常用 Gizmos API

方法描述
Gizmos.DrawWireSphere(pos, radius)线框球体
Gizmos.DrawSphere(pos, radius)实心球体
Gizmos.DrawWireCube(pos, size)线框立方体
Gizmos.DrawCube(pos, size)实心立方体
Gizmos.DrawLine(start, end)绘制线段
Gizmos.DrawRay(origin, dir)绘制射线
Gizmos.DrawIcon(pos, "icon.png", true)绘制图标(方便定位)
Gizmos.matrix = transform.localToWorldMatrix设置坐标系(绘制局部网格时很有用)
Gizmos.DrawMesh(mesh, pos, rot, scale)绘制自定义 Mesh

实际应用场景

显示攻击范围

private void OnDrawGizmosSelected()
{Gizmos.color = Color.red;Gizmos.DrawWireSphere(transform.position, attackRange);
}

显示 AI 巡逻路径

private void OnDrawGizmos()
{Gizmos.color = Color.blue;for (int i = 0; i < waypoints.Length - 1; i++){Gizmos.DrawLine(waypoints[i].position, waypoints[i + 1].position);}
}

显示摄像机视野

private void OnDrawGizmos()
{Camera cam = GetComponent<Camera>();Gizmos.color = Color.green;Gizmos.matrix = cam.transform.localToWorldMatrix;Gizmos.DrawFrustum(Vector3.zero, cam.fieldOfView, cam.farClipPlane, cam.nearClipPlane, cam.aspect);
}

通用 Gizmos 工具类

为了避免每次都写重复代码,可以整理一个 GizmosHelper 工具类,例如:

  • 绘制调试网格
  • 绘制扇形范围
  • 绘制路径箭头
using UnityEngine;public static class GizmosHelper
{/// <summary>/// 绘制调试网格/// </summary>public static void DrawGrid(Vector3 origin, int width, int height, float cellSize, Color color){Gizmos.color = color;for (int x = 0; x <= width; x++){Gizmos.DrawLine(origin + new Vector3(x * cellSize, 0, 0),origin + new Vector3(x * cellSize, 0, height * cellSize));}for (int z = 0; z <= height; z++){Gizmos.DrawLine(origin + new Vector3(0, 0, z * cellSize),origin + new Vector3(width * cellSize, 0, z * cellSize));}}/// <summary>/// 绘制扇形范围/// </summary>public static void DrawSector(Vector3 center, Vector3 forward, float angle, float radius, int segments = 20){Gizmos.color = Color.yellow;float halfAngle = angle * 0.5f;Quaternion leftRot = Quaternion.AngleAxis(-halfAngle, Vector3.up);Quaternion rightRot = Quaternion.AngleAxis(halfAngle, Vector3.up);Vector3 leftDir = leftRot * forward * radius;Vector3 rightDir = rightRot * forward * radius;Gizmos.DrawLine(center, center + leftDir);Gizmos.DrawLine(center, center + rightDir);Vector3 lastPoint = center + leftDir;for (int i = 1; i <= segments; i++){float t = (float)i / segments;Quaternion rot = Quaternion.AngleAxis(Mathf.Lerp(-halfAngle, halfAngle, t), Vector3.up);Vector3 nextPoint = center + rot * forward * radius;Gizmos.DrawLine(lastPoint, nextPoint);lastPoint = nextPoint;}}/// <summary>/// 绘制路径箭头/// </summary>public static void DrawPath(Vector3[] points, Color color){if (points == null || points.Length < 2) return;Gizmos.color = color;for (int i = 0; i < points.Length - 1; i++){Gizmos.DrawLine(points[i], points[i + 1]);DrawArrowHead(points[i], points[i + 1], color);}}private static void DrawArrowHead(Vector3 start, Vector3 end, Color color){Vector3 dir = (end - start).normalized;Vector3 right = Quaternion.LookRotation(dir) * Quaternion.Euler(0, 150, 0) * Vector3.forward;Vector3 left = Quaternion.LookRotation(dir) * Quaternion.Euler(0, -150, 0) * Vector3.forward;Gizmos.DrawLine(end, end + right * 0.5f);Gizmos.DrawLine(end, end + left * 0.5f);}
}

使用示例:

private void OnDrawGizmos()
{// 调试网格GizmosHelper.DrawGrid(Vector3.zero, 5, 5, 1f, Color.gray);// 扇形范围GizmosHelper.DrawSector(transform.position, transform.forward, 90f, 5f);// 路径箭头Vector3[] path = { transform.position, transform.position + Vector3.forward * 3, transform.position + Vector3.right * 3 };GizmosHelper.DrawPath(path, Color.cyan);
}

效果:

绘制常用图形

注意事项

  • Gizmos 只在 Scene / Game 视图 可见,不会出现在游戏发布版本。
  • Gizmos 面板 勾选对应脚本才能看到。
  • 建议用 OnDrawGizmosSelected,避免场景太乱。

总结

  • OnDrawGizmos / OnDrawGizmosSelected 是调试可视化的核心入口。
  • Gizmos 常用来显示 网格、范围、路径、摄像机视野等调试辅助信息
  • 封装 GizmosHelper 工具类 能极大提高开发效率。
http://www.xdnf.cn/news/19375.html

相关文章:

  • Qt中UDP回显服务器和客户端
  • 第二十七天-ADC模数转换实验
  • python反转字符串
  • 三维重建模型、3DGS、nerf、 mip-nerf
  • 《WINDOWS 环境下32位汇编语言程序设计》第9章 通用控件(2)
  • 点接触混合润滑完整数值解
  • 免税商品优选购物商城系统|java技术开发
  • MATLAB R2010b系统环境(三)MATLAB操作界面
  • JavaWeb01
  • 【Linux】创建线程
  • 基于K8s部署Redis高可用
  • mit6.031软件构造 笔记 Testing
  • Redis进阶(上)
  • Win11输入法异常解决方案
  • 智能合约安全全解析:常见漏洞、真实案例与防范实践
  • 机器视觉学习-day14-绘制图像轮廓
  • 【机器学习基础】监督学习算法的现代理解:从经典方法到无人驾驶与生成式AI的实践应用
  • [光学原理与应用-353]:ZEMAX - 设置 - 可视化工具:2D视图、3D视图、实体模型三者的区别,以及如何设置光线的数量
  • 财务的三张报表:现金流表、利润表、资产负债表
  • Spring/Spring MVC/iBATIS 应用 HTTP 到 HTTPS 迁移技术方案
  • 基于i.MX6ULL的RAM Disk驱动开发
  • 【开题答辩全过程】以 付费自习室系统小程序为例,包含答辩的问题和答案
  • 【编号186】中国劳动统计年鉴(1991-2023)
  • kafka服务端架构总览
  • 【C++】显示与隐式加载dll的使用与区别
  • 技术框架之RPC
  • 【系统分析师】高分论文:论信息系统的安全与保密设计
  • c++ 线程局部存储(Thread-Local Storage,TLS)
  • 当服务器报警响起:CPU、内存、磁盘使用率飙升的诊断与处置
  • 基于单片机智能鞋柜/智能鞋橱/智能鞋盒