
继续阅读以了解如何使用Unity的Debug类改善您的QA和调试过程。
虽然您可能已经熟悉Debug.Log函数,但Unity的Debug类支持许多其他方便的函数,可以帮助您加快测试和调试。本页面解释了如何在场景和游戏视图中使用Debug类进行Gizmo可视化,如何从脚本暂停编辑器中的播放模式,以及更多提示。
如果您对Unity很熟悉,那么您可能已经使用过控制台窗口来显示编辑器生成的错误、警告和其他消息。您也肯定使用Debug类将自己的消息打印到控制台。
但您并不局限于仅使用Debug.Log消息。当您创建输出字符串到控制台窗口时,可以指定三种类型之一(错误、警告和消息),每种类型都有自己的图标类型。
这三种变体是:
您可以使用控制台窗口根据您的偏好过滤消息。您还可以利用控制台窗口中启用的错误暂停,因为您通过调试类写入控制台的任何错误都会导致Unity的播放模式暂停。
输出到控制台窗口的所有内容,无论是Unity还是您自己的消息,都被添加到一个日志文件中,您可以参考该文件以查看应用程序中出现问题的位置。每个操作系统将日志文件存储在不同的位置,因此请查看文档以查看每个系统的规格。

当抛出错误或异常时,控制台窗口会显示堆栈跟踪以及错误信息,以帮助您理解错误是如何发生的以及它的来源。虽然Debug.Log允许您向控制台发送消息,但您还可以配置堆栈跟踪中显示的详细程度。
默认情况下,控制台中的输出链接到生成消息的代码行,使您能够轻松识别导致该条目出现的行、方法或函数调用序列。
如果脚本未在您选择的IDE中打开,请转到文件 > 首选项 > 外部工具并从下拉菜单中选择“外部脚本编辑器”。
您可以通过文件 > 构建设置… > 玩家设置… > 其他设置在编辑器中配置堆栈跟踪中显示的信息。
每种日志类型可用的选项如下:
如果您的日志变得拥挤,请利用控制台中的搜索功能。当您输入搜索词时,控制台会过滤消息,仅显示包含匹配文本的消息。
通过单击控制台菜单按钮并从菜单中选择日志条目 > [X] 行,控制每个条目在列表中可见的行数,其中 [X] 是要为每个条目显示的行数。
C# 中的 字符串格式化 方法允许您创建一个包含嵌入格式化变量数据的字符串。Debug 类具有 Debug.LogFormat,它使用相同的语法。
第一个参数是格式化的消息字符串。通过在大括号中包含索引值,这将通过参数索引-1 使用其 ToString 方法进行替换(如果存在),或者使用系统字符串转换。在上面的代码示例中,第 14 行,{0} 将被 origin.ToString() 替换。
一个更复杂的示例是:
Debug.LogFormat("在开始时 transform.position={0}, transform.rotation={1}", transform.position, transform.rotation);
{0} 将被参数 1 替换,transform.position,而 {1} 将被参数 2 替换,transform.rotation。在每种情况下,将使用 Vector3 和 Quaternion 属性的 ToString 方法。结果将如下所示:
“原点是 (0.00, 0.00, 0.00)
UnityEngine.Debug:LogFormat (string,object[])”
您还可以为这些日志方法提供一个可选的第二个参数,以指示该消息与特定的 GameObject 相关联:
Debug.LogWarning("我来是和平的!", this.gameObject);
当您显示格式化的变量数据时,Debug.LogFormat 有警告和错误版本:
如果你使用 Debug.Logformat 向控制台发送一个浮点值,默认显示将显示小数点后六个数字。你可以使用自定义数字格式字符串来控制这种行为。
Debug.LogFormat("pi = {0:0.00}", Mathf.PI);
通过使用冒号,格式字符串 0.00 将显示值的整数部分、小数分隔符和分隔符后面的两个数字。最后一个数字将根据下一个值进行四舍五入,熟悉的方法是 4 向下取整,5 向上取整。
在这个例子中,输出将是:pi = 3.14
Debug.Assert() 类似于 Debug.Log() 方法,但它不是将消息记录到控制台,而是测试一个条件,如果条件为假,则显示错误消息。它用于验证假设并在开发过程中捕捉错误。
断言是检查你的程序是否进入意外状态的好方法。它们就像在 if 语句中嵌入一个日志。当你在一个依赖于类属性被赋值的方法上工作时,断言可以帮助你追踪错误。
当调用 Debug.Assert() 时,它接受两个参数:一个要测试的条件和一个可选的消息,如果条件为假则显示。如果条件为真,则什么也不会发生,程序继续运行。如果条件为假,程序停止运行,并在编辑器中显示错误消息。
void SetColor(Color color)
{
Debug.Assert(material != null, "ChangeColor: material 未分配");
material.SetColor("_Color", color);
}
如果你调用 SetColor 而 material 未分配,‘SetColor: material 未分配’ 将显示在控制台中。
Debug.Break() 是 Unity 的 Debug 类提供的一种方法,用于暂停游戏的执行并在代码的当前点进入调试器。它允许你检查游戏的状态,并逐行执行代码以查找和修复错误。
当调用 Debug.Break() 时,它会暂停游戏的执行并打开调试器窗口。这使您可以检查游戏的状态并根据需要调试代码。您可以使用调试器逐步执行代码,设置断点,并检查内存中的变量和对象。
例如,您可能希望在 NPC 距离玩家角色的目标距离内时停止游戏。当游戏中断时,您可以在检查器中检查其状态:
float dist = Vector3.Distance(transform.position, npc.position);
if ( dist < 5) Debug.Break();

