引言
在这篇简短精炼的博客文章中,我们将探索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在各种第三方资产或工具中被用来帮助调试或找到特定用例的正确设置。