Skip to main content

制作用于开关多个游戏对象的开关

1、制作开关

老三样启动!!

  1. 创建一个 Toggle(开关)。
  2. 为其添加组件 Udon Behaviour
  3. 创建一个 Udon Graph Assembly 脚本。

66f0f83761b1a78ab14e52e193ae636e.png

2、Toggle 编辑

我们准备了一个 CustomUdon EventBehaviour 组件拖入 Toggle 下的 On Value Change 一栏,右上角 Function 选择栏选择 UdonBehaviour>SendCustomEvent(String)在这一节点的输入框中输入在下方输入框输入 IsTrigger 充当接收事件。充当发送事件。

我们再将 Target 变量拖入面板中,利用 GameObject 的 Get activeSelf 获取游戏对象的开启/关闭状态,再用 Boolean 的 UnaryNegation 反转 bool 变量(true->falsefalse->true),我们最终得到的 bool 将会是目标游戏对象(在此例中为后处理游戏对象)开启/关闭状态的相反值。

我们创建一个 GameObject 的 SetActive 节点,这个节点可以在接收事件以后将 instance(实例)的开启/关闭状态设置为下方 value bool 的数值。

true打开游戏对象
false关闭游戏对象

 df82aa90609a846f48d1cafd565301d9.png

3、绘制 Udon Graph

定义变量

我们需要为这个项目定义两个变量,在 Udon Graph 界面左侧的 Variables(变量)一栏,点击 +号 以添加不同类型的变量。

变量后缀【公开】意味着此变量为 Public(公开)变量,点击任意变量左侧的箭头展开即可编辑该变量的 Public 值(勾选)

3505b96e55f964d827407e82bbb2b458.png

  • toggle【公开】:一个 Toggle 类型,用于指定并获取特定开关的信息状态。
  • target【公开】:一个 GameObject[] 数组类型,用于指定多个游戏对象(哪些 游戏对象 受到这个开关的控制)。

编辑节点

按照下图绘制 Udon Graph 即可完成此部分操作。

46e7422707e70297582a7340a6b1205c.png

解释说明

二话不说,先准备一个 Custom Event 作为事件接收,输入 isTrigger 完成操作。

要想同时开关多个游戏对象,我们先需要准备一个游戏对象数组 GameObject[] 以容纳我们想要开关的多个游戏对象,接下来我们需要想办法让多个对象能在一个事件的影响下“同时”打开和关闭,为此我们用到的方法为“遍历数组”。

为此我们需要先解释两个前置的编程概念,一个是数组,一个是For循环

数组

在 C# 中,数组是一个可以按照一定顺序存储元素类型与值的顺序集合,datatype 意味着数组中元素的类型(例如 int,float,bool),arrayName 是数组的名称(可自己定义),{ 1, 2, 3, 4, 5 } 则代表数组存储的值,大致意味着数组长成这个样子。

datatype[] arrayName = { 1, 2, 3, 4, 5 };

简单联想一下,gameobject[] 就是存储多个游戏对象信息的有顺序的集合,从0开始存储每一个游戏对象信息,当然也包括游戏对象的开启和关闭状态。

我们只需要找到一个办法将数组内每一个游戏对象的开启/关闭状态受到 Toggle 状态影响就好了。

For 循环

在 C# 中,for 循环是一种控制结构,用于重复执行一段代码,直到满足特定条件。以下是 for 循环的基本语法

for (初始化; 条件; 迭代)
{
    // 循环体
}
  • 初始化:在循环开始前执行一次,用于初始化循环控制变量。
  • 条件:每次循环迭代前都会检查,如果条件为 true,则执行循环体;如果为 false,则退出循环。
  • 迭代:每次循环体执行完后执行,用于更新循环控制变量。

我们只要为 for 循环设置一个条件,即可让他按照我们预设的规律不断运行下去,咱们正好可以用这个功能来访问和修改游戏对象数组内的任意属性,爽死了!!

6ac63acae312e5e649eb3e396e7426d0.png

  • start:从什么数开始循环?默认从0开始就好了。
  • end:在什么数结束循环?当然是我们数组的最大大小哩,为此,我们使用 Get Length 节点获取游戏对象数组的长度,并将获得的值塞入 end 这一个节点当中。
  • step:整体循环重复几次?咱们只需要循环一次就足够了,所以写1。
  • int index:每次循环到数组的第几个元素了?咱们需要这个值用来给数组的每一个元素施加相同的操作(遍历),我们使用 Get 节点获取每一个数组内元素指向的真实游戏对象,并使用 Set Active 来决定它的开启/关闭状态,最后我们使用 Get Is On 来获取开关的开启或关闭状态,并将其作为布尔值输入至 Set Active 来决定每个游戏对象的开启/关闭状态。
  • Body:每当 For 完成一次循环,Body 就会输出一次“流”,用于“激活”下一个节点,将其接入 Set Active 意味着 For 每循环一次就要通过 Set Active 决定一次当前数组特定顺序的游戏对象的开启/关闭状态。
  • Exit:退出循环时发送一个“流”,暂时不需要,不用理它。

 

Set Active 如何完成它的任务?

让我们先看看 Set Active 长什么样子罢:

1098d317818596836a7548b46e3b7081.png

Set Active 总共有两个输入,分别为 instance 和 value,instance 决定要设置的游戏对象,value决定要设置游戏对象开启/关闭状态为“开启(true)”或者“关闭(false)”。

如同前文所述,我们用 Get 获取游戏对象数组内指定的游戏对象(instance),再通过调用开关的值(value)来打开/关闭游戏对象。

Set Active 会在每次 For 执行一次循环时针对处在当前循环的游戏对象执行一次操作,在最终逐个关闭游戏对象。