Skip to main content

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

1、制作 Toggle

老三样启动!!

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

66f0f83761b1a78ab14e52e193ae636e.png

将 Udon Behaviour 组件拖入 Toggle 下的 On Value Change 一栏,右上角 Function 选择栏选择 UdonBehaviour>SendCustomEvent(String) ,在下方输入框输入 IsTrigger 充当发送事件。

df82aa90609a846f48d1cafd565301d9.png

2、绘制 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 执行一次循环时针对处在当前循环的游戏对象执行一次操作,顺而逐个打开/关闭游戏对象。

3、使用脚本

我们在前文设置了两个公开的值 toggle 和 target,在 toggle 中拖入目标开关(toggle),在 target 中设置 size(大小)以调整数组大小,再将目标游戏对象一个一个拖入对应的框中即可。

88d8f72d6d8fce16243e95f289a6b884.png

 

祝使用愉快!!