006_Controller_UsingADoor 使用控制器开关门
该场景中放置了两个可交互对象——“门”。把控制器放到门前,按下控制器上面的Trigger键可以实现与门的交互。如果门是开着的话,它会关上,反之亦然。
usingdoors
下面详细的看一下这是怎么实现的。这个场景中相机的起始位置在两扇门中间的位置,需要走几步就能到达门前面,门的Collider比它的mesh要大一些,是为了交互方便。该场景中没有“传送(Teleport)”功能,读者可以自己添加,记不起来怎么做的话,翻翻前面的笔记好了。场景中的简易Door对象是个Cube做的,在Hierarchy中是这样子的:
DoorObject
Door对象具有Box Collider,Rigidbody和Openable_Door三个组件,我们要详细看Openable_Door:
Openable_Door
Openable_Door继承自VRTK_InteractableObject,上篇笔记详细介绍过该脚本的触碰与抓取功能,这次来看下Use功能是怎样的。
Use
这个术语听起来还是有点奇怪,仔细想想也合理。当你触碰或者抓住一个物体的时候,想使用该物体进行一些相关的操作时,就必须加一个动作。举个例子,你拿了一把手枪在手里,想发射一下子弹,就需要Use;你拿了个录像机,想要开始录像了,也需要Use。在本例中,控制器已经碰触到门了,想要把门打开,可以点击Trigger按键使用Use操作把门打开。
想要实现Use操作,需要以下几步:
控制器对象绑定VRTK_ControllerEvents脚本来监听控制器按钮的事件,是关于use和停止use的事件,即AliasUseOn和AliasUseOff,用来确定何时应该use以及停止use。
控制器对象需要绑定VRTK_InteractTouch脚本,用来确定可交互对象是不是被触碰着,只有有效触碰的物体可以被use。
可交互物体必须绑定VRTK_InteractableObject脚本,并且isUsable变量要设置为true。
VRTK_InteractUse脚本
Hide Controller On Use: 当use动作开始的时候,隐藏控制器模型。
Hide Controller Delay: 隐藏控制器模型之前的等待时间。
VRTK_InteractableObject脚本
下面是Use部分的参数:
useoptions
Is Usable: 决定物体是否可以使用。
Use Only If Grabbed: 如果选中的话,只有抓住的物体可以使用。
Hold Button To Use: 如果选中的话,需要一直按住use按键才能使用;没有选中的话,use按键是toggle的形式,按一次use,再按一次停止use。
Use Override Button: 可以指定一个按键,use这个特定的可交互物体。
Pointer Activates Use Action: 如果选中的话,当控制器中发出的World指针光束与该物体相交的时候,可以将会运行Using方法。还取决于Hold Button To Use属性。如果该物体Hold Button To Use属性没选中的话,必须释放指针按键才算use。如果Hold Button To Use选中的话,指针按键一直按住也算是use,比如光束划过物体的时候。
Rumble On Use: 设置物体被use时的触觉反馈。Strength指的是震动强度,Duration指的是时间长度。
-Allowed Use Controllers: 决定哪个控制器可以进行use动作。
Hide Controller On Use: 可以覆盖控制器上面的设置。
Openable_Door脚本
该脚本继承自继承自VRTK_InteractableObject,对外暴露了flipped和rotated两个属性。重写了StartUsing方法,用来控制门的开关状态和旋转方向。场景中放了两个门,只有一个属性上不同,即flipped。具体效果可以试一下,门1是只能往一个方向开;门2是朝向相机的另外一侧开门。代码中有相关的计算,仅供参考。:)
参考:
网友评论