制作一个用于开关物体/组件的按钮
本期咱们来制作一个可以开关物体的按钮
PART1:程序目标设计
这个程序十分简单,我们的目标就是——
开关一个物体
PART2:设计参数
EVENT:事件选择
既然是一个按钮,那么我们的选择一定是当玩家按下扳机,或者按下鼠标左键后触发,VRchat为我们准备了一个Event事件——
Event Interact
这个事件会在玩家交互后相应,并且开始执行后续的流
Variables:参数选择
在参数上,我们需要一个Pulic的接口来链接我们需要开关的东西,比如GameObject,或者是GameObject的组件,如Light,Behaviour等等。当然我们比较推荐您使用GameObject来开关您的物体。
在这里我们选择一个GameObject和一个Light组件来讲解如何制作一个开关
PART3:设计程序
第一步:
如果我们要开关一个物体,我们需要一个模块来设置物体的激活状态,在Unity中,一个GameObject的开关取决于Active属性,通过搜索GameObject-SetActive,我们可以找到我们需要的这个组件
在instance中链接我们需要的控制的对象——GameObject,即可完成这个组件的基础设置。
第二步:
既然我们是一个按钮,那么我们不能设置他每一次按下都只会关闭,我们需要让他在关闭的时候按下去就是开启,开启的时候按下去就是关闭,也就是说——我们需要获取物体目前的开关状态(Active),并且将其反转。
还是一样的,打开搜索界面,搜索Get activeSelf,并且把在instance中链接我们需要的控制的对象,这个组件就会读取这个物体的状态,并且以Bool值的方式输出出来。
关于activeSelf与activelnHierarchy的区别:activeSelf只会获取这个GameObject的状态,即使父级已经关闭,只要他本身还是开启状态,他依然会输出开启,而activelnHierarchy只要这个物体在场景中是关闭状态,无论是因为父级关闭连带的关闭,还是自身关闭,他都会输出“关闭”。
接下来我们需要反转Bool值,这将会用到“Boolean”-“UnaryNegation”组件,这个组件会将布尔值反转并输出
接下来只需要将输出的已经反转的布尔值连接到SetActive-Value处,既可完成这个脚本的编辑
如果您需要在开启触发脚本的同时,希望某个物体关闭,很简单,在后面再加上一个SetActive并连接到你希望关闭的东西,将参数设置为(false)即可,如下
基础教学到此结束,下面是进阶部分~~~
进阶1:关闭GameObject上的组件
与GameObject不同,组件使用的是“Set enabled”来控制组件的开启状态,即“激活状态”
我们同样可以用“Get enabled”来获取到组件的开启与关闭,再通过“Boolean”-“UnaryNegation”组件反转布尔值,来控制组件的激活状态
进阶2:顺序开启
如果我们需要用一个按钮同时控制三个物体,让他们顺序启动与关闭,那么我们应该如何去做呢?很简单,让我们在上述组合中引入一个int值来保存我们开启到了哪里。
第一步:
我们需要当int值等于某一个值的时候,执行某一个流,我们假定这个系统中有三个物体需要顺序激活,且激活一个时另外两个需要是关闭状态,所以我们需要先制作一个根据int来决定执行哪一个的流的组合——我们可以通过INT参数+Equals(等于)+Branch(分支)来制作这个组合。
节点图如下
这个组合的意思是,当触发了之后,如果int值=0,1,2,则从第1,2,3的true出口执行后续流,如果int不等于0,1,2则执行最下端的False链接的流。
第二部:
由于我们已经知道了Bool值,所以我们不再需要获取布尔值再反转,而是直接设置开关状态即可。
除了1.2.3条之外,我们设定第四个出口为全部关闭。节点图如下
第三步:
随后我们让当1,2,3触发后,int值+1。而如果触发了最下端的全关,则将int值清零,从头开始.
我们需要使用加法器(Addition)来做到这一点,节点图如下
到这里,你已经掌握了开关的全部制作方法,快去试试吧~
No Comments