unity手柄中如何利用htc的手柄进行触发动画

根据上一个博客我们实现了用vr看观察场景,能够用手柄来实现指针的效果,这次我们来实现两种瞬移效果。


此时就可以顺义了,但是我们只能在平面上瞬移,不能够上下的瞬移,接下来实现自适应高度的瞬移


在使用贝泽尔曲线是要修改贝泽尔脚本的Cursor Match Target勾选,这样可以实现指针末端不会穿透地形的效果。



可以自行选择要瞬移的方式。

}

HTC Vive 是一个虚拟现实头盔,由 HTC 和 Valve 公司制造。它提供一种在虚拟世界中的浸入式体验,而不是屏幕头像。

如果你是一个 Unity 开发者,在虚拟现实游戏中使用 HTC Vive 非常简单——你可以认为 HTC Vive 和 Unity 是天生一对。

  • 在 VR 中和物理对象交互

在本文最后,你将对未来体验有一个粗略的了解。让我们开始吧!

注:每个人在戴着头戴式显示器都会对运动和旋转产生不同的反应。如果你是第一此穿戴此类设备,当感觉不适时请放松并深呼吸。大部分人很快就会适应 VR。开头几次如果你不适应请不要着急——它很快就会过去。

在正式开始学习之前,你必须拥有下列条件:

  • 在机器上安装有 Unity 5.5 或更高版本。
  • 一套完整的 HTC Vive 硬件,并配置和升级好软件。

开始项目。解压缩到任意目录并用 Unity 打开。在项目窗口中看一眼文件夹:

每个文件夹都和对应的资源一一对应:

看一看场景视图,按 play 按钮运行游戏:

这里不会有太多内容,因为场景中还没有加入 VR 控制。你需要将 SteamVR 添加到项目中,以便将 Vive 连接到 Unity。

等商店页面加载完,在搜索栏中输入 StreamVR 并回车。上下滚动浏览搜索结果,点击 StreamVR Plugin,会打开它的商店页面:

点击 Download 按钮,然后静静等待。等下载完成,你看到导入包对话框。

点击右下角的 Import,导入包:

等导入完成,你会看到下列提示:

点击 I Made a Backup 按钮,让编辑器对脚本进行预编。几秒后会看到这个窗口:

这是 SteamVR 插件的界面。它会列出一些编辑器设置,这些设置能够提升性能和兼容性。

当你打开一个新项目并导入 SteamVR 时,你会在这里看到几个选项。因为开始项目已经优化过,这里我们只需要禁用解析度对话框(resolution dialog)即可。点击 Accept All 按钮,执行所有推荐的修改。关闭 Asset 商店回到场景视图。在项目窗口中,我们现在多了一个新文件夹 SteamVR:

打开这个文件夹,看一眼内容。我们会从 Prefabs 文件中添加一个 VR GameObjects 到场景中。

[SteamVR] 负责几件事情。它在玩家打开系统菜单并将物理刷新率和绘图系统进行同步时让游戏自动暂停。它还负责处理“房间规模 VR 动作”的平滑。在检视器面板中查看属性:

从结构视图中删除主摄像,因为这会干扰 [CameraRig] 和它的相机。

打开手柄,查看屏幕。拿起手柄,四处移动。你会看到在场景视图中看到虚拟手柄也会随之移动:

当 SteamVR 插件检测到手柄,它会创建出虚拟手柄。虚拟手柄被映射为 [CameraRig] 的子节点:

现在——继续在场景视图中——从结构视图中选择 Camera(eye),小心地拿起你的头盔显示器的顶部皮带,移动并微微旋转,同时观察场景视图:

摄像机和头盔显示器是连接在一起的,它会准确地捕获头盔的移动。

现在将头盔显示器戴到头上,拿起手柄,在房间里四处走动感受一下。

如果你想和物体进行交互,那么你会大失所望——什么也不会发生。要添加运动跟踪之外的功能,需要编写一点脚本。

