Skip to main content

碰撞体按钮与 Udon

这节课延续了上节课的内容,我们将学习如何制作一个 World Space UI 按钮,用于决定玩家与某些物体是否发生碰撞,或者更具体地说,在导游和默认图层之间切换这些物体。

右键单击 Project(项目) 选项卡 的空白处,选择 Create > VRChat > Udon > Udon Graph Program Asset。将新生成的文件重命名为 Collider Toggle。复制一个开关,并将对象和标签重命名为 Colliders。点击开关,添加 UdonBehavior 组件,然后将Udon脚本拖入其中。在切换器组件的底部,点击减号按钮删除旧插槽,然后点击加号图标并拖动 UdonBehavior。点击项目视图中的程序,然后点击“打开Udon图”。现在应该会弹出Udon选项卡!

首次打开 Udon 选项卡将会看到一个欢迎界面。如果您想要更改网格大小,请将其设置为20,但这只是我的个人偏好。现在点击“打开Collider Toggle”,这就是Udon图! Udon是一种可视化脚本,本质上是代码,但以节点形式展现,而不是纯文本行。我明白“编码”可能会吓到一些人,但实际上并不像想象中那么难。即使您在接下来不希望再涉足Udon,也无妨,我将会在整个教程中一直引导您。

最好首先考虑我们的代码在纯逻辑上的运行方式,即我们可以在之后转换为代码的纯文本步骤。

在运行代码之前,首要条件是所有对象位于相同的图层上,并且我们需要一个包含所有要切换对象的列表。

  • 当代码开始执行时,我们需要检查第一个对象是否位于默认图层上。(因为它们都在同一个图层上,检查一个即可。)
  • 如果它在默认图层上,那意味着其他所有对象也在默认图层上,我们希望将它们切换到导游图层。
  • 如果它不在默认图层上,那意味着所有对象都在导游图层上,我们希望将它们切换到默认图层。

首先,我们需要创建一些变量。变量用于存储稍后可以引用或操作的信息。我们可以为许多类型的数据创建不同类型的变量,例如整数(本质上是整数)、布尔值(真或假)、游戏对象以及许多其他类型的组件。变量也可以是一个数组,这是一个由相同类型的多个变量组成的集合。数组使用方括号表示在变量类型旁边。我们可以通过单击左上角变量菜单中的加号来添加新变量到我们的脚本中。

我们首先需要的变量是一个游戏对象数组,用方括号标记。将其重命名为“Targets”。单击新变量旁边的箭头并选中“public”,这样我们的变量可以在脚本外部进行访问。如果您单击我们为您制作的collider toggle UI按钮,您应该在检查器中看到它。请确保拖动的是实际具有碰撞器的游戏对象!子对象不会受到影响!

最后,我们需要两个整数类型的变量来表示层。在Unity中,层按数值顺序进行存储,并且必须通过分配的编号进行引用。如果您单击任何组件上的层下拉菜单,您可以看到默认层是0,教程层是17。添加两个整数变量,将一个的默认值设为0,另一个设为17。将它们重命名为defaultLayer和walkthroughLayer。

现在我们可以开始添加节点了!关于节点,您应该了解的是,单个节点表示数据或操作。节点的左侧是输入,右侧是输出。我知道编程对于完全初学者来说可能有些令人生畏,但是经过本课程学习之后,您将开始了解一些基础知识。

按空格键在空白网格中进行快速搜索,这是我们可以添加新节点的方式。我们首先需要的是一个开始脚本其余部分的节点。这种节点类型称为事件,我们希望脚本在按下切换键时运行,因此搜索“事件自定义”。在节点框中输入“ColliderToggle”。然后,在检查器中的切换组件下,将“no function”更改为UdonBehavior.SendCustomEvent(String)。复制并粘贴“ColliderToggle”到框中。

接下来,我们需要检查数组中的第一个游戏对象是否在默认层中。首先,从左上角的菜单中单击并拖动Targets数组变量到网格中。这将创建一个节点,用来访问我们的游戏对象数组;然而,我们只需要第一个游戏对象,而不是所有对象。从节点中拖动出来,然后搜索并添加“get”。这个节点允许我们从游戏对象数组中获取一个游戏对象。因为0表示数组中的第一个元素,所以只需将0留在框中。在编程中,0通常是事物的起始数字,而不是1。

现在,我们需要获取游戏对象所在的层。从获取游戏对象中拖动出来,搜索"layer"并选择"get layer"。

现在,我们得到了第一个游戏对象的层级,它是一个整数。我们希望将其与表示默认图层的整数进行比较,以查看它们是否匹配。从获取图层中拖动并搜索"等于"。将默认图层的变量拖到网格中,并插入到整数槽中。"等于"函数比较这两个整数,看它们是否相同。如果它们相同,则输出为真;如果不同,则输出为假。

