Skip to main content

碰撞体按钮与 Udon

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

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

首次打开 Udon 选项卡将会看到一个欢迎屏幕应该是您首先看到的内容界面。如果您想更改网格大小,请将其设置为20,但这只是我的个人偏好。现在击“打开Collider Toggle”,这就是Udon图! Udon是一种可视化脚本,或者本质上是代码,但以节点形式现,而不是文本行。我知道明白“编码”这个词可能会吓到一些人,但它可能没有你实际上并不像想象那么难。如果即使您在此之后接下来不希望涉足Udon,不想接触Udon,那也没关系无妨,我将整个教程中牵着一直引导的手

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

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

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

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

  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”"layer"并选择"get layer”layer"

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

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

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

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

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

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

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

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

image.pngimage.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,CyanTriggers。这是一个扩展,可以从GitHub免费下载,也可以从创建者Cyanlazer的Patreon获取最新版本。我对这两都不熟悉,为了出于避免导入太多可能发生更改的外部工具的考虑,我没有并未涉及。我会向那些不熟悉编程或不想学习编程的人推荐CyanTriggers,或那些熟悉SDK2中的触发器并希望使用更相似工作流的人推荐。SDK2现在已鉴于SDK2已被弃用,所以我永远不会向开始新项目的人推荐它。

image.png

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

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

image.png

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

image.png

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