拿起一只手柄,仔细观察。每个控制器上有这些按钮:

Touchpad 既是可以做模拟摇杆也可以当做按钮。当移动或旋转手柄时,手柄会有速度和旋转速度感应,当和物体交互时这会非常有用。

让我们来编写一些代码!在 Scripts 文件夹中创建一个新的 C# 脚本,取名为 ViveControllerInputTest 然后用任意代码编辑器打开它。


 
我们在这里进行了如下操作:

  1. 对正在被跟踪的对象进行一个引用。在这里,也就是一只手柄。
  2. Device 属性能够很方便地访问到这个手柄。通过所跟踪的对象的索引来访问控制器的 input,并返回这个 input。
 
头盔和手柄都是被跟踪的对象——他们在真实事件中的移动和旋转都会被 HTC Vive 跟踪到并传递到虚拟世界。



现在你已经能够访问手柄了,你可以读取到它的输入。在 Update() 方法中添加:
上述代码包含了所有当玩家在 VR 中时你够访问到大部分方法。它将 GameObject 的名字输出到控制台,以便区分左右手柄。代码的解释如下:
  1. 获取手指在 touchpad 上的位置并输出到控制台。
  2. 如果松开扳机,这会打印到控制台。
  3. 如果按下抓取(grip)键,这会打印到控制台。GetPressDown 方法是用于判断某个按钮已经被按下的标准方法。
  4. 如果释放抓取键,这会打印到控制台。GetPressUp 方法是用于判断某个按钮是否已经被释放的标准方法。
 
来测试一下脚本。保存脚本,返回 Unity 编辑器。
在结构视图中选中两个手柄,拖动刚才创建的脚本到检视器中,为它们添加 ViveControllerInputTest 组件。

再次运行游戏,拿起两只手柄,观察控制台中的输出:

按下按钮,扳机并在 touchpad 上滑动,你会看到控制台会输出每个我们注册的动作:

这仅仅是最基本的输入。现在我们可以将虚拟世界操纵在我的手心了——差不多这个意思啦!

 
VR 提供了许多我们在真实世界中不可能实现的能力,比如捡起一个物体,查看它们并扔到地上,不需要你负责清理。
通过使用触发器碰撞机和编写少量脚本,HTC Vive 能够创建后顾无忧的虚拟体验。




默认的碰撞体有点大,我们需要重新指定大小和位置。设置中心为 (X:0, Y:-0.04, Z:0.02),大小为 (X:0.14, Y:0.07, Z:0.05)。这里需要将值精确到两位数,否则都会影响到手柄的最终效果。

运行游戏,从结构视图中选择一只手柄,并拿起真正的手柄。观察场景视图,然后将焦点置于你正在拿着的那只手柄上(按F)。将碰撞体正好放在手柄的顶端部分,这个部分是你用于抓握物体的地方。

不编写脚本,碰撞体仅仅是一个无用的方块——在 Scripts 文件夹中创建一个新脚本,取名为 ControllerGrabObject 然后打开它。、
删除 Start() 方法并在这里添加这段你已经熟悉的代码:
这段代码和你在输入测试中的代码是一样的。这里获取了手柄,然后保存到一个变量中以备后用。

 
这两个变量的作用分别是:

  1. 一个 GameObject,用于保存当前与之碰撞的触发器(trigger),这样你才能抓住这个对象。
  2. 一个 GameObject,用于保存玩家当前抓住的对象。
 

这个方法接受一个碰撞体作为参数,并将它的 GameObject 保存到 collidingObject 变量,以便抓住和释放这个对象。同时:
  1. 如果玩家已经抓着某些东西了,或者这个对象没有一个刚性体,则不要将这个 GameObject 作为可以抓取目标。
  2. 将这个对象作为可以抓取的目标。
 