您可能已经注意到,在插入默认图层之前,该输入值已经是零。实际上,我们可以点击框并将其设置为我们想要的任何值。由于默认图层是一个常量(始终是相同的数字,即0),我们可以根本不创建默认图层整数变量。我告诉您这一点的原因是为了使代码更易于阅读,特别是当常量在代码中多次使用时。

在继续之前,最好将代码组织成小组,以便更易阅读。在刚创建的所有节点上,除了自定义事件节点外,右键单击并选择"创建组"。现在,所有这些节点都在一个大的框中。双击该组以重命名为"第一个游戏对象是否在默认图层上?"。您还可以右键单击创建注释。这通常被初学者忽略,但在其他人尝试解释您的代码时,或者在长时间后尝试解释自己的代码时,这确实是一个很好的帮助。

数组中的所有游戏对象应该在相同的图层上。如果第一个游戏对象在默认图层上,则意味着数组中的所有游戏对象都在默认图层上,我们希望将它们全部更改为教程图层。如果第一个游戏对象在教程图层上,则我们希望做相反的事情。

"如果"语句在我们的逻辑中通常表示我们希望在代码中有一个分支。从等于节点中拖动并搜索"分支"。将自定义事件箭头拖动到左分支箭头。

让我们从真分支开始。我们想要遍历数组中的所有对象,并将它们更改为教程图层。如果我们想要重复相同的代码,这通常意味着我们想要一个循环。有一种特殊的循环用于数组,称为for循环(如果您正在使用UdonSharp,则是foreach循环)。搜索"for"并添加它。将真分支从分支拖动到for循环的左箭头。

由于我们的数组从0开始,所以只需将那个输入保持为0。对于结束输入,我们希望得到数组中对象的数量。将目标数组从变量菜单拖动到网格中。从节点输出中拖动并搜索"长度"。选择第一个"getLength",小写字母"g"和两个分开的单词。现在将那个长度输出拖到for循环的"结束"输入。我们希望步骤为1,所以只需保持那个。

for循环本质上是执行代码主体以遍历数组中的每个游戏对象。代码运行多少次取决于3个输入。

image.png

既然我们已经设置了for循环,我们想要将游戏对象的图层从默认更改为walkthrough,从0更改为17。再将目标拖动到网格中,并从输出中拖出并搜索get。该节点将会输出数组中的一个游戏对象。将for循环中的整数索引拖至get gameobject节点的整数输入中。这样我们就可以获取特定游戏对象对应for循环所在的索引位置。因此,如果for循环位于第一个索引处,get gameobject节点将给出数组中第一个索引处的游戏对象。

从gameobject中拖出,搜索layer并选择set layer。将walkthroughLayer变量拖至网格中并连接至整数值输入。现在将for循环的主体箭头连接至set layer节点。

这就是真分支的全部操作!对于数组中的每个游戏对象,其图层都将被设置为walkthrough图层!概述所有代码并创建一个新组,并将其命名为“设置为walkthrough图层”。

假分支实际上非常相似。只需选择真分支中的所有节点,按ctrl+d进行复制,将它们向下拖动,然后用默认图层替换walkthrough图层。将假分支连接至for循环,创建一个名为“设置为默认图层”的新组,单击窗口右上角的compile,然后完成!

image.png

现在,只需使用CyanEmu(按播放)进行测试!

当您在运行脚本时,可以利用Debug Log向控制台发送消息,这对于问题的解决非常有帮助。

需要强调的是,我无法在YouTube评论部分为您提供帮助。对于一些初学者来说,可能会遇到问题,但YouTube评论部分并不是为提供实时帮助而设计的。最好的选择是检查控制台是否有错误,自行解决问题,并在需要时在VRChat官方Discord的udon频道(如果您使用udonsharp,请在udonsharp Discord)提问。请避免在YouTube评论部分发问,我无法在那里帮助您。

有一种更简单的方法可以为SDK3创建这些Udon系统,它可以模拟SDK2中Triggers的工作方式,被称为CyanTriggers。这是一个扩展,可以从GitHub免费下载,也可以从创建者Cyanlazer的Patreon获取最新版本。我对这两者都不太熟悉,出于避免导入太多可能发生更改的外部工具的考虑,我并未涉及。我会向那些不熟悉编程或不想学习编程的人推荐CyanTriggers,或向那些熟悉SDK2中的触发器并希望使用更相似工作流程的人推荐。鉴于SDK2已被弃用,我永远不会向新项目的人推荐它。

image.png

如果您希望使用更传统的逐行C#创建Udon程序,可以查看UdonSharp。

如果您希望了解更多关于编程,尤其是Unity和UdonSharp的C#使用,我建议您查看Brackey的初学者系列。他过去制作了许多非常出色的Unity教程,因此这些教程考虑到大多数观众想学习C#的基础知识,以便他们可以在Unity中进行编程。

image.png

如果您希望了解为VRChat使用Udon和UdonSharp进行编程,我建议您观看Vowgan的教程。这些将是与VRChat最相关的编程教程,但我建议您先掌握编程的基础知识。

image.png

在下一课中,我将讨论 pickupabbles 和物理!