• 游戏
  • 工业
  • 资源
  • 社区
  • 学习
  • 支持
开发
Unity 引擎
为任何平台构建2D和3D游戏
下载计划和定价
商业化
应用内购买(IAP)
发现并管理各商店的IAP
聚合平台
最大化收入并优化变现
Ad Quality
保护您应用的用户体验
Tapjoy
建立长期用户忠诚度
所有变现产品
用户获取
用户获取
被发现并获取移动用户
Unity向量AI
将玩家与合适的游戏连接
Aura设备内广告
在用户高峰参与时触达用户
所有增长产品
使用案例
3D协作
实时构建和审查3D项目
沉浸式培训
在沉浸式环境中培训
客户体验
创建互动3D体验
所有行业解决方案
行业
制造业
实现运营卓越
零售
将店内体验转化为在线体验
汽车
提升创新和车内体验
所有行业
技术库
文档
官方用户手册和API参考
开发者工具
发布版本和问题跟踪器
路线图
查看即将推出的功能
术语表
技术术语库
洞察
案例分析
真实成功案例
最佳实践指南
专家提示和技巧
所有资源
新增功能
博客
更新、信息和技术提示
新闻
新闻、故事和新闻中心
社区中心
讨论
讨论、解决问题和连接
事件
全球和本地活动
社区故事
Made with Unity
展示Unity创作者
直播活动
加入开发者、创作者和内部人员
Unity奖项
庆祝全球的Unity创作者
适合每个级别
Unity Learn
免费掌握Unity技能
专业培训
通过Unity培训师提升您的团队
Unity新手
准备开始
开始您的学习
Unity基础路径
你是Unity 新手?开始您的旅程
使用指南
可操作的技巧和最佳实践
教育
对于学生
开启您的职业生涯
对于教育者
增强您的教学
教育资助许可证
将Unity的力量带入您的机构
认证
证明您的Unity精通
支持选项
获取帮助
帮助您在Unity中取得成功
成功计划
通过专家支持更快实现目标
常见问题解答
常见问题解答
联系我们
与我们的团队联系
计划和定价
语言
  • English
  • Deutsch
  • 日本語
  • Français
  • Português
  • 中文
  • Español
  • Русский
  • 한국어
社交
货币
采购
  • 产品
  • Unity Ads
  • 订阅
  • Unity Asset Store
  • 经销商
教育
  • 学生
  • 教师
  • 机构
  • 认证
  • 学习
  • 技能发展计划
下载
  • Unity Hub
  • 下载存档
  • Beta 版测试
Unity Labs
  • 实验室
  • 作品
资源
  • 学习平台
  • 社区
  • 文档
  • Unity QA
  • 常见问题解答
  • 服务状态
  • 案例分析
  • Made with Unity
Unity
  • 我们公司
  • 新闻简报
  • 博客
  • 事件
  • 工作机会
  • 帮助
  • 新闻
  • 合作伙伴
  • 投资人
  • 附属机构
  • 安防
  • 社会影响力
  • 包容性与多样性
  • 联系我们
版权所有 © 2025 Unity Technologies
  • 法律
  • 隐私政策
  • Cookie
  • 不要出售或分享我的个人信息

“Unity”、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其分支机构在美国及其他地区的商标或注册商标(单击此处获取更多信息)。其他名称或品牌是其各自所有者的商标。

Hero background image

通过Unity的Debug类加速和改善QA测试

为方便起见,此网页已进行机器翻译。我们无法保证翻译内容的准确性或可靠性。如果您对翻译内容的准确性有疑问,请参阅此网页的官方英文版本。
请点击这里。

继续阅读以了解如何使用Unity的Debug类改善您的QA和调试过程。

虽然您可能已经熟悉Debug.Log函数,但Unity的Debug类支持许多其他方便的函数,可以帮助您加快测试和调试。本页面解释了如何在场景和游戏视图中使用Debug类进行Gizmo可视化,如何从脚本暂停编辑器中的播放模式,以及更多提示。

  • 错误、警告和消息
  • 配置您的堆栈跟踪
  • 使用LogFormat显示变量
  • 附加参数
  • 使用Debug.Assert
  • 使用Debug.Break
  • Debug.DrawLine
  • Debug.DrawRay
  • 使用Gizmos
  • 抛出异常
  • 更多资源

错误、警告和消息

如果您对Unity很熟悉,那么您可能已经使用过控制台窗口来显示编辑器生成的错误、警告和其他消息。您也肯定使用Debug类将自己的消息打印到控制台。

但您并不局限于仅使用Debug.Log消息。当您创建输出字符串到控制台窗口时,可以指定三种类型之一(错误、警告和消息),每种类型都有自己的图标类型。

这三种变体是:

  • Debug.Log(“这是一条日志消息。”)
  • Debug.LogWarning(“这是一个警告信息。”)
  • Debug.LogError(“这是一个错误信息。”)

您可以使用控制台窗口根据您的偏好过滤消息。您还可以利用控制台窗口中启用的错误暂停,因为您通过调试类写入控制台的任何错误都会导致Unity的播放模式暂停。

输出到控制台窗口的所有内容,无论是Unity还是您自己的消息,都被添加到一个日志文件中,您可以参考该文件以查看应用程序中出现问题的位置。每个操作系统将日志文件存储在不同的位置,因此请查看文档以查看每个系统的规格。