现在,添加触发器方法:

 
当触发器碰撞体进入、退出另一个碰撞体时,这些方法将被触发。

  1. 当触发器碰撞体进入另一个碰撞体时,将另一个碰撞体作为可以抓取的目标。
  2. 和第一段类似(第一段注释 //1),但不同的是玩家已经将手柄放在一个对象上并持续一段时间。如果没有这段代码,碰撞会失败或者会导致异常。
  3. 当碰撞体退出一个对象,放弃目标,这段代码会将 collidingObject 设为 null 以删除目标对象。
 
下面的代码用于抓住一个对象:
  1. 添加一个连接对象,调用下面的 FixedJoint 方法将手柄和 GameObject 连接起来。
  2. 创建一个固定连接并加到手柄中,并设置连接属性,使它坚固,不那么容易断裂。最后返回这个连接。
 
被抓住的东西也要能够被放下。下面的代码放下一个物体:
这段代码将被抓对象的固定连接删除,并在玩家扔出去时控制它的速度和角度。这里关键的是手柄的速度。如果没有这个,扔出的东西会直直地往下掉,不管你用多大的力扔它。相信我,这绝对是错误的。
  1. 确定控制器上一定有一个固定连接。
  2. 删除这个连接上所连的对象,然后销毁这个连接。
  3. 将玩家放开物体时手柄的速度和角度赋给这个物体,这样会形成了一个完美的抛物线。
 
最后,在 Update() 方法中添加代码以处理手柄的输入:

 
  1. 当玩家按下扳机,同时手上有一个可以抓取的对象,则将对象抓住。
  2. 当玩家松开扳机,同时手柄上连接着一个物体,则放开这个物体。
 
相信你已经迫不及待地想试一把了吧?保存脚本,退出编辑器。
在结构视图中选中手柄,将新脚本拖到检视器中将它添加为一个组件。

开心的时候来了!打开你的手柄,运行游戏,戴上头盔。按下扳机,抓起几个方块或者圆球,扔出去。你可能需要适应一下。

你不得不佩服你自己——你真的很棒!但我觉得你应该让你的 VR 体验变得更好!

 
因为种种原因,激光笔在 VR 世界中非常有用。你可以用它们去戳破虚拟气球,做瞄准具使用或者调戏虚拟猫咪。
创建激光笔非常简单。只需要一个方块和一个脚本。在结构视图中创建一个方块 (Create > 3D Object > Cube)。



激光不可能有阴影,它们只会有一种颜色,因此我们可以用一个不反光材质实现这个效果。


通过将材质拖到场景视图的 Laser 上即可分配新材质。当然,也可以将材质拖到结构视图的 Laser 上。



现在,在 Scripts 文件夹下创建一个新脚本,名为 LaserPointer,并打开它。添加你早已熟悉的代码:

 
 

 


 
如果目标地点无效,隐藏传送标记。
添加下列方法,进行传送:
真正的传送只需要 5 行代码吗?让我们解释一下:
  1. 计算从玩家头盔到摄像机中心的坐标偏移。
  2. 将这个差中的 y 坐标设置为0,因为我们不考虑玩家头部有多高。
  3. 移动相机到照射点加上所算出来的坐标偏移。如果不加上这个偏移,玩家会传送到一个错误的地方。看下面的例子:
 

看到了没有,这个偏移起到了一个关键的作用,让我们精确地定位摄像机的位置并将玩家放到他们想去的地方。

如果玩家松开 touchpad,同时传送位置有效的话,对玩家进行传送。
最后,在 Start() 方法中添加代码:

 
  1. 创建一个标记点,并将它保存到 reticle 变量。
 
保存脚本,返回 Unity。
在结构视图中选中两个手柄,会发现多了几个新字段:




现在运行游戏,用激光照射在地板上进行瞬移。

这个示例已经完成,准备尽情地游戏吧!

 
你可以在下载完成后的项目。在本教程中,你学会了:
  • 在 VR 中与物理对象交互。
 
这个项目只是一个开始——开始在你自己的项目中使用它!我很想看到你最终完成的作品。
如果你喜欢这个教程,并向学习更多内容,你可以阅读我们的这本书:,那里会有更多关于虚拟现实游戏的内容,包括对 Oculus Rift 的支持。
要理解这本书到底说了些什么,最简单的法子莫过于观看这个视频:

谢谢观赏,希望你喜欢这篇教程,就像我很享受写它时所带来的乐趣一样。
如果有任何建议、问题或者你想战士对示例项目所进行改进,请在下面留言。
  1. 移动传送标记到激光点到的地方,并添加一个偏移以免 z 缓冲冲突。
 
  1. 这个变量用于引用 Laser 预制件。
  2. 这个变量用于引用一个 Laser 实例。
  3. 一个 Transform 组件,方便后面适用。
 
用这个方法显示一束激光:
这个方法使用一个 RaycastHit 作为参数,因为它会包含被击中的位置和射击的距离。
  1. 激光位于手柄和投射点之间。我们可以用 Lerp 方法,这样我们只需要给它两个端点,以及一个距离百分比即可。如果我们设置这个百分比为 0.5,也就是 50%,这会返回一个中点的位置。
 
在 Update() 方法中添加下列代码,获得玩家的输入:
  1. 从手柄发射激光。如果激光照射到某样物体,保存射到的位置并显示激光。
  2. 当玩家放开 touchpad,隐藏激光。
 
在空的 Start() 方法中添加代码:

 
 
替换为这句,以便将 LayerMask 加入到判断中:
  1. 制造出一束新的激光,然后保存一个它的引用。
 
保存脚本,返回编辑器。在结构视图中选中两个手柄,将激光的脚本拖进检视器中以添加一个组件。



保存项目,重新运行游戏。拿起手柄,戴上头盔,按下 touchpad,激光出现了:

在继续之前,右击输入测试组件,选择 Remove Component,从手柄中删除它们。
之所以要删除输入测试组件,因为会在绘制每一帧时向控制台中输出字符串。这会影响性能,在 VR 中每毫秒都会受影响。为了方便测试我们可以这样做,但在真正的游戏中这是不应该的。
接下来是通过激光在房间中进行瞬移!

 
在 VR 中移动不像驱使玩家前进那么简单,这样做会极易引起玩家眩晕。更可行的办法是使用瞬移。
从玩家的视觉感知来说,宁可接收位置的突然改变,而不是渐进式的改变。在 VR 设备中轻微的改变都会让你的速度感和平衡感彻底失控,还不如直接让你来到一个新的地方。
要显示你最终位于什么地方,你你可以使用 Prefabs 文件夹中的大头钉或标记。
标记是一个简单的、不反光的圆环:

要使用标记,你需要修改 LaserPointer 脚本,打开这个脚本,在类声明中添加变量:

 
  1. 一个对传送标记预制件的引用。
  2. 一个传送标记实例的引用。
  3. 玩家的头(摄像机)的引用。
  4. 标记距离地板的偏移,以防止和其他平面发生“z-缓冲冲突”。
  5. 一个层遮罩,用于过滤这个地方允许什么东西传送。
  6. 如果为 true,表明找到一个有效的传送点。
 
}

鉴于某些手机在使用大朋SDK以及谷歌SDK时会出现神器的小屏现象(比如某想的)故为了能够最大程度的兼容更多的手机,决定使用暴风魔镜的SDK。废话不多说~直接将使用暴风魔镜SDK时遇到的问题以及解决方案简单的罗列一下:

一、蓝牙手柄按键的响应

在暴风魔镜的官网下载了最新的SDK后导入Unity项目,发现SDK中的DEMO全部是非手柄控制的,然后只能参照着SDK里面的接口说明文档自己研究~~结果发现接口文档非一般的坑,一开始是直接在/u/article/details/

}

我要回帖

更多关于 unity手柄 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信