admin管理员组

文章数量:1589949

前言

在VRA模板中,Components无疑是最重要最核心的内容,模板中功能的实现都是通过在Actor上挂载对应的功能Components,是一种模块化的设计。因此在使用VRA制作项目之前必须要了解主要功能Components的参数设定与用法。此外,不同功能的组件之间是能够互相结合的,用户可以根据自己的需求自由组合多重组件以完成自定义的需求。因此,了解Components之间交互/通信的方式也是非常重要的。
由于VRA中包含的Components数量非常多,很难在一篇文章中讲完,笔者计划选择最常用到的几种Components,结合官方的视频与文档进行简单讲解。每一种Component都会单独写一篇笔记进行学习记录。
Interaction Component是VRA模板中非常重要的组件大类,它包含了许多重要的功能组件,本文将介绍Interaction Component下最常用的两个组件:Select & Grab Component.

Interaction组件的作用

Interaction组件的作用简单来说就是用户与交互Actor之间的媒介。

Interaction组件这一类目下还有多种不同功能的子类组件,例如项目中最常用到的Select Component 和 Grab Component:

通过文档可以看出Interaction这一大类组件包含的子功能组件还是很多的,并且它们之间的功能区别也很大。它们之前的共通点就是直接与玩家角色的行为发生交互,例如Select Component就是直接识别用户的点击,GrazeView就是直接识别用户的视线,Grab是直接与用户的点击或抓取按键交互等等。
虽然这些子组件的功能各异,但这些组件都有一个共通的设定:Component Identification.

Component Identification:

这一部分的参数定义是Interaction组件与Actor自身或其他Actor中的其他组件交互的核心。
AVR中不同组件的通信大多是通过搜索组件上的Tag实现的,下面以AVR模板地图Map_Example_Interactions中Timed Gaze事例中的Door来举例子:

 开门功能的Actor上Comp_Gaze_Trigger是Interaction Component下的子组件,它的组件定义如下

ComponentTagToSearchFor Array:

这个数组中需要填写这个组件被用户交互时,需要被触发(通信)的其他组件的tag。这个Actor的功能是当玩家角色看着门的时候门会打开,因此数组中需要添加Comp_Open组件的Tag:Door_OpenComp.(组件的Tag是自定义的,Comp_Open的Tag也可以是Door_Kaimen)

ActorsToTrigger Array:

这个数组中添加需要被检测的Actor实例(可以用吸管直接吸取场景中的actor,注意是实例而不是类),搜索的目标Actor身上挂载的带有ComponentTagToSearchFor中的Tag的组件。如果只是检测自身Actor的话,只需要勾选TriggerAlsoSelf即可。

Toggle:

Toggle是Gaze组件特有的参数,如果为true,视线触发的Door_OpenComp开/关门后会保持开/关门的状态。如果为false,只有当视线一直留在门上时,Door_OpenComp才会切换成开门的状态,移开视线门会立刻关上。

Component Tag to Gaze At:

这一参数默认是NONE,默认情况当玩家看向整个Actor时就会开始触发。也可以规定当玩家凝视门的模型时才触发,此时就需要在门的模型上添加自定义的Tag并将该Tag添加在这一参数栏中。

Select Component

Select组件项目中最常用到的组件之一,它的主要功能就是识别用户的点击(鼠标点击,VR手柄Trigger或者移动端的触碰),并将点击事件传递给另外的组件。下面来看SelectComponent的主要设置:

SupportSelectSource:

VRA模板是支持PC桌面端,VR端和手机移动端三种模式,因此SelectComponent可能会接收到三种不同的点击输入源:Laser(VR),Screen(Desktop)和Touch(Moblie)。组件默认接受VR和桌面端的输入,如果需要安卓移动端的输入可以自行添加。

Highlight:

Highlight这一功能在很多Interaction的子组件中都有存在,它的作用是当鼠标或摄像聚焦到带有组件的Actor上时模型会出现描边。VRA中自带的描边模式如下图所示:

