【Unity】虚拟现实 VRTK插件使用教程(五)看源码了解VRTK设计思路


传送组件的实现原理

前面的文章中我们了解到,要想实现传送,最主要的工作就是两步。

  1. 给手柄控制器增加光标指针和光标指针渲染器。
  2. 给要传送的物体增加传送组件。

添加好组件以后并不需要显式的给两者进行关联,传送的功能就实现了。

传送组件怎么和光标指针关联的?

传送组件(VRTK_BasicTeleport)的源码中,在OnEnable方法中使用协程调用了 InitListenersAtEndOfFrame 方法,该方法的实际内容就是在帧的最末尾调用 InitDestinationMarkerListeners 方法,此方法中做了以下几件事:

  1. 获取左右手的 GameObject 对象,传到 InitDestinationSetListener 方法中。
  2. 获取所有 VRTK_ObjectCache 中缓存的VRTK游戏对象,传到 InitDestinationSetListener 方法中。

代码如下:
在这里插入图片描述
从代码中我们看出,不管是哪种情况,最终的目标都是为了 InitDestinationSetListener(初始化监听)。

如何初始化监听?

InitDestinationSetListener 方法做了什么呢?

官方的注释写的是

The InitDestinationSetListener method is used to register the teleport script to listen to events from the given game object that is used to generate destination markers. Any destination set event emitted by a registered game object will initiate the teleport to the given destination location.

翻译一下

InitDestinationSetListener 方法用于注册传送脚本来监听来自给定游戏对象的事件,该对象用于生成目标标记。由已注册的游戏对象发出的任何目的地设置事件都将启动到给定目的地位置的传送

在这里插入图片描述
文字的意思相对晦涩一些,我们看一下代码。从 += 和 -= 我们不难看出,这个方法的核心就是遍历对象,增加事件处理器。

遍历的是什么对象呢?

从代码中可以看出遍历的是我们传入这个方法的游戏对象下面所有子节点中的 VRTK_DestinationMarker 组件,这个组件你一定很陌生,但它的爸爸你肯定很熟悉,请看代码:
在这里插入图片描述
懂了吗?实际上刚才我们遍历的就是游戏对象下面所有的继承于 VRTK_DestinationMarker 的组件,其中就包含了我们添加到手柄控制器上面的 VRTK_Pointer 。

遍历以后做了什么呢?

遍历后给光标组件的 DestinationMarkerSet 事件注册处理器。这是个什么事件呢?VRTK_DestinationMarker提供了四个事件:

  • DestinationMarkerEnter: 光标进入目标点
  • DestinationMarkerExit: 光标离开目标点
  • DestinationMarkerHover: 光标在目标点悬停
  • DestinationMarkerSet: 光标选中目标点
    所以这一步其实是给光标选中目标点这个事件提供了新的处理器。

事件处理器做了什么呢?

我们来看一下事件处理器DoTeleport的内容。
在这里插入图片描述

当代码执行到底297行,玩家的位置就进行了改变,这就是真正的传送操作,详见下图:
在这里插入图片描述

总结

VRTK处理传送事件的方式并不是通过指针(VRTK_Pointer)的事件来直接指定要做什么,而是在真正的操作类(比如传送组件)中自己生成一个传送的钩子,然后遍历所有注册了VRTK的对象,找到所有的指针类,然后将钩子挂到指针的事件序列中。这样做的好处是传送更灵活,一个指针可以在不知道传送对象存在的情况下实现传送。当然也有缺点,缺点就是当项目过于庞大后对于事件的管理会相对困难。

总的来说思路还是很好的,且在查看这些源码的过程中我们也顺便了解了VRTK的一些实现机制以及代码结构,比如用于缓存VRTK游戏对象的 VRTK_ObjectCache 类,还有用于查找手柄控制器的 VRTK_DeviceFinder以后找手柄对象的方法又多了。还有VRTK_Pointer 的爸爸 VRTK_DestinationMarker(抽象类)。


更多内容请查看总目录【Unity】Unity学习笔记目录整理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值