Skip to main content

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

1、制作开关

我们创建一个老三样启动!!

  1. 创建一个 Toggle(开关)
  2. ,为其添加
  3. 为其添加组件 Udon Behaviour

  4. 创建一个 Udon Graph Assembly 脚本,命名后点击脚本。
  5. Open Udon Graph 以打开节点编辑界面。

66f0f83761b1a78ab14e52e193ae636e.png66f0f83761b1a78ab14e52e193ae636e.png

我们准备两个变量,两个变量全部设置为公开(Public):

  • 一个 GameObject[] 类型,充当 Target(目标游戏对象)。
  • 一个 Toggle 类型,充当 Toggle (开关)。
实际上这里的 

2、Toggle 类型变量 无需设置,在这个案例用不到,仅作参考。

编辑

我们准备了一个 Custom Event ,在这一节点的输入框中输入 IsTrigger 充当接收事件。

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

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

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

 

3、绘制 Udon Graph

定义变量

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

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

b34c8397ae17295c28e9d23e183392f6.png3505b96e55f964d827407e82bbb2b458.png

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

编辑节点

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

46e7422707e70297582a7340a6b1205c.png

解释说明

要想同时开关多个游戏对象,我们先需要准备一个游戏对象数组 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