第5章与物体的复杂交互
在VR场景中经常需要打开门窗、拉开抽屉以及拨动摇杆等交互操作,本章将讨论如何利用XR Interaction Toolkit实现这些操作。


视频讲解


5.1建立可交互的门
在Unity网站的Asset Store中找到Door Free PackAferar包,单击“添加至我的资源”按钮,如图51所示。


图51Door Free Pack Aferar包


在Unity编辑器的Package Manager面板中寻找刚加入的Door Free PackAferar包,单击Import按钮,如图52所示。


图52Package Manager面板


在弹出的Import Unity Package对话框中,单击Import按钮,如图53所示。




在Assets中01_AssetStore\DoorPackFree\Prefab目录下寻找DoorV3预制件,将其拖放到Hierarchy视图中,如图54所示。



图53Import Unity Package对话框



图54DoorV3预制件

调整DoorV3的Scale比例大小为1.6,在Scence视图中稍稍提高一下DoorV3的Position的Y的数值,为了更加方便地开启门,防止门与地面发生碰撞,如图55所示。


图55调整DoorV3的Scale比例大小为1.6


选择DoorV3下的01_low游戏对象,设定Layer为DirectGrab,如图56所示。


图56设定Layer为DirectGrab


选择Hierarchy视图中的LeftHand Controller,设定其XR Ray Interactor组件的Interaction Layer Mask如图57所示。




图57设定Interaction Layer Mask


设定XR Ray Interactor组件的Raycast Mask如图58所示。
回到DoorV3下的01_low游戏对象,为其添加Hinge Joint组件,单击按钮调整连接器的轴的位置,并开启Use Spring选项,设定Damper为60,设定Axis的Z轴为1,如图59所示。Damper的数值越高,对象减速越慢。

为DoorV3下的01_low游戏对象开启Hinge Joint组件的Use Limits选项,并手动调整红色手柄,设定其Min值和Max值,如图510所示。

为DoorV3下的01_low游戏对象添加Rigidbody组件,设定Collision Detection为Continuous,如图511所示。
为DoorV3下的01_low游戏对象添加Box Collider组件,如图512所示。



图58设定Raycast Mask




图59Hinge Joint组件 





图510调整红色手柄




图511Rigidbody组件




图512Box Collider组件


添加Box Collider后的门,如图513所示。
在01_low游戏对象下添加Handle游戏对象,如图514所示。
在Handle游戏对象上添加Box Collider组件,如图515所示。
单击按钮,调整Box Collider的大小,使其覆盖门的把手,如图516所示。



图513添加Box Collider后的门




图514添加Handle游戏对象





图515添加Box Collider组件




图516调整Box Collider的大小


为DoorV3下的01_low游戏对象添加XR Grab Interactable组件,设定Handle为Colliders列表的一项,设定Movement Type为Velocity Tracking,用于方便跟踪控制器的运动,如图517所示。


图517XR Grab Interactable组件




视频讲解


5.2建立可交互的抽屉
在Unity编辑器的菜单栏中选择Assets→Import Package→Custom Package选项,导入cabinet.unitypackage,如图518所示。


图518导入cabinet.unitypackage


选择Assets目录下的Prefabs目录下的Cabinet预制件,如图519所示。


图519Cabinet预制件


拖放Cabinet预制件到Hierarchy视图中,选择其下的Drawer游戏对象,如图520所示。


图520选择Drawer游戏对象


设定Drawer的Layer为DirectGrab,如图521所示。



图521设定Drawer的Layer为DirectGrab


给Drawer游戏对象添加XR Grab Interactable组件,设定Drawer front为Colliders列表的一项,设定Movement Type为Velocity Tracking,如图522所示。


图522XR Grab Interactable组件


给Drawer游戏对象添加Configurable Joint组件,设定Axis 的Z项为-1,将X Motion设定为Limited,而将Y Motion、Z Motion、Angular X Motion、Angular Y Motion以及Angular Z Motion设定为 Locked,设定Damper 为60,Limit为0.8,如图523所示。


图523Configurable Joint组件




视频讲解


5.3建立可交互的摇杆
在Hierarchy视图中建立名为Level的立方体,设定其Layer为DirectGrab,如图524所示。


图524建立名为Level的立方体


调整Level的大小和位置,如图525所示。


图525调整Level的大小和位置

在Hierarchy视图中,复制Level游戏对象,将其改名为Handle,并将其拖放为Level的子对象,如图526所示。
调整Handle的大小和位置,使其变成如图527所示的形状。
在Hierarchy视图中选择Level游戏对象,为其增加Rigidbody组件,设定Collision Detection为Continuous,关闭Use Gravity选项,开启Is Kinematic选项,使得其不受重力影响,如图528所示。


图526改名为Handle





图527调整Handle的大小和位置




图528Rigidbody组件


为Level游戏对象添加Hinge Joint组件,设定Axis的Z为1,单击按钮,调整轴所在位置,开启Use Spring选项,设定Damper为80,开启Use Limits选项,设定Min为-60,Max为60,如图529所示。
为Level游戏对象添加XR Grab Interactable组件,设定Handle为Colliders列表的一项,设定Movement Type为Velocity Tracking,如图530所示。



图529Hinge Joint组件




图530XR Grab Interactable组件