本篇VR笔记由“萌猫娘巧克力”撰写,文明观赏,请勿转载,谢谢合作
该VR笔记的来源是 蛮牛教育 上的课程【HTC VIVE 开发实例教程】
——————————————————————
观看前的一些提醒:
Unity版本 5.6.0f3
VRTK版本:3.2.1
SteamVR版本:1.2.2
另外提醒一下:SteamVR版本一定不能高过1.2.2,因为高过了会使得 手柄 无法显示
——————————————————————
初识HTC VIVE
HTC
宏达国际电子股份有限公司成立于1997年5月15日,简称宏达电,亦称HTC,是一家位于台湾的手机与平板电脑制造商。是全球最大的Windows Mobile智能手机生产厂商,全球最大的智能手机代工和生产厂商。
全球第一款安卓手机HTC G1由HTC在2008年9月推出。
在2015年3月的MWC2015上发布了与Valve联合开发的VR虚拟现实头盔产品HTC Vive。
VIVE
Valve是Valve Software(维尔福软件公司)的简称,1996年成立于华盛顿州西雅图市,是一家专门开发电子游戏的公司,代表作品有半条命,反恐精英,求生之路,DOTA2等。
HTC Vive 是由HTC与Valve联合开发的一款VR头显(虚拟现实头戴式显示器)产品,于2015年3月在MWC2015(巴塞罗拉世界移动通信大会)上发布。由于有Valve的SteamVR提供的技术支持,因此在Steam平台上已经可以体验利用Vive功能的虚拟现实游戏。2016年6月,HTC推出了面向企业用户的Vive虚拟现实头盔套装—Vive BE(即商业版),其中包括专门的客户支持服务。
2016年11月,HTC Vive头戴式设备荣登2016中国泛娱乐指数盛典“中国VR产品关注度榜top10”。
AR 网址
HTC VIEW 交互设计开发
关于凝视效果
- 通过跟踪头部移动,设置一个代表光标的准星,当停留在某处足够长时间以后,激发选中逻辑
- 类似 Kinect 自然语言交互
- 多用于移动VR,如 Cardboard、GearVR等
- VIVE 平台使用凝视效果可增强用户体验
实现原理
- 基于射线原理,通过Raycast 判断击中的物体,在Update 里面进行逻辑帕努单
- 准星或十字线基于UGUI ,设置为相机的子物体,等待操作过程一般为圆环逐渐填充动画或者进度条动画
- 被凝视的物体可以是UI也可以是3D物体
- 如果在一段时间内击中的物体是用一个物体,则认为该元素被选中,在此逻辑内撰写相应处理函数,入消失,变换材质,缩放等
- 元素一般分为三个状态相应:准星进入、准星退出、准星停留时间
对于工具的学习:
SteamVR工具
使用Interaction System 实现与物体的交互
Unity脚本上的一个小技巧,当我们想在添加这个脚本的时候,还需要哪些组件支持,就可以使用RequireComponent,进行强制添加上去,以免发生不必要的小问题
使用ItemPackage 实现配套物体的同时抓取
Linear Drive 与 Circular Drive 的使用
LinearMapping是一个百分比
传统UI 和 VR UI 是 《屏幕坐标系》 和 《世界坐标系》的区别
VR中的UI一般构建步骤
Interaction System 中的UI交互
在3D物体上面挂在 Interactable 脚本用于3D物体交互,
而在UI上面要交互的话,要挂在UIElement脚本
使用 Sourcetree 从 Github 克隆项目并保持更新
VRTK与SteamVR的集成
VRTK的配置
VRTK手柄指针配置
VRTK_Controller Events
VRTK_Pointer —— 定义指针交互
指针渲染有两种【VRTK_BezierPointerRenderer】 和 【VRTK_StraightPointerRenderer】
VRTK_StraightPointerRenderer —— 定义指针外观
早期VRTK
早期直接使用 Simple Pointer是可以进行操作的,但是现版本不允许这么使用了
设计思想:
开始指定SDK,指定相关模型,跟相关控制脚本发生链接,在控制器上挂载最核心的Controller Events,把事件挂载到控制器上,将相关的属性进行设置,
VRTK瞬移机制:
瞬移是基于 碰撞器 之上的,所以想瞬移的话,就得加上碰撞器组件
将射线照射在箱子上,他目前不会站在箱子上,
这里就涉及到了【自适应高度】问题,
将Basic替换成Height脚本即可解决问题
VRTK_Height Adjust Teleport 和 VRTK_Basic Teleport 只能添加一个
让指针的末端附着在物体的表面上,
就像凝视效果的光标,和物体的法线方向保持一致
VRTK的快速瞬移:
之前的瞬移是从一个点快速 变 到了另一个点,中间没有过程只是加了闪屏
VRTK_Dash Teleport 快速瞬移
中间的移动过程是可见的,并且,它自带高度自适应的效果
瞬移区域限制:
有种办法就是,把不想让玩家进行瞬移的位置进行 碰撞器 的消除,但是这样的话,太麻烦
VRTK,就为我们提供了 3 种限定瞬移区域机制
第一种方式:
无论Basic 、Height 还是 Dash Teleport ,都有
它设定了排除的规则,它需要脚本类型是【VRTK_Policy List】
【包含3个Tag的游戏物体】
忽略 Tag 为 NoTeleport 游戏物体,不参与进行瞬移
此时,第三个箱子就无法瞬移到上面了
以上是VRTK_Policy List方式
第二种方式:
那三个瞬移组件,也有这个NavMeshLimitDistance,
【这个图可能无法看清烘焙范围,后面有张烘焙后的图】
Nav Mesh Limit Distance
要注意一个问题,那就是这个 Nav Mesh Limit Distance 是 烘焙缩进,如果是0的话,那就绝对不可以往Nav Mesh范围外进行瞬移,
如果设置了0.5的话,它就可以往 Nav Mesh 范围外0.5的位置进行微瞬移(可以往外面一点)
视频解释:往NavMesh以外,往外走0.5米,也是可以进行瞬移的
注意下,填写正整数的话,就会往NavMesh外多少多少米进行微瞬移,填写0的话,就会不考虑 导航 瞬移
第三种方式:
类似于 Interaction System 的 Teleport Point,
给他设定一个点
VRTK -> Prefabs -> DestinationPoint
最初它的样子是一个胶囊体[瞬移点]
但是,我们可以将它变成一个椭圆片[瞬移区域]
还要注意一点的就是,它们的 碰撞器大小 !!!!拖成 椭圆片 之后,要更改碰撞器
自定义指针:
我们得了解,它们分别的名字
Custom Cursor 是 指针与碰撞体 交界的光标.
Custon Tracer 是 构成曲线的元素 【 默认用Sphere构成的点状曲线 】
Tracer Density 是 曲线密度,越大越密集
根据长短,自动缩放
【看组件名】
将物体改成条形的话,游戏物体就只挂载Transform 和 Line Renderer
设置 Width 、不要World Space 、 Positions Element2 Z轴改成2
我们可以在Tracer上做很多设置,例如添加粒子特效
【试想一下,当按下Touch Pad,就会有烟花火星产生,那个场景,这就是添加了粒子特效做出来的效果】
使用VRTK实现与物体的交互
VRTK中与物体交互的三种类型:Touch、Grab、Use
使用VRTK实现与物体的交互
给 想进行交互的物体 添加一个VRTK_Interactable Object脚本
【物体上要添加这个脚本 和 碰撞器】
三种方式与物体进行交互
[手柄上,要添加VRTK_Interactable Grab]
【视频此处太模糊了,因为,VRTK版本过旧,而且有些地方不一样了,所以没有贴图】
在手柄上,添加上Grab,也可以添加上Use
需求:抓起剑的时候,实现手柄消失
被物体添加 VRTK_InteractController Appearance
看见Hide Controller On Grab了吧,它的意思就是当抓起来的时候,隐藏手柄
现在给 手柄 添加一个振动:
手柄振动的反馈是,给物体交互配置过程进行设置的,所以,我们只需要给物体添加一个脚本,VRTK_Interact Haptics
另一种配置物体可交互的手段:
【强烈推荐,根本不需要记忆该添加哪些脚本自动完成添加脚本】
基于图形化配置
每个物体的交互是不一样的,
门 和 剑,它们的交互方式是不一样的
Precision Grab是精准抓取的意思,不勾选的话,它是和手柄的坐标保持一致,只有吸附的效果
如果勾选上的话,碰到什么地方,就从那里抓取起来,
这个属性,有利于抓取点没有特殊要求的物体
设置 吸附点 Handler非常有利于吸附的方式
它的旋转朝向的设置,就是被抓取的物体,在被抓取以后在原有的基础上,将要在各个轴向上进行旋转的一个增量,它是一个增量而不是一个具体要达到的数值
另外一种抓取机制,将被抓取的物体作为一个被攀爬的点
VRTK抓取机制:关节点相关机制【视频中讲的特别难受】
这种效果,就是类似于攀岩的效果
当我抓取这个节点的时候,节点还是和手柄在一起,只不过这个节点不在相对于世界做一个运动,而是移动我们的身体,通过不停的拖拽从而移动体验者的位置
在某个组件上添加Player Climb即可攀爬
【该图中,我们正在攀爬梯子】
另一种抓取机制:
Rotator Track ,要配合【Hinge Joint】组件,
它可以被理解为门的合叶,它是围绕一个点进行旋转,最恰当的例子
这里有个黄色的箭头,这就是要围绕旋转的轴向
【VRTK 3.2.1版本】配置,早期这个笔记写出来的时候上面的配置 并非 使用3.2.1的配置方式,但是,在之前配置的时候,我已经调整了笔记的顺序,所以,看到这里可以再往上翻一翻我写过的配置方式
【在这里就放一张图,看看大家能不能回想起来,如何配置】
VRTK中的高亮和振动
控制器高亮:
想让 控制器 进行高亮,我们需要去自己写脚本来进行控制
课时27,讲解了一个二级联动的一个BUG,可以看一看!!!!
【有兴趣的各位,可以看看视频,这里就不做赘述了】
VRTK中与UI的三种交互方式
我们想近距离触碰一个UI并且触发它
在Canvas上,挂在一个 VRTK_UI Canvas脚本,有个Auto Active Within Distance
它的意思是,距离多少的时候,就激活这个UI面板 ;;;;【并且手柄要添加一个Touch组件和 UI Pointer,这样才能响应UI上的事件】
现在,我们要弄一个头部控制的这么一个东西,因此,
然后再在HeadSet【头部控制器】上,添加一个组件【VRTK_Transform Follow】
这个组件是 它可以让一个物体跟随另一个物体,包括位置旋转以保证当前这个粒子,让HeadSet跟踪头部来发送射线以指定它的位置
【
补充一句,这个Interact With Object是后面讲到的东西,我弄混了
它是用激光和物体进行交互
】
还有一步,就是别忘了添加渲染上去
【将渲染拖上去,要记得】
总结一下:
人为定义一个可以发送射线的物体 配置 Pointer 、 它的Pointer Renderer 和 与UI进行交互的UI Pointer,再添加一个进行跟随Transform Follow,让它指定到头盔上,以确定,它是以眼睛的方位进行发送射线,然后跟UI碰撞
使用激光指针与物体进行交互
用激光对物体进行交互,需要进行配置
在两个手柄上,添加一个脚本【VRTK_Interact Use】
然后Pointer脚本上,勾选上Interact With Object
选中的目的,就是让这个激光与物体实现交互,而不是简单实现手柄
这时候,就实现了激光指针跟手柄与物体实现选中效果,
但是,到目前为止,我们并没有告诉VRTK,我们在选中它之后,要做什么,
它仅仅是接受到了事件,仅仅知道我用鼠标进行点击,并不知道点击之后要做什么
这里有两种方法可以进行配置
第一种,用Unity的自带东西:
在手柄上添加一个【VRTK_InteractUse_UnityEvents】
添加了之后,它上面有事件函数
两个函数的意思是:
当控制器使用了可交互的物体
使用完毕之后
这是开始去抓取的设置
这里要注意下,分别去设置左手和右手
现在有个问题,那就是抓取了武器之后,任然能进行瞬移,这是我们不想要的,
所以,我们得对Pointer进行一个设置,在抓取的时候不允许它去射线
把 VRTK_Pointer 也拖进去,找到它的一个Toggle属性,设置为false , 不允许它射线从而达到无法瞬移
这样设置来设置去,显然特别麻烦,因此,我们要通过手动写代码的形式去进行配置
第二种,用 手动写代码 的方式进行配置Use:
源代码:
这个代码是出自 第19个 案例
它自己写了一个代码,不过这个代码是继承自 VRTK_InteractableObject 所以本质上还是挂载了InteractableObject脚本
唯一要关注的地方就是 它重写了 StartUsing 和 StopUsing 这两个方法:
StartUsing函数描述:
VRTK_InteractableObject.StartUsing(GameObject currentUsingObject)` has been replaced with `VRTK_InteractableObject.StartUsing(VRTK_InteractUse currentUsingObject)`. This method will be removed in a future version of VRTK.
public virtual void StartUsing(GameObject currentUsingObject)
{
StartUsing((currentUsingObject != null ? currentUsingObject.GetComponent<VRTK_InteractUse>() : null));
}
这个函数已经过时了,形参列表由原先的GameObject被改成了VRTK_InteractUse
StopUsing也是如此
所以,我们要实现更复杂的逻辑,就需要继承自 VRTK_InteractableObject ,自己来进行开发
当自己写的脚本继承自了 VRTK_InteractableObject , 它就会有它的东西可以进行设定
之前我们设置的射线抓取是被吸附到手柄上,然后再抓取,位置移动了!
我们可以设置一下,以达到一个目的,那就是吸附在光标上
因为不要吸附点这样就可以不让它直接吸到手柄上
把这个打开,它就会被吸附到 光标 上
这就是实现的效果
注意事项:
勾选了这个,它可以把激光当做手柄的延伸进行一个操作
这是介绍了Use使用方法,它是基于事件的处理函数
关闭了这个,同样是可以远程抓取,就不是在激光顶点
自定义手柄 – 将手柄定义为手的样子
用脚本的方式实现自动抓取
在两个控制器上,添加一个Auto Grab脚本
现在,我们不希望它显示默认控制器的模型了,所以,左手右手添加一个Controller Appearance
两个都选上 隐藏控制器 在抓取上
如果不勾选,会呈现出这样的效果
手柄与模型有旋转的偏移
我们要在抓取点上设置手柄与物体的朝向
【实现效果,按下后完全按下(播放动画)】
接下来就是有个需求,我想实现一个按下10%,它也是只做一个握10%的动作
这就是按下百分比动画的代码展示
视频中,说了一个问题,我们手柄是被替换掉了,但是抓取物体时出现了问题,抓取的话会脱离手柄
双手模型上拖上我们之前写的Hand脚本上去,再把Controller也拖上去
能触碰到,但是,无法进行抓取
这是因为,我们左右手控制器上,没有RigidBody
所以,我们要在 拖出来手模型 的下面放置一个 空物体带上刚体组件
好了,至此为止,本人的VR笔记就到此为止了,介绍了它的配置,如何抓取东西,抓取机制,Handler的使用
最后再次申明,本篇VR笔记最终解释权由 “萌猫娘巧克力” 持有
欢迎大家来观看与指出瑕疵