【Unity开发技能】使用Gizmos进行可视化调试

引言

在这篇简短精炼的博客文章中,我们将探索Unity的Gizmos作为一个极好的可视化调试工具。虽然对一些人来说,这可能是一个稍微有些小众的用例,但当你需要Gizmos时,它们会非常有用。

Gizmos的简单示例

让我们从一个简单的示例开始。我的Discord上有人正在为他们制作的2D平台游戏中创建一个能量增强道具。当玩家收集或使用这个增强道具时,会进行一个Z字形跳跃。跳跃的路径应由一些空的子对象的位置预先确定。使用空的子对象很容易,但通常我们真正需要的是一个Vector3位置。空子对象只是一个可以轻松移动和在场景视图中可视化的占位符。

但是!在Z字形跳跃的情况下,Gizmos可以消除这些空对象的需求,同时在清理层次结构的同时仍然提供这些位置的可视化。让我们一起看看如何实现这一功能。

跳跃可视化代码

首先,我们需要创建一个Vector3列表——这些将是相对于玩家的位置。然后我们需要添加OnDrawGizmos()函数。在函数中,我们可以检查列表是否为空,如果不为空,我们可以绘制我们的Gizmos。

要开始绘制,我们首先需要为Gizmos设置一种颜色。

设置颜色

旁注:重要的是要知道,你在这里设置的颜色将应用于设置颜色之后绘制的所有Gizmos,或者直到颜色被设置为不同的值。你不是为特定的Gizmo设置颜色。这与Unity其他对象有点不同,但同样非常容易。

场景视图中的跳跃可视化

确保“显示Gizmos”按钮被打开。

设置颜色后,我们可以遍历列表中的点并调用Gizmo.DrawSphere()。这个函数接受一个位置(以世界空间为单位)以及要绘制的球体的半径。

就这样。

如果我们回到Unity,确保组件被添加到一个对象上,然后我们可以在列表中设置值,并且Gizmos将实时绘制,就像我们调整Vector3值一样。

如果你看不到Gizmos,请确保你正在查看场景视图,Gizmos不会在游戏视图中绘制,并且“显示Gizmos”按钮被打开。

添加线条

添加线条代码

好的,让我们进一步操作。假设你想要添加一条线到路径上,以便进行更好的可视化。这可能有额外的好处,比如确保你的点按正确的顺序排列!

我们完全可以在一个for循环中完成这一切,但为了清楚起见,我将添加第二个循环。

然而,在第二个循环开始之前,我将把Gizmos的颜色改为蓝色。

添加线条场景视图

在我们的例子中,我们需要一些特殊处理,因为我们的列表中没有起始点。所以如果索引是零,我们将从“这个”对象到第一点绘制线条。如果索引不是零,我们将从上一点绘制到当前点。

再次注意,我们的点在局部空间,我们正在世界空间绘制,所以我们必须把“这个”对象的位置添加到每个点上。

快速风格评论,如果你不喜欢线条穿过球体或者实际上被绘制在球体上面,你可以把线条绘制代码放在球体绘制代码之前——这会导致线条先被绘制,让东西看起来更好一些。

仅在选择时绘制

仅在选择时绘制代码

如果你想让你的Gizmos只在对象被选择时绘制,你可以把所有的代码放入OnDrawGizmosSelected()而不是OnDrawGizmos()

或者,如果你想变得疯狂和大胆,你可以把线条绘制代码放在OnDrawGizmosSelected(),把球体绘制代码留在OnDrawGizmos()

选择权在你。

绘制更多东西

还有更多类型的Gizmos可以绘制,如射线、图标、线框球体等等。查看**Unity文档**以获取更多详细信息。每种Gizmo都有自己的用途,但大画面功能基本相同。添加一个DrawGizmo函数,设置颜色,然后用你可能需要的任何逻辑绘制你的Gizmo。

我个人发现Gizmos对于在运行时生成的数据非常有用。如果你看,你会发现Gizmos在各种第三方资产或工具中被用来帮助调试或找到特定用例的正确设置。

Unity 中,`Gizmos.matrix` 是一个静态属性,用于指定当前 `Gizmos` 绘制命令所使用的变换矩阵。默认情况下,`Gizmos` 使用世界坐标系进行绘制。但是有时候我们希望根据某个特定的游戏对象或自定义变换来进行绘图操作,这时就可以通过设置 `Gizmos.matrix` 来改变绘图空间。 当你设置了新的变换矩阵给 `Gizmos.matrix` 后,之后所有的 `Gizmos.Draw...` 操作都会在这个新矩阵的作用下被执行,直到你将 `Gizmos.matrix` 重置回单位矩阵 (`Matrix4x4.identity`) 或者恢复之前的值为止。 例如,如果你想在一个旋转和平移后的局部坐标系统内绘制一些辅助图形(比如箭头指示方向),你可以这样做: ```csharp void OnDrawGizmos() { Matrix4x4 originalMatrix = Gizmos.matrix; // 存储原始矩阵 try { // 假设有一个目标游戏对象 targetObject, // 我们想基于它的本地空间绘制 gizmo. Transform t = this.transform; Gizmos.matrix = t.localToWorldMatrix; // 应用变换 // 开始在此转换后的坐标系中绘制gizmo... Gizmos.color = Color.green; Gizmos.DrawLine(Vector3.zero, Vector3.forward * 2); Gizmos.color = Color.red; Gizmos.DrawLine(Vector3.zero, Vector3.right * 2); Gizmos.color = Color.blue; Gizmos.DrawLine(Vector3.zero, Vector3.up * 2); } finally { Gizmos.matrix = originalMatrix; // 最终记得还原回去 } } ``` 此代码片段将在编辑模式下的视窗中显示一个绿色、红色和蓝色的轴向指示符,它们表示沿 Z 轴正向伸出的线段以及 X 和 Y 方向上相应的投影,所有这些都是相对于该脚本附加到的对象的位置与朝向而言的。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Unity打怪升级

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值