前言
之前我们曾实现过PC端的模型的拆卸和组装,如果使用VR模式来实现物体的拆卸呢?如何使用双手手柄来控制物体,拆卸物体呢?今天我们就来实现一个VR小Demo,基于OpenXR ,XR Interaction Toolkit插件来实现。
二.准备工作
我们需要准备好Unity2021工程和环境配置
有了前文:Unity之OpenXR+XR Interaction Toolkit基本配置的介绍,我们就不在详细说明这些了,大家自行复习。
流程简述:
我们新建一个3D(URP)工程
然后通过PackageManager安装XR Interaction ToolKit插件。
配置好XR Interaction Toolkit的Preset
新建一个3D场景
导入手枪模型
准备工作完毕
三.层级设置
我们先添加几个层,方便稍后的射线和碰撞遮罩的设置,它们分别是:
Gun层,用于手枪主体
GunPart层:用于手枪的拆卸子模块
我们设置层级的目的是,随时控制手枪拆卸的子模块和主体之间的碰撞,因为拆卸子模块和主体的碰撞在拆卸时是在一起的,我们需要控制它们之间不发生碰撞,所以我们需要设置ProjectSetting->Physics,设置Gun和GunPart不发生碰撞
三.手枪拆卸
1.手枪模型的分块
我们根据手枪的模型子节点,把能够拆卸的组件,给他独立一下节点,然后分别添加碰撞器和刚体。如图所示:
我这里拆分成了7大块拆卸子块,其他的和主模型放到一起作为枪身。
2.手枪的层级设置
我们看到上图,可以注意到,当我们为开始拆卸时,手枪和手枪的子模块都是有碰撞的,我们需要给他们分别设置层级。我们给手枪的各个子模块设置一下层级为GunPart,然后给手枪的主体设置层级为Gun。
这样我们可以做到拆卸时,虽然子模块和主体都可以交互,但是他们两者不发生交互。
3.手枪的抓取
我们一般习惯是右手拿枪,所以我们在拆卸枪时,也是设定为右手拿枪,左手拆卸子组件,在OpenXR中,我们想要拿起物体,需要给物体添加组件XR Grab Interactable。并且给它的InteractionLayerMask设定层级为Gun,如果Interaction Layers没有Gun和GunPart层,请添加,注意这里的InteractionLayers层是和Unity自带的LayerMask不同的两个设置,这里是OpenXR使用的。用于控制VR手柄交互访问的一些层。
如下图所示:
此时,如果我们创建一个XR Origin,我们可以测试一下是否可以通过摄像把手枪拿起来。
4.RightHandController设置
如果我们想使用射线抓取,那么我们就使用Ray Interactor,如果我们想使用手直接抓取操作,那么我们就使用Direct Interactor组件,这一块我们前几节课讲过,这里就不再赘述。我们只说一下RightHandController的一些参数设置。
XR Ray Interactor设置
XR Ray Interactor主要修改一下两个层级,其他保持默认即可
Interaction LayerMask:Gun:交互遮罩,只有Gun层的射线才可以点击
Raycast Mask:UI,Gun:射线遮罩,非Gun层,射线照射没有效果。
Direct Interactor设置
DIrect Interactor可以通过手部直接拿起物体,主要设置一个InteractionLayerMask即可
InteractionLayerMask:Gun:手部只能近距离抓取Gun层的物体。
5.子模块拆解
我们刚才说了,我们使用右手拿枪,左手拆卸枪,接下来我们依次给子模块添加XR GrabInteractable组件,并设置InteractionLayerMask为GunPart层。
6.LeftHandController设置
我们使用左手进行拆卸时,也可以选择使用射线抓取拆卸还是直接抓取拆卸,虽然两者都可以,但是因为VR手柄有一定的大小,如果我们右手直接抓取枪,左手也使用直接抓取拆卸,那么VR手柄可能会碰撞到一起,甚至打住我们自己的手,所以给大家提供几种选择
1.左右手都是射线抓取+直接抓取,哪个使用射线抓取,哪个使用直接抓取,用户可以自己选择。
2.右手通过射线抓取拿起枪支,手柄和枪保持一定距离,左手通过直接抓取拆卸枪支。
XR Ray Interactor设置
XR Ray Interactor主要修改一下两个层级,其他保持默认即可
Interaction LayerMask:GunPart:交互遮罩,只有GunPart层的射线才可以点击
Raycast Mask:UI,GunPart:射线遮罩,非GunPart层,射线照射没有效果。
XR Direct Interactor设置
XR Direct Interactor组件用于左手直接抓取拆卸枪支。
InteractionLayerMask设置为GunPart层,控制左手只能操作枪支的子模块,无法拿起枪支主体。
四.拆卸Demo
以上步骤完成后,我们基本就可以运行测试Demo了。
1.自由拆卸
如果我们是自由的方式拆卸枪支,那么以上应该就没有什么大问题了。我这里操作没有什么问题。如下图所示:
2.流程拆卸
如果我们是流程化的方式拆卸枪支,比如第一步拆弹夹,第二部拆枪膛,第三步等等,那么我们需要再写脚本来辅助这些功能,并且还可以添加当前要拆卸的部件的高亮效果,我这里的流程化脚本就不展示了,逻辑比较简单,就是加一个子组件的碰撞控制,再监听一下当前拆卸物体是否放下。如果要做商业项目,那这里逻辑会更加定制化,我们就不再多说,我这里的流程化效果如下所示:第一步拆下弹夹后,枪膛扣高亮,等待下一步拆卸。
五.手枪组装
刚才我们说了手枪的拆卸,有拆卸就一定有组装,我们先分析一下组装的基本原理:
首先我们复制出来一个手枪2,把要拆卸的枪支模块都单独拖拽出来当做单独游戏对象放到桌面上,其他没用的都删掉。
这样的话,我们每个枪支子组件就有了两个,我们添加上碰撞和XR Interaction 组件
接下来,我们分析一下如何组装。
我们可以通过左手把零散的子模块拿起来,然后去和右手枪支主体上的相同模块子组件发生碰撞触发检测,触发成功的,我们认为组装成功了,可以把左手的零散的子模块隐藏,显示右手主体的子模块。这样我们就完成一次模块组装。
由于组装无法做成自由模式,必须有顺序的组装,所以我们必须添加额外的脚本来辅助组装的功能。比如触发检测,组件的显示和隐藏,组装流程的控制等等。这个可复杂可简单,所以我就只说一下组装的原理,代码我就不演示了。
六.最终
好了,本篇文章就到这里,希望能够对你有所帮助,有问题欢迎留言。