一般会使用Mesh和PostProcess这两个模式,在VR一体机项目中使用Mesh,桌面端的项目可以使用PostProcess模式,描边的颜色可以自行定义。用户需要自行在需要描边效果的Mesh上自定义添加Tag,并将Tag填写在Component Tag to Highlight那一栏中。 

Sound&Events:

 Sound设定与Events事件都很直观,使用方式与Widget中的Button类似,就不做过多的描述了。

Grab Component

Grab交互无疑是VR项目中最重要的功能之一, VRA模板中对于抓取这一功能有且只有一个组件,其中实现了许多实用的功能。下文将对Grab组件的参数设置进行概述:

Behaviour:

 GrabType:

按照官方的文档,抓取类型有普通模式与使用物理柄的模式。在桌面端测试中两个模式没有看出太大的差别,模板中的Pawn类中集成了使用Physics Handle抓取的逻辑。默认使用normal模式即可,Physic Handle可能是类似隔空取物的模式。

Release Type:

这个参数实际是定义了Actor是否开启物理模拟。当你选择了Free Placement,即松手后物体停留在松手时的位置,即使用户在运行前手动将StaticMesh或SkeletalMesh的物理模拟打开,模型仍然不会开启物理模拟。相应的,当设定到Physics模式时,物体就自动开启了物理模拟。

Should Keep Upright:

这个参数定义了当物体被拿起时是否自动将物体旋转到自身Z轴与世界Z轴平行。在VR项目中,如果想让物体模拟被手拿起来的效果,请把这一项参数关闭。

Haptics:

这一项的功能在于当物体被手柄拿起或放下时,传给手柄相应的震动反馈。官方文档中的说明写的非常的直白,在这就不过多介绍:

Snap:

 Snap参数只有在使用VR模式且使用Laser抓取时才会使用到。开启Snap后,当用户使用Laser抓取物体时,物体会自动吸附到手柄处,吸附后的物体旋转需要玩家自行在Relative Controller Position中进行定义。

Conditions:

 顾名思义,Conditions参数定义的是Grab组件的一些限制条件。

Canbe Picked UP: 表明是否开启Grab功能

Should Auto Pickup: 这一条件只适用于VR项目,它表明Actor在VR手柄接近后是否被自动拾取

Max Distance to Socket: 规定了物体能被拾取的最大距离

Grab Attached Actor Instead: 这个笔者还未测试过,猜测打开后即使松开抓握键物体也不会掉落

Grab Tag: 当Actor中不止一个StaticMesh时,可以对能够被抓取的Mesh添加自定义Tag并将Tag填写入该栏中,这样只有含有对应Tag的Static Mesh能够被抓取起来。

Allow MultiGrab & Allow Pickup if Already Picked Up: 这两个选项需要同时打开才能实现,参数功能就是字面意思,笔者不多赘述。

Keys:

Keys这一栏参数笔者认为是非常重要的,有使用过VRA模板的用户会发现当用户用手柄射线抓握了物品后,手柄的X轴和Y轴绑定的转向/移动事件会被重载为将被抓握的物体旋转/前后移动。然而当我们实际项目中,很多需求是需要拿起物品进行移动的,解决这一问题的关键就在于合理设定Keys这一栏参数。

Grab组件能够重写手柄的事件,预设的手柄事件如下:

AllKeys:

参数为true时,当用户拾取Actor后,Grab组件就会重写上图手柄的事件。此时VR模式下的移动事件就会被Blocked,因此当用户有拿起物体移动的需求时,AllKeys参数需要为False.

OccuiedKeys Array:

有时当用户拿起物体后,物体含有特殊功能需要通过手柄按键触发时,可以在Array中添加需要重写的手柄输入事件。例如当用户拿起枪,手柄按下Trigger时就应该能够发射子弹,此时就可以在Array中添加Trigger,然后重写Grab组件的Grab Trigger Axis事件即可。

OccupiedFunctions Array:

这一数组笔者还未使用过,根据官方文档推测:若不希望Controller中的部分事件在用户拿起该物体时被调用,就可将事件名填入Array中。

本文标签: 学习笔记系列之FrameworkvrAdvanced