Mixed Reality Toolkit-Unity 开发系列—Sharing 模块

By | 2018年7月2日

 


今天要为大家带来的内容是我们在 HoloLens 开发时,经常使用到的一个开发神器-微软原生开发包 Mixed Reality Toolkit-Unity(简称“MRTK”):这是一组脚本和组件集成的开源开发工具包,旨在加速针对用 Unity 开发 Windows 的混合现实应用程序。

整个工具包分为九大模块: Sharing,Input,Spatial Mapping,Spatial Sound,UX Controls,Utilities,Spatial Understanding,Build,Boundary,他们各自在 MR 开发中担任不同的功能。目前最新支持的 Unity 版本为 2017.2.1。

Sharing 模块上手实践

本文,我们首先手把手教大家使用 Unity 制作一个小 Demo,帮助大家深入了解 MRTK 工具包中的 Sharing 模块。

MixedRealityToolkit.Sharing 库允许应用程序跨越多个设备,并启用全息协作。Sharing 使用户可以使用多个设备执行任务,允许在每个设备上运行的应用程序通信并保持无缝实时同步。

首先,我们先从 GitHub 下载对应的工具包(下载链接见文末附录1)。

GitHub对应工具包

下载成功后,我们打开项目,可以看到这时 Unity 上方 Configuration 工具栏加载出 Mixed Reality Toolkit 选项,这其中包含对发布到 UWP 时的一些参数设置,其中最重要的就是对所发布设备的功能勾选:

配置 Other Setting 中的 Capabilities

这时,还是通过刚才 MRTK 选项的下拉菜单中点击  Launch Sharing Servic 运行共享服务,将会在您的机器上创建一个新的服务器实例。如下图:

启动服务器

共享会话服务器是一个 64 位的 Win32 应用程序,可以在命令提示符下运行或作为 Windows 服务运行。使用 MixedRealityToolkit.Sharing 客户端的应用程序可以连接到该服务以发现彼此,共同加入共享 Session,并且便于 VoIP 通信和空间锚定位共享。

此时,检查服务器是否成功打开,若成功打开则会在控制台打印如下图:

服务器开启

需要注意的是:1.仔细检查您场景中需要连接服务器的地址是否与控制台中显示地址相匹配2.确保所需要的协同设备都连接到相同的无线局域网3.确保所有防火墙设置都正确,保证连接不会受限。

接着,就可以把 Demo 部署到相应设备上来观察了:本文以一个样本场景来剖析协同原理,在 Unity 中打开 SharingTest 场景,我们借助两台 HoloLens 来展示对应的效果。分别部署到两台设备之后,运行程序可以看到控制台打印如图下:

设备成功连接服务器

连接之后,我们可以看到设备加入到网络的构建过程,房间的客户端之间共享的消息内容,如何在客户端之间共享空间锚以及在加入房间的用户头上绘制立方体。动手操作后,我们可以大致了解在 MR 世界中协同工作的原理。设备在连接后,程序会检测是否有与客户端相匹配的空间锚,如果有则下载并同步位置,如果没有则上传空间锚到服务端,并对其他后加入的设备重复此步骤。最后的 Demo 效果图如下:

在 PC 端的 Demo 展示

Sharing 模块的工作机制

接下来,让我们从代码层面来解读一下 Sharing 模块的工作机制,还是以这个场景为例。在 RemoteHeadManager.cs 脚本中,在 Start 回调函数里,第一行代码是将消息处理函数绑定到委托上,这个我们在后边展开来讲。此外则是对服务器进行访问连接,将客户端加入和离开房间的方法绑定到一个负责管理应用程序核心网络层的单例脚本 SharingStage.cs 中。

建立服务器连接并跟踪客户端行为

SharingStage 类具有以下职责:1.服务器配置(地址,端口和客户端角色)2.建立和管理服务器连接3.创建并初始化同步数据模型(SyncRoot)4.创建跟踪服务器上所有会话的 ServerSessionsTracker

5.创建跟踪当前会话中的用户的 SessionUsersTracker

经过函数内部一系列的逻辑处理之后,服务器会创建和跟踪服务器上的各种会话,当发现连接时,通过 SharingStage.cs 脚本创建实例,并将与之相关的事件公开出来。此外,还会跟踪当前会话和其中用户的行为,并且也会将所触发的事件暴露。在本例中,所有的事件都会被打印出来,您可以在 MR 设备中进行查看 Log 从而获得信息。

完成以上步骤,我们就已经搭好一条与服务器的沟通渠道了。此时,只需要包装一个通用的消息格式,即可进行协同!

在 Game 视图中,可以看到如果加入一台设备,场景中就会生成一个方块来代表它,并且同步空间位置以及它的旋转角度,做法就是将 HoloLens 的变换信息实时的通过网络传输来改变方块的 transform,我们回到代码中来看一看。

包装消息的函数体

消息包装好之后,就通过广播的形式发送给在房间的各设备。还记得之前提到的绑定消息处理函数吗?当收到消息之后,对应 ID 的设备将会解析消息,并将它交给之后的函数体处理。

更新方块的  transform

这个函数将会在接收到消息时调用,实时的更新方块的 transform。这样,一套简单的协同环境就已经构建好了,接下来,您可以填充更多的逻辑让它变得更有趣。

【转自:微软 Hololens 微信公众号】

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注