Skip to main content

碰撞体按钮与 Udon

这是上一课的延续,我们将在这里制作一个世界空间UI按钮,以切换玩家是否与某些物体发生碰撞,或者更具体地说,在导游和默认图层之间切换这些物体。

在项目选项卡中,右键单击,创建>VRChat>Udon>Udon图程序资产。将其重命名为Collider Toggle(右键单击或F2)。复制一个切换器,并重命名对象和标签为Colliders。单击切换器,添加UdonBehavior组件,然后拖动Udon脚本。在切换器组件的底部,单击减号按钮以删除旧插槽,然后单击加号图标并拖动UdonBehavior。 单击项目视图中的程序,然后按“打开Udon图”。Udon选项卡现在应该弹出了!

欢迎屏幕应该是您首先看到的内容。如果您想更改网格大小,请将其设置为20,但这只是我的喜好。现在单击“打开Collider Toggle”,这就是Udon图! Udon是可视化脚本,或者本质上就是代码,但是以节点形式呈现,而不是文本行。我知道“编码”这个词可能会吓到一些人,但它可能没有你想象的那么难。如果您在此之后再也不想接触Udon,那也没关系,我将在这整个教程中牵着您的手。

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

在我们运行代码之前,先决条件是所有对象都位于同一图层上,并且我们希望有一个我们要切换的所有对象的列表。

  1. 当代码开始时,我们想要检查第一个对象是否位于默认图层上。(因为它们都位于同一个图层上,所以检查一个就足够了)
  2. 如果它位于默认图层上,那么这意味着所有其他对象也都位于默认图层上,我们希望将它们切换到导游图层。
  3. 如果它不在默认图层上,那么这意味着所有对象都在导游图层上,我们希望将它们切换到默认图层。

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

  1. 我们需要的第一个变量是一个游戏对象数组,带有方括号的那一个。将其重命名为“Targets”。单击新变量旁边的箭头并选中“public”;这使得我们的变量在脚本外部可以访问。如果您单击我们为您制作的collider toggle UI按钮,您应该在检查器中看到它。拖动所有要切换的游戏对象。确保拖动实际上具有碰撞器的游戏对象!此外,子对象不受影响!
  2. 我们需要的最后两个变量是层。Unity中的层按数值顺序存储,并且必须通过分配的编号进行引用。如果您单击任何组件上的层下拉菜单,您可以看到默认层是0,教程层是17。添加两个整数,将一个的默认值设置为0,另一个设置为17。将它们重命名为defaultLayer和walkthroughLayer。

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

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

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

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

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

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

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

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

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

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

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

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

image.png

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

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

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

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

image.png

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

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

我想强调的是,我无法在YouTube评论部分帮助您。对于某些人来说,因为您是编程和Udon的新手,可能会出现问题。YouTube评论部分不是为提供来回帮助而设计的。您最好的选择是查看控制台是否有错误,自己查找,使用Debug Log自行解决问题,如果这些都行不通,请在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和物理!