Unity基础学习(十一)Debug的内容以及异常清单
时,Unity 编辑器会立即暂停(相当于手动点击工具栏的 暂停),冻结游戏时间轴。主要是用于指定内容执行完你想暂停查看才会使用,再点击上面的暂停结束就会恢复。Debug类提供了一系列方法用于调试和输出信息,仅在开发版本生效,发布时会被移除。注意:上述两个方法都只能绘制线,但是不会返回任何信息,仅视觉作用。第一点异常非常常见,在编写代码时千万注意对引用对象的判空处理。暂停编辑器,方便检查当前状态。输
目录
一、Unity中的Debug类
Debug类提供了一系列方法用于调试和输出信息,仅在开发版本生效,发布时会被移除。
1.日志输出
Debug.Log(message)
输出普通日志(白色),用于跟踪程序流程。
Debug.Log("角色已移动至目标点");
Debug.LogWarning(message)
输出警告(黄色),提示潜在问题。
if (health <= 0) Debug.LogWarning("生命值不应为负数");
Debug.LogError(message)
输出错误(红色),标识严重问题。
if (player == null) Debug.LogError("玩家对象未初始化");
2.断言检查
Debug.Assert(condition, message)
条件为false时触发错误,用于验证假设。
Debug.Assert(enemy != null, "敌人对象未初始化");
3.图形辅助
Debug.DrawLine(start, end, color, duration)
在场景中绘制线段,用于可视化路径或距离。
Debug.DrawLine(transform.position, target.position, Color.red, 2f);
Debug.DrawRay(start, direction, color, duration)
绘制射线,常用于检测碰撞或方向。
Debug.DrawRay(transform.position, transform.forward * 10, Color.blue);
注意:上述两个方法都只能绘制线,但是不会返回任何信息,仅视觉作用
4.调试控制
Debug.Break()
暂停编辑器,方便检查当前状态。当代码执行到 Debug.Break() 时,Unity 编辑器会立即暂停(相当于手动点击工具栏的 暂停),冻结游戏时间轴。主要是用于指定内容执行完你想暂停查看才会使用,再点击上面的暂停结束就会恢复。
二、异常清单
| 异常类型 | 触发场景 | 示例代码(主动抛出) | 处理建议 |
|---|---|---|---|
NullReferenceException |
访问未初始化或已销毁的对象。 | csharp<br>if (obj == null) <br> throw new NullReferenceException("对象未初始化");<br> |
检查对象是否赋值,使用 null 判断或 [SerializeField] 确保引用有效。 |
MissingReferenceException |
访问已被 Destroy() 销毁的 Unity 对象。 |
csharp<br>if (destroyedObj == null) <br> throw new MissingReferenceException("对象已被销毁");<br> |
销毁对象后置为 null,或在访问前检查 GameObject 是否存在。 |
MissingComponentException |
试图获取不存在的组件。 | csharp<br>var rb = GetComponent<Rigidbody>();<br>if (rb == null) <br> throw new MissingComponentException("缺少 Rigidbody 组件");<br> |
使用 GetComponent 时添加 null 检查,或用 [RequireComponent] 属性。 |
ArgumentException |
方法参数不符合要求(如范围错误)。 | csharp<br>if (value < 0) <br> throw new ArgumentException("数值不能为负");<br> |
在方法入口验证参数合法性,提供明确的错误信息。 |
ArgumentNullException |
方法参数为 null。 |
csharp<br>if (input == null) <br> throw new ArgumentNullException("input 参数不能为 null");<br> |
使用 null 检查并抛出明确异常,避免后续逻辑崩溃。 |
IndexOutOfRangeException |
访问数组或集合的无效索引。 | csharp<br>if (index >= array.Length) <br> throw new IndexOutOfRangeException("索引越界");<br> |
确保索引在有效范围内,使用 for 循环或 foreach 遍历。 |
UnityException |
Unity 内部错误(如资源加载失败、非法操作)。 | csharp<br>if (!System.IO.File.Exists(path)) <br> throw new UnityException("资源文件不存在");<br> |
检查资源路径、权限或依赖关系,使用 try-catch 包裹可能失败的操作。 |
NotSupportedException |
当前平台不支持的操作(如调用仅限 Editor 的 API)。 | csharp<br>#if !UNITY_EDITOR<br> throw new NotSupportedException("此功能仅在 Editor 可用");<br>#endif<br> |
使用条件编译(#if UNITY_EDITOR)隔离平台相关代码。 |
InvalidOperationException |
在非法状态下调用方法(如未初始化完成时调用)。 | csharp<br>if (!isInitialized) <br> throw new InvalidOperationException("对象未初始化完成");<br> |
确保对象状态符合预期,添加状态标志位检查。 |
Custom Exception(自定义异常) |
业务逻辑错误(如玩家金币不足、技能冷却中)。 | csharp<br>public class NotEnoughCoinsException : Exception {<br> public NotEnoughCoinsException() : base("金币不足") {}<br>}<br> |
继承 Exception 类定义业务异常,在关键逻辑处抛出并处理。 |
第一点异常非常常见,在编写代码时千万注意对引用对象的判空处理。
小tips:
try-catch:在可能引发异常的代码块外包裹,避免程序崩溃。
try {
RiskyOperation();
} catch (Exception e) {
Debug.LogError($"操作失败: {e.Message}");
}
三、面板介绍
Statistics

音频部分(Audio - Suspended)
当音频系统处于暂停状态时,显示以下关键指标:
| 指标 | 含义 | 优化意义 |
|---|---|---|
| Level | 当前音频输出的音量级别,单位为分贝(dB)。负值表示相对于最大音量的衰减。 | 若音量异常低或高,需检查音频源的增益设置或混音器配置。 |
| DSP Load | 音频数字信号处理(DSP)占用的CPU资源百分比(0.4%表示极低负载)。 | 高值(如>10%)可能表明音频处理复杂,需优化音频效果链或减少同时播放的音效数量。 |
| Clipping | 音频信号削波的比例(0.0%表示无削波)。削波是音频信号超过设备最大电平导致的失真。 | 若出现削波,需降低音频源音量或使用动态压缩(Compressor)效果。 |
| Stream Load | 音频流(如从磁盘加载的音频文件)处理的CPU负载。 | 高值可能因频繁加载大文件导致,建议使用内存加载(Decompress On Load设为false)。 |
图形部分(Graphics)
实时渲染性能的核心指标
| 指标 | 含义 | 优化意义 |
|---|---|---|
| CPU: main / render thread | 主线程(逻辑计算)和渲染线程的时间消耗(12.7ms + 1.5ms ≈ 总帧时间)。 | 总帧时间超过目标帧时间(如16ms@60FPS)需优化代码逻辑或减少渲染负载。 |
| Batches | 当前帧的绘制调用次数(6次)。合批(Batching)可减少次数。 | 高批次(如>100)需合并材质(相同Shader和纹理)或使用GPU Instancing。 |
| Saved by batching | 通过合批节省的绘制调用次数(0表示未节省)。 | 若数值低,需检查材质差异或静态/动态批处理设置(勾选Static Batching)。 |
| Tris / Verts | 当前帧渲染的三角形数(1.7k)和顶点数(5.1k)。 | 高值可能导致GPU负载过高,需简化模型LOD(层次细节)或遮挡剔除(Occlusion Culling)。 |
| Screen | 当前屏幕分辨率(1038x398)及显存占用(4.7MB)。 | 高分辨率或显存占用可能需降低纹理分辨率或使用压缩格式(如ASTC)。 |
| SetPass calls | 渲染通道切换次数(6次),每次切换可能涉及材质或Shader变更。 | 减少材质多样性或使用Shader变体(Variants)合并。 |
| Shadow casters | 当前投射阴影的对象数量(1个)。 | 阴影计算开销大,可减少动态阴影数量或改用烘焙光照(Baked Lighting)。 |
| Visible skinned meshes | 可见的蒙皮网格(如角色动画)数量(0个)。 | 蒙皮网格计算较耗CPU,需优化骨骼数量或使用GPU Skinning。 |
| Animation components playing | 正在播放的传统动画组件数量(0个)。 | 旧版Animation组件性能较差,建议升级为Animator组件。 |
| Animator components playing | 正在播放的Animator组件数量(0个)。 | 大量Animator可能影响性能,需合并动画状态机或使用优化插件(如Animancer)。 |
有些术语可能不太清楚,没关系,搜就是了,这里只是列个清单。
这里是一个专注于游戏开发的社区,我们致力于为广大游戏爱好者提供一个良好的学习和交流平台。我们的专区包含了各大流行引擎的技术博文,涵盖了从入门到进阶的各个阶段,无论你是初学者还是资深开发者,都能在这里找到适合自己的内容。除此之外,我们还会不定期举办游戏开发相关的活动,让大家更好地交流互动。加入我们,一起探索游戏开发的奥秘吧!
更多推荐


所有评论(0)