如何使用Roslyn分析器调试游戏代码
堆栈跟踪选项可以在项目设置 > 玩家下找到。
堆栈跟踪选项可以在项目设置 > 玩家下找到。

配置您的堆栈跟踪

当抛出错误或异常时,控制台窗口会显示堆栈跟踪以及错误信息,以帮助您理解错误是如何发生的以及它的来源。虽然Debug.Log允许您向控制台发送消息,但您还可以配置堆栈跟踪中显示的详细程度。

默认情况下,控制台中的输出链接到生成消息的代码行,使您能够轻松识别导致该条目出现的行、方法或函数调用序列。

如果脚本未在您选择的IDE中打开,请转到文件 > 首选项 > 外部工具并从下拉菜单中选择“外部脚本编辑器”。

您可以通过文件 > 构建设置… > 玩家设置… > 其他设置在编辑器中配置堆栈跟踪中显示的信息。

每种日志类型可用的选项如下:

  • 无:不会输出堆栈跟踪到日志。
  • 仅脚本:仅会输出托管堆栈跟踪。如果您没有更改设置,这是默认选项。
  • 完整:本地和托管的堆栈跟踪将被记录。

如果您的日志变得拥挤,请利用控制台中的搜索功能。当您输入搜索词时,控制台会过滤消息,仅显示包含匹配文本的消息。

通过单击控制台菜单按钮并从菜单中选择日志条目 > [X] 行,控制每个条目在列表中可见的行数,其中 [X] 是要为每个条目显示的行数。

使用LogFormat显示变量

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.LogWarningFormat("Cube.position.x 的值是 {0:0.00}", transform.position.x)
  • Debug.LogErrorFormat("Cube.position.x 的值是 {0:0.00}", transform.position.x)

如果你使用 Debug.Logformat 向控制台发送一个浮点值,默认显示将显示小数点后六个数字。你可以使用自定义数字格式字符串来控制这种行为。

Debug.LogFormat("pi = {0:0.00}", Mathf.PI);

通过使用冒号,格式字符串 0.00 将显示值的整数部分、小数分隔符和分隔符后面的两个数字。最后一个数字将根据下一个值进行四舍五入,熟悉的方法是 4 向下取整,5 向上取整。

在这个例子中,输出将是:pi = 3.14

如何使用 Unity 测试框架为你的游戏运行自动化测试

使用Debug.Assert

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

Debug.Break() 是 Unity 的 Debug 类提供的一种方法,用于暂停游戏的执行并在代码的当前点进入调试器。它允许你检查游戏的状态,并逐行执行代码以查找和修复错误。

当调用 Debug.Break() 时,它会暂停游戏的执行并打开调试器窗口。这使您可以检查游戏的状态并根据需要调试代码。您可以使用调试器逐步执行代码,设置断点,并检查内存中的变量和对象。

例如,您可能希望在 NPC 距离玩家角色的目标距离内时停止游戏。当游戏中断时,您可以在检查器中检查其状态:

float dist = Vector3.Distance(transform.position, npc.position);

if ( dist < 5) Debug.Break();

场景视图中的 Debug.DrawLine
场景视图中的 DEBUG.DRAWLINE

Debug.DrawLine

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);

参数

  • start:世界空间中线条的起点
  • end:世界空间中线条的终点
  • color:线条颜色
  • duration:显示线条的时间(以秒为单位)。0表示线条仅显示一帧
  • depthTest:线条是否被前景物体隐藏

在代码示例中,附加到Skeleton GameObject的MonoBehaviour脚本的Update方法导致了上面看到的图像。仅在启用gizmos时,线条在游戏视图中可见。点击游戏视图窗格右上角的Gizmo按钮以启用它们。线条在场景视图中也可见。

Debug.DrawRay

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);

代码示例中的参数为:

  • start:世界空间中线条的起点
  • dir:线的方向和长度在世界空间中
  • color:线条颜色
  • duration:以秒为单位显示线的时间;0 表示线在单帧中显示
  • depthTest:线条是否被前景物体隐藏

这是另一个代码示例:

Vector3 dir = transform.TransformDirection(Vector3.forward) * 3;Debug.DrawRay(transform.position, dir, Color.white, 0, false);

在这个代码示例中,附加到 Skeleton GameObject 的 MonoBehaviour 脚本的 Update 方法导致了上面的图像。具有长度的射线对于调试接近测试非常有用。在这里,射线长度为 3 个世界单位。如果攻击应该在 3 个单位处开始,那么你就可以很好地可视化 3 个单位在你的场景中的长度。

Unity 项目的测试和质量保证提示

显示 Gizmo
显示 GIZMO

使用Gizmos

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项目性能的信息:

  • 如何使用Roslyn分析器调试游戏代码
  • 如何使用 Unity 测试框架为你的游戏运行自动化测试
  • 使用Microsoft Visual Studio Code加快调试工作流程
  • 如何使用Microsoft Visual Studio 2022调试代码
  • Unity 项目的测试和质量保证提示

深入了解Unity开发者的高级最佳实践和说明,阅读这些电子书:

  • Unity 游戏性能分析终极指南
  • 优化您的移动游戏性能
  • 优化您的控制台和PC游戏性能

在Unity 最佳实践中心中找到更多高级资源。