【Unity】虚拟现实 VRTK插件使用教程(二)人物传送、光标指针、传送规则、玩家区域检测
文章目录
- 人物移动
- 传送
- 光标指针
- 光标激活设置
- 光标事件
- 光标指针渲染器
- 更换按键
- 改变力度
- 改变外观
- Component内容拷贝【Unity小窍门】
- 实现传送效果
- 功能优化
- 传送规则(设置传送禁区)
- 玩家区域碰撞检测
- 忽略检测触发器
- 玩家区域碰撞检测忽略触发器
人物移动
通常VR人物移动有三种方式:
- 传送、瞬移。
- 通过滑动触摸板移动。
- 通过不停上下摆动左右手柄实现跑步,由于此方式会占用双手,所以不太常用。
传送
要想实现传送,首先要给左(右)手控制器添加VRTK_Pointer组件和VRTK_Bezier Pointer Renderer组件,并将VRTK_Bezier Pointer Renderer组件拖拽到VRTK_Pointer组件的Pointer Renderer属性中。
游戏运行后默认界面如下:
将光标切换到指定好的手柄,然后点击TouchPad按键,就会出现如下的贝塞尔曲线,曲线下方的绿色圆盘就是传送的目标点。
顺便提示,默认按键不好用,建议自己设置一下,设置方法请参考上一篇文章《【Unity】虚拟现实 VRTK插件使用教程(一)插件基本配置》。
实现结果如下图:
光标指针
光标指针 VRTK_Pointer 组件可以为物体提供一个虚拟的指针组件,我们可以通过设置这个指针来处理一些与射线、抛物线相关的内容。例如,Pointer Renderer属性用于指定光标指针的渲染器,不同的渲染器提供了不同的指向终点的方式,并提供了一些将指针路径渲染出来的功能。
光标激活设置
Pointer Activation Setting是关于光标激活的设置。该设置主要用于设置与激活光标相关的操作,也就是设置光标如何出现。
- Activation Button:可以改变触发光标指针功能的按键。
- Hold Button To Activate:用于设置按键使用的方式。
- Activate On Enable:用于设置是否在OnEnable中触发光标。
- Activation Delay:用于设置延迟触发。
光标事件
- PointerStateValid: 光标激活时引发
- PointerStateInvalid: 光标禁止时引发
- ActivationButtonPressed: 按下激活按钮时引发
- ActivationButtonReleased: 释放激活按钮时引发
- SelectionButtonPressed: 按下选择按钮时引发
- SelectionButtonReleased: 释放选择按钮时引发
- DestinationMarkerEnter(父类): 光标进入目标点
- DestinationMarkerExit(父类): 光标离开目标点
- DestinationMarkerHover(父类): 光标在目标点悬停
- DestinationMarkerSet(父类): 光标选中目标点
光标指针渲染器
VRTK提供两种光标指针渲染器,即射线指针渲染器(VRTK_StraightPointerRenderer)和贝塞尔曲线指针渲染器(VRTK_BezierPointerRenderer)。通常情况下使用贝塞尔曲线指针较多。注意,VRTK_Pointer组件只是建立了一个指针,但不提供指针的具体位置和界面渲染,实际上使用哪种指针取决于Pointer Renderer属性指定了哪种指针组件。所以,VRTK_Pointer就像一个接口,提供了指针的基础规则,而真正产生指针数据和界面渲染的是VRTK_StraightPointerRenderer组件或VRTK_Bezier Pointer Renderer组件。
更换按键
如果不想要触摸板按键,可以调整VRTK_Pointer组件下的Activation Button属性修改按键。
通过调整VRTK_Bezier Pointer Renderer组件的Tracer Density属性可以贝塞尔曲线的显示密度,数值越大密度越大,下图为此属性设置为100时的效果:
改变力度
通过改变Height Limit Angle属性的大小可以调节传送高度的限制角度(可以理解为仰视角的角度限制),值越大可传送高度越高,设置方法如下图所示:
改变外观
如果想改变曲线的外观,可以改变VRTK_Bezier Pointer Renderer组件Bezier Pointer Custom Appearance Settings属性下的四个属性,具体内容可参考VRTK实例022_Controller_CustomBezierPointer或实例036_Controller_CustomCompoundPointer。
Component内容拷贝【Unity小窍门】
顺便学习一下拷贝组件的方法,在案例中的组件上点击Copy Component,再到自己的组件上点击Paste Component Values,这样就把别人的组件内容复制到自己的组件上了。
这样案例中的设置我们就拿到手了,实现效果如下:
实现传送效果
给Body附加传送组件(VRTK_BasicTeleport或VRTK_HeightAdjustTeleport),Basic的功能相对简单,建议使用HeightAdjust组件,因为此组件允许玩家传送到更高的位置,而Basic只能传送到当前高度以及下层的位置。
至此,基本的传送功能就实现了,下面进行进一步优化。
功能优化
传送规则(设置传送禁区)
如果想要限制部分区域不允许传送,可以给手柄控制器添加VRTK_PolicyList组件,并将此组件拖拽到VRTK_Pointer组件的Target List Policy属性中,如下图:
组件的属性决定了哪些地方可以传送,哪些地方不能传送,具体属性内容如下:
- Operation:该属性用于指定规则,第一种规则 Ignore(指定区域不可传送),第二种规则 Include(只有指定区域可传送)。
- Check Types:该属性用于指定验证区域的类型,其中常用的有Layer(验证层)和Tag(验证标签),该属性可以复选,如果Operation选择的是 Ignore ,则相应的层或者标签下的物体将不可传送。
- Size、Element:设置了限制的具体内容,如果Check Types选择了Layer层,则Element中填写层的名称,如果选择了Tag标签,则Element中填写标签名称。Size用于指定Element的数量。
使用了VRTK插件后会自动生成一个Tag叫做ExcludeTeleport,我们可以将Operation选为Ignore,将Check Types选为Tag,将Element 0设置为ExcludeTeleport,再给不想让玩家传送的物体指定标签为ExcludeTeleport,这个物体就不能被传送了,如下图:
注意:通常情况下,场景物体形状可能会比较复杂(面数过多),这时候可以制作一些简单的物体作为碰撞体(顺便把MeshRenderer组件取消掉,以实现隐藏效果),将这个简单的物体覆盖在复杂的场景物体之上,这样就能有效降低碰撞检测的消耗。
玩家区域碰撞检测
当传送点为墙壁或者狭小空间时,如果不进行碰撞检测,遇到墙壁时传送点将会是墙壁正下方,角色传送过去会出现穿模的情况,所以要根据角色体型限制传送点与墙壁的间距。如果传送点是很狭小的空间,角色也应该设置碰撞检测,以避免穿模或其他bug。
设置方法:给手柄控制器增加VRTK_PlayAreaCursor组件,勾选Handle Play Area Cursor属性,设置Play Area Cursor Dimens属性(检测范围),并将此组件拖拽到光标指针组件的Playarea Cursor属性中。
此时传送终点会变成一个方框,如果方框内有墙壁等物体就会无法传送,实现结果如下:
方框形状由Play Area Cursor Dimens属性的x、y值决定。
忽略检测触发器
在游戏中经常会出现一些透明物体用做事件触发(比如当玩家进入某个区域生成新的敌人),这些物体被称为触发器,由于触发器有自己的碰撞体,即便触发器是透明的但传送点依然会将此物体视为实体,并允许传送到物体的上方。这种情况是我们所不允许的,所以要进行忽略检测。
实现忽略检测的方法:给手柄控制器添加VRTK_CustomRaycast组件,将Layers To Ignore属性设置为Trigger(该层是自己手动添加的,触发器的物体都应该在这个Layer中),将组件拖拽到光标指针的Custom Raycast属性中,如下图所示:
玩家区域碰撞检测忽略触发器
前面讲到的玩家区域碰撞检测在遇到触发器时会出现无法传送的情况,需要进行玩家区域的碰撞忽略功能设置。
设置方法:为手柄控制器再次添加一个新的VRTK_Policy List组件,设置需要忽略的层,然后将此组件拖拽到VRTK_PlayAreaCursor组件的Target List Policy属性中。
更多内容请查看总目录【Unity】Unity学习笔记目录整理
【Unity】虚拟现实 VRTK插件使用教程(二)人物传送、光标指针、传送规则、玩家区域检测相关推荐
- 【Unity】虚拟现实 VRTK插件使用教程(六)VR UI (UGUI和VRTK的事件处理机制)
文章目录 UI 2D UI 画布设置 相机设置 用途 3D UI 画布设置 交互 UGUI事件处理流程 VRTK事件处理流程 VRTK源码解析 UI UI通常按类别分为三种,即2D UI.3D UI. ...
- 【Unity】虚拟现实 VRTK插件使用教程(一)插件基本配置
文章目录 什么是VRTK 如何下载 基本配置 事件监听 HTC VIVE按键图例 什么是VRTK VRTK全称是Virtual Reality Toolkit,前身是SteamVR Toolkit,由 ...
- 微信小程序入坑教程二十一:使用wx.saveImageToPhotosAlbum保存图片时通过检测scope.writePhotosAlbum权限来提醒用户是否需要授权
摘要: 在昨天的文章<微信小程序入坑教程二十:生成海报前使用wx.downloadFile或wx.getImageInfo时潜在的坑>中提到了用户授权一事,scope.writePhoto ...
- Unity游戏Mod/插件制作教程05 - 插件实例2: 简单功能实现
这一次的教程进行一个小小的功能实现,完整的制作一个插件.以Mirror这个游戏为例,插件的目标是当玩家按下空格时,有一定概率为玩家增加金钱,或者扣除玩家金钱.概率.增加的金钱.扣除的金钱都由配置文件决 ...
- Unity游戏Mod/插件制作教程01 - BepInEx的安装和使用
前言 本章节为没有使用过BepInEx的同学进行BepInEx的安装和使用方面的介绍,如果你之前已经使用过并了解如何使用,可以直接跳过本章节. BepInEx下载 BepInEx的Github链接 h ...
- Unity游戏Mod/插件制作教程03 - 插件实例1: HelloWorld
准备工作 作为编程类的教程,果然第一个需要来一个传统项目--HelloWolrd. 在开始之前,我先贴一个链接,这是BepInex官方的开发手册 https://bepinex.github.io/b ...
- Unity游戏Mod/插件制作教程02 - 开发环境准备
前言 虽然本教程的目标读者是有C#基础的玩家,但是作为流程,基础的开发软件部分我还是要记录一下. 安装VisualStudio VisualStudio是我们开发插件最重要的工具,也许你习惯其他开发. ...
- Unity游戏Mod/插件制作教程06 - Harmony补丁基础
前言 通过之前的教程,我们已经知道如何编写基本的插件,如果你有C#和Unity的基础,这个时候已经可以做出一些功能了,比如通过按键修改游戏数据之类的.但是,这有很大的局限性,因为通常情况下,我们并不想 ...
- 【Unity】Obi插件系列(二)—— Backends、Updaters、Simulation
Backends Backends只在Obi 5.5.及以上版本可用.以前的版本只有一个后端可用(Oni),所以在求解器中没有后端下拉. Backends是Solver用来推进模拟的实际物理引擎.不同 ...
最新文章
- 谷歌浏览器插件,当前网页地址的二维码
- MYSQL存储过程中 使用变量 做表名--转
- 使用Docker运行SQL Server
- z490 linux raid,华硕z490主板装win7系统及bios设置教程(支持10代usb驱动)
- java单例模式(饿汉式和懒汉式的几种不同写法)
- AJAX-----02远古时期的ajax
- bae mysql_获取BAE上的MySQL相关信息
- cnblogs用户体验评价
- C#string与char互转
- Json对象的字符串转换
- 如何对 ABAP 数据库表通过 ABAP 代码进行更新和删除操作试读版
- jdbc驱动加载失败-解决方案
- persistent
- java设计一个bank类实现银行_关于JAVA设计一个银行账户管理类
- Java项目:人才求职招聘管理系统(java+SpringBoot+FreeMarker+JPA+Mysql)
- linux profiling 工具,高性能:LEP (LINUX EASY PROFILING) 工具介绍
- 利用python声音处理库librosa提取声音信号的mfcc特征及特征融合
- 云服务器安装并配置nginx
- 找不到电脑C盘下的AppData文件夹怎么办?
- 特斯拉Model3车主称无法开启;传高通开发首款笔记本处理器;Dfinity挑战亚马逊 | 雷锋早报...