Skip to main content

制作一个用于开关物体/组件的按钮

本期咱们来制作一个可以开关物体的按钮


PART1:程序目标设计

这个程序十分简单,我们的目标就是——

开关一个物体


PART2:设计参数

EVENT:事件选择

既然是一个按钮,那么我们的选择一定是当玩家按下扳机,或者按下鼠标左键后触发,VRchat为我们准备了一个Event事件——

Event Interact 

3afad599fc38af87f0e901e7724b5d81.png

这个事件会在玩家交互后相应,并且开始执行后续的流

Variables:参数选择

在参数上,我们需要一个Pulic的接口来链接我们需要开关的东西,比如GameObject,或者是GameObject的组件,如Light,Behaviour等等。当然我们比较推荐您使用GameObject来开关您的物体。

在这里我们选择一个GameObject和一个Light组件来讲解如何制作一个开关

9597d187cf8e9c58da4a15aadbd32d1a.png


PART3:设计程序

第一步:

如果我们要开关一个物体,我们需要一个模块来设置物体的激活状态,在Unity中,一个GameObject的开关取决于Active属性,通过搜索GameObject-SetActive,我们可以找到我们需要的这个组件

1828594d9ebc6ae0c7bffca2c4d35781.png

在instance中链接我们需要的控制的对象——GameObject,即可完成这个组件的基础设置。

第二步:

既然我们是一个按钮,那么我们不能设置他每一次按下都只会关闭,我们需要让他在关闭的时候按下去就是开启,开启的时候按下去就是关闭,也就是说——我们需要获取物体目前的开关状态(Active),并且将其反转。

还是一样的,打开搜索界面,搜索Get activeSelf,并且把在instance中链接我们需要的控制的对象,这个组件就会读取这个物体的状态,并且以Bool值的方式输出出来。

11e6a3a77c94ba9d02b98c40aaa6de15.png

关于activeSelf与activelnHierarchy的区别:activeSelf只会获取这个GameObject的状态,即使父级已经关闭,只要他本身还是开启状态,他依然会输出开启,而activelnHierarchy只要这个物体在场景中是关闭状态,无论是因为父级关闭连带的关闭,还是自身关闭,他都会输出“关闭”。

接下来我们需要反转Bool值,这将会用到“Boolean”-“UnaryNegation”组件,这个组件会将布尔值反转并输出

image.png

接下来只需要将输出的已经反转的布尔值连接到SetActive-Value处,既可完成这个脚本的编辑

如果您需要在开启触发脚本的同时,希望某个物体关闭,很简单,在后面再加上一个SetActive并连接到你希望关闭的东西,将参数设置为(false)即可,如下

d801a2de098d80e85e5d7b6d842d157e.png

基础教学到此结束,下面是进阶部分~~~


进阶1:关闭GameObject上的组件

与GameObject不同,组件使用的是“Set enabled”来控制组件的开启状态,即“激活状态”

image.png

我们同样可以用“Get enabled”来获取到组件的开启与关闭,再通过“Boolean”-“UnaryNegation”组件反转布尔值,来控制组件的激活状态


进阶2:顺序开启

如果我们需要用一个按钮同时控制三个物体,让他们顺序启动与关闭,那么我们应该如何去做呢?很简单,让我们在上述组合中引入一个int值来保存我们开启到了哪里。

第一步:

我们需要当int值等于某一个值的时候,执行某一个流,我们假定这个系统中有三个物体需要顺序激活,且激活一个时另外两个需要是关闭状态,所以我们需要先制作一个根据int来决定执行哪一个的流的组合——我们可以通过INT参数+Equals(等于)+Branch(分支)来制作这个组合。

节点图如下

image.png

这个组合的意思是,当触发了之后,如果int值=0,1,2,则从第1,2,3的true出口执行后续流,如果int不等于0,1,2则执行最下端的False链接的流。

第二部:

由于我们已经知道了Bool值,所以我们不再需要获取布尔值再反转,而是直接设置开关状态即可。

除了1.2.3条之外,我们设定第四个出口为全部关闭。节点图如下

image.png

第三步:

随后我们让当1,2,3触发后,int值+1。而如果触发了最下端的全关,则将int值清零,从头开始.

我们需要使用加法器(Addition)来做到这一点,节点图如下

fc32a62e396e07432e456016516209fd.png

到这里,你已经掌握了开关的全部制作方法,快去试试吧~