Debug.DrawLine 和 Debug.DrawRay 是 Unity 的 Debug 类提供的两种用于可视化调试的方法。它们对于测试和可视化与物理相关的代码非常有用,例如碰撞和射线投射。两者都允许您绘制在游戏和场景视图中可见的彩色线条。例如,您可以使用 Debug.DrawRay 可视化子弹的轨迹或激光束的路径,并使用 Debug.DrawLine 可视化碰撞体的边界或物体的移动。
Debug.DrawLine 用于在场景中绘制两点之间的直线:
Debug.DrawLine(transform.position, target.position, Color.white, 0, false);
它需要两个到五个参数:起始点、结束点和一个可选的颜色。例如,以下代码将绘制起点和终点之间的白色线条:
public static void DrawLine(Vector3 start, Vector3 end, Color color = Color.white, float duration = 0.0f, bool depthTest = true);
参数
在代码示例中,附加到Skeleton GameObject的MonoBehaviour脚本的Update方法导致了上面看到的图像。仅在启用gizmos时,线条在游戏视图中可见。点击游戏视图窗格右上角的Gizmo按钮以启用它们。线条在场景视图中也可见。
DrawLine的替代方法是DrawRay。Debug.DrawRay用于在场景中绘制一条射线,从指定的起点开始,并朝指定方向延伸。默认情况下,它是一条无限射线。当Debug.DrawRay()绘制的射线与碰撞体相交时,它将在交点停止,不会继续向前。这种行为与Unity中的射线投射相同,用于检测场景中物体之间的碰撞。
这里第二个参数定义了线条的方向和长度。线将从 start 绘制到 start + dir:
public static void DrawRay(Vector3 start, Vector3 dir, Color color = Color.white, float duration = 0.0f, bool depthTest = true);
代码示例中的参数为:
这是另一个代码示例:
Vector3 dir = transform.TransformDirection(Vector3.forward) * 3;Debug.DrawRay(transform.position, dir, Color.white, 0, false);
在这个代码示例中,附加到 Skeleton GameObject 的 MonoBehaviour 脚本的 Update 方法导致了上面的图像。具有长度的射线对于调试接近测试非常有用。在这里,射线长度为 3 个世界单位。如果攻击应该在 3 个单位处开始,那么你就可以很好地可视化 3 个单位在你的场景中的长度。

Gizmos 是 Unity 中用于视觉调试的强大工具。它们允许你在场景视图中绘制简单的 2D 和 3D 形状、线条和文本,使你能够轻松地看到和理解游戏世界中发生的事情。
你可以用几行代码在场景视图中绘制简单的形状和线条。这使它们成为快速原型设计和测试游戏机制的理想工具。它们是实时绘制的,因此你可以立即看到代码更改的结果并进行必要的更改。
Gizmos 表示视觉上复杂的游戏机制,这些机制可能仅通过代码难以理解。例如,您可以使用 Gizmos 绘制一条线,显示弹丸的路径或可视化触发区域的边界,如上图所示。
使用 gizmos 创建视觉辅助工具,使其他团队成员更容易理解您的代码和游戏机制。
Gizmos 对性能的影响很小,因此您可以自由使用它们,而不会降低性能。
gizmo 图标位于场景和游戏视图的右上角。要添加自定义 gizmo,您需要添加一个包含 OnDrawGizmos 回调的脚本,如下面的代码示例所示。此脚本将在 GameObject 的位置前方 3 个世界单位处绘制一个线框立方体。立方体的大小由类型 Vector3 的类属性 vsize 定义:public Vector3 vsize = new Vector3(1f, 1f, 1f);
void OnDrawGizmos()
{
// 在变换的位置绘制一个黄色球体
Gizmos.color = Color.yellow;
Vector3 position = transform.position + transform.TransformDirection(Vector3.forward) * 3;
Gizmos.DrawWireCube(position, vsize);
}
通过单击 gizmos 下拉菜单控制可见性。任何带有 OnDrawGizmos 回调的脚本将被列出。
查看 documentation 以了解有关 Gizmo 类的其他有用方法。
抛出异常是一种编程技术,用于指示在程序执行期间发生了错误或异常情况。您可以使用此方法停止线程的进一步执行,以防止进一步的损害。
在 Unity 中,抛出异常的方式与其他编程语言相同。
如果抛出异常而未在代码中捕获和处理,则程序执行通常会停止,您将被抛出应用程序并返回操作系统。在 Unity 中,程序执行会立即停止,运行时环境会查找可以处理异常的“catch”块。如果没有找到捕获块,程序将终止,并将异常记录到控制台。
抛出异常是有帮助的,因为这允许您将错误处理逻辑与程序的其余逻辑分开,这有助于编写更清晰的代码。通过抛出异常,您可以向调用者发出信号,表示出现了问题,而无需依赖返回值或全局状态来传达错误。
要在Unity中抛出异常,您可以使用throw关键字后跟异常对象。这是一个示例:
if (target == null)
{
throw new System.NullReferenceException("target not set!");
}
当您在编辑器中运行代码时,它会捕获抛出的错误,并执行Debug.LogError(),而不是崩溃Unity或应用程序。
在Unity中使用异常可以让您尽早捕获错误。它还可以通过提供有关错误发生位置和原因的更多信息来简化调试。

在这些文章中了解更多关于测试、调试和改善Unity项目性能的信息:
深入了解Unity开发者的高级最佳实践和说明,阅读这些电子书:
在Unity 最佳实践中心中找到更多高级资源。