基于UWP,如何快速创建跨多设备形态的混合现实应用,提供适用于HoloLens以及Windows MR头显的交互共享体验?
环境配置
混合现实设备:至少一台HoloLens及Windows MR 头显,HoloLens系统启用开发者模式;
PC设备:
(1) 安装Windows 10 秋季更新及以上版本的操作系统,以及Unity 2017.2及以上版本,系统启用开发者模式;
(2) PC配置需满足Windows MR头显运行的最低要求,PC需带有全尺寸的HDMI接口以及USB 3.0端口或等标准的适配器,用于连接Windows头显设备;
网络环境:允许收发UDP广播;
Windows MR头显控制器:一个Xbox控制手柄,与PC配对;
进行本次课程的项目下载,并进行工具安装。接下来开始具体开发上手。同HoloLens开发类似,该场景最重要的两个目的是实现应用的交互与共享。
1.两种设备的交互识别
该部分目的是实现Windows Mixed Reality应用程序在两类混合现实设备间的交互操作识别。通过添加应用程序,HoloLens设备用户可以将全息影像放在现实世界的物理表面,使用Windows MR 头显的用户可以将其放在虚拟表面。接着,开始场景刷新:在HoloLens进行Air Tap手势操作,对于Windows MR 头显,需要按下Xbox 控制手柄的A按键。
2.设备的场景共享
实施共享操作需要确保网络配置正确,才能在多设备间共享同一个虚拟世界。不同用户虽然身处不同物理位置,却可以在同一个虚拟世界里进行互动。比如,使用Windows MR头显的用户通过添加用户界面与逻辑进入正在进行的多人会议,用户能够在会议中看到其他与会者的头像、虚拟身体、动作语言等,以及虚拟会议室的全息场景,此外,用户甚至可以从不同的高度及角度观察整个会议场景。
应用部署完成后,我们就能在不同设备上查看到相同的全息场景。
HoloLens与Windows MR头显虽然同属Windows混合现实家族,但是,不同设备毕竟具备不同特性,如何才能根据设备各自属性调整对应的画质等级,并进行背景设置呢?这里,可以参考Unity2017.2以上版本的工具包脚本MixedRealityCameraManager.cs中静态方法:
这个方法会返回一个bool值,从而检测设备为HoloLens(IsDisplayOpaque返回false)还是Windows MR头显(IsDisplayOpaque返回true)。这在部署不同设备时起到了非常重要的作用。
当部署完全息影像后,就可以通过不同设备的输入操作与它们交互了。
注意:在Windows MR头显看到的沉浸式世界,由于没有真实表面的概念,因此在代码中对虚拟世界的虚拟物体标记为空间映射的物理层。这样通过控制手柄的输入指令,即朝输入方向发出的射线就会与虚拟影像进行交互。
这个时候,就可以开始为我们的项目添加多人协同的功能。如上文所述,在把项目部署到设备上之后,会根据编译好的代码在你的设备上呈现不同的全息世界。
这里着重讲一下脚本LevelControl,作为本文中最核心的游戏逻辑处理类,同时也在维护着游戏状态。此类继承于NetworkBehaviour类,作为一个包含网络功能的脚本继承基类,它之中封装了大量的网络通讯及处理的函数。我们之前了解到,此项目是以UNet(unity networking)技术实现的多玩家在线游戏,利用这个技术来保持数据的同步。下图为代码:
这里的CmdSendAtGoal函数内部逻辑没被本地调用,而是在函数签名上加特性[Command],此时每个有权限的用户需要向主机端发送“Command”,来传递参数给主机端,经由主机端处理完成之后再通过网络分发给所有用户。
注意:标有[Command]属性的函数,在服务端上调用,在服务端运行,函数参数会通过网络传到服务端。这里的服务端指第一个创建Session的主机端。