OpenVR是一套不依赖特定硬件的API,基于c++开发
steamvr的瞬移功能 VRTeleport
找到瞬移的teleport的文件夹中的预制体,teleporting预制体是瞬移功能的基础
teleportpoint是瞬移的坐标
瞬移里面的locked表示瞬移坐标是否可以跳转
marker Active代表是否需要按下手柄中心圆盘才显示
teleport Type代表是瞬移到此坐标,还是瞬移这个坐标代表的是切换场景
title代表坐标上的UI名字
switch to scene代表若上瞬移类型选择了切换场景,则记录完整的场景切换地址,且进去teleport脚本中补充切换场景的方法,大概在200多行
VR场景中物体的交互
需要交互的物体挂上interactable脚本
手柄此时触碰物体会高亮颤抖,这依赖于两个手柄的Controller Hover Highlight的脚本,fire Haptics on Hightlight勾选决定了手柄是否颤抖
VR场景中 手柄触碰的事件添加Interactable Hover Events事件,手柄开始触碰,离开,吸附,不吸附时候调用的函数
手柄上的扳机,圆盘,边缘带点击时触发的函数方法需要添加Interactable Button Events脚本
手柄扣动扳机交互物体,挂上throwable即可对物体位置进行改变,throwable会自动添加一些脚本
点开throwable脚本,代码抬头位置三行代码表示如何在添加此脚本时强制添加其他组件
throwable脚本属性Attachment Flags代表物体与手柄互动的各种属性设置,是否设为子物体,是否直接复刻手柄位置等(即物体直接出现在手柄位置)
Attachment Point代表物体是否跟某个设定的gameobject位置保持一致
Catch Speed Threshold 代表扣动扳机后,延迟多久互动
Restore Original Parent 代表物体互动完后,是否还原她的父子关系
Attach Ease in代表是否开启吸附效果
下面的属性是吸附的曲线,吸附到手柄所需的时间
物体(此物体最好是一个不渲染的物体,保留网格和碰撞体即可)挂上ItemPackage Spawner脚本,require Trigger Press to Taked表示是否需要扳机扣动互动
第二个require Trigger Press to代表的是放回时是否需要扣动扳机再放回,为false时,接触到碰撞体就放回了
show Trigger Hint代表的是否有提示,接触到了碰撞体后
Take back Item属性表示是否能被放回
创建一个空物体,挂载上Item Package脚本,
Package Type选择是双手操作,还是单手操作
Item Prefab 代表互动后手上产生的物体
Other Hand Item Prefab 代表另一个手产生的物体
Preview Prefab代表预览产生的物体,即互动完放回去的物体
Faded Preview Prefab 代表产生的轮廓图标
此脚本完成后即可赋值给上述的spawner脚本中的第二个属性
产生的物体需要挂载Item Package Reference,并将挂载了ItemPackage的物体赋值给他,此时我们运行程序会发现,我们放回时,物体只是脱离了手柄,并没有消失,此时在产生的物体上挂载Destroy On Detached From Hand则物体会消失
如果我们要在触发地方放置一个物体,就将做好的预览物体放在挂载了itempackage Spawner的物体作为子物体,此脚本在运行时,扣动扳机时会自动销毁他下面的所有子物体
LinearDrive和CircularDrive一方面实现物体按照设定方式进行运动,另一方面输出数值到LinearMapping
LinearMapping提供0-1之间的数值,用以改变其他物体的属性,如位置,时间等
创建一个物体,在物体上挂载LinearDrive,创建两个空物体,给开始位置和结束位置赋值,创建个空物体挂载LinearMapping,然后赋值给,
reposition Game Object表示拖拽是否能产生位置变化
Maintain Monmemmtum表示结束拖拽后会有惯性产生
Momemtum Dampen Rate 代表的是摩檫力
创建一个空物体,命名为LinearMapping,并挂载LinearMapping脚本,脚本中的value值就是挂载了linearDrive的物体在开始和结束两个点之间的距离所占的比列
在要旋转的物体上挂载Circular Drive脚本
Axis of Rotation表示物体沿哪个轴旋转
Child Collider 指定相应的碰撞体将它设为旋转物体的子物体,旋转此碰撞体即可旋转父物体
Linear Mapping 赋值挂载此脚本的物体
Hover Lock 勾选则只要扳机不松开,就算离开触发范围,也能响应
Limited rotation代表在接近最大,最小值多少范围内就认为到了最大最小值
下面的两个属性代表了设置最大,最小值及触发事件
要勾选force start就只能在最大最小值中旋转
out Angle是将物体旋转的具体数据传递出去,真实的角度
新建Canvas
Render Mode改为World space
修改缩放
修改Dynamic Pixel per Unit
添加相关元素
按钮点击基于Collider 一般放置boxcollider
UIElement类 在InteractionSystem中实现ui的交互,必须挂载此脚本以标记为可交互的UI
按钮一般事件为OnHandClick 手柄点击Trigger键激活
ControllerButtonHints类:调用一系列静态方法实现按钮高亮,文字提示
在互动的UI上添加UI ELement脚本
创建空物体,挂载自创脚本,脚本
脚本创建后,绑定在IElment的OnClick上
VRMirror 镜子效果
在镜子模型下创建照相机
创建一个材质球,创建一个RenderTexture,将镜子摄像机的TargetTexture指定他,然后将rendertexture赋值给材质球,将材质球的shader改为unit的Texture(不改会导致画面暗淡),然后赋值给镜面
创建脚本控制镜子摄像机使镜面投射的物体始终与VR人的角度相反,呈现镜子效果