基于UWP,如何快速創(chuàng)建跨多設(shè)備形態(tài)的混合現(xiàn)實應(yīng)用,提供適用于HoloLens以及Windows MR頭顯的交互共享體驗?
環(huán)境配置
混合現(xiàn)實設(shè)備:至少一臺HoloLens及Windows MR 頭顯,HoloLens系統(tǒng)啟用開發(fā)者模式;
PC設(shè)備:
(1) 安裝Windows 10 秋季更新及以上版本的操作系統(tǒng),以及Unity 2017.2及以上版本,系統(tǒng)啟用開發(fā)者模式;
(2) PC配置需滿足Windows MR頭顯運行的最低要求,PC需帶有全尺寸的HDMI接口以及USB 3.0端口或等標(biāo)準(zhǔn)的適配器,用于連接Windows頭顯設(shè)備;
網(wǎng)絡(luò)環(huán)境:允許收發(fā)UDP廣播;
Windows MR頭顯控制器:一個Xbox控制手柄,與PC配對;
進(jìn)行本次課程的項目下載,并進(jìn)行工具安裝。接下來開始具體開發(fā)上手。同HoloLens開發(fā)類似,該場景最重要的兩個目的是實現(xiàn)應(yīng)用的交互與共享。
1.兩種設(shè)備的交互識別
該部分目的是實現(xiàn)Windows Mixed Reality應(yīng)用程序在兩類混合現(xiàn)實設(shè)備間的交互操作識別。通過添加應(yīng)用程序,HoloLens設(shè)備用戶可以將全息影像放在現(xiàn)實世界的物理表面,使用Windows MR 頭顯的用戶可以將其放在虛擬表面。接著,開始場景刷新:在HoloLens進(jìn)行Air Tap手勢操作,對于Windows MR 頭顯,需要按下Xbox 控制手柄的A按鍵。
2.設(shè)備的場景共享
實施共享操作需要確保網(wǎng)絡(luò)配置正確,才能在多設(shè)備間共享同一個虛擬世界。不同用戶雖然身處不同物理位置,卻可以在同一個虛擬世界里進(jìn)行互動。比如,使用Windows MR頭顯的用戶通過添加用戶界面與邏輯進(jìn)入正在進(jìn)行的多人會議,用戶能夠在會議中看到其他與會者的頭像、虛擬身體、動作語言等,以及虛擬會議室的全息場景,此外,用戶甚至可以從不同的高度及角度觀察整個會議場景。
應(yīng)用部署完成后,我們就能在不同設(shè)備上查看到相同的全息場景。
HoloLens與Windows MR頭顯雖然同屬Windows混合現(xiàn)實家族,但是,不同設(shè)備畢竟具備不同特性,如何才能根據(jù)設(shè)備各自屬性調(diào)整對應(yīng)的畫質(zhì)等級,并進(jìn)行背景設(shè)置呢?這里,可以參考Unity2017.2以上版本的工具包腳本MixedRealityCameraManager.cs中靜態(tài)方法:?
實靜態(tài)方法.png)
這個方法會返回一個bool值,從而檢測設(shè)備為HoloLens(IsDisplayOpaque返回false)還是Windows MR頭顯(IsDisplayOpaque返回true)。這在部署不同設(shè)備時起到了非常重要的作用。
當(dāng)部署完全息影像后,就可以通過不同設(shè)備的輸入操作與它們交互了。
注意:在Windows MR頭顯看到的沉浸式世界,由于沒有真實表面的概念,因此在代碼中對虛擬世界的虛擬物體標(biāo)記為空間映射的物理層。這樣通過控制手柄的輸入指令,即朝輸入方向發(fā)出的射線就會與虛擬影像進(jìn)行交互。
這個時候,就可以開始為我們的項目添加多人協(xié)同的功能。如上文所述,在把項目部署到設(shè)備上之后,會根據(jù)編譯好的代碼在你的設(shè)備上呈現(xiàn)不同的全息世界。
這里著重講一下腳本LevelControl,作為本文中最核心的游戲邏輯處理類,同時也在維護(hù)著游戲狀態(tài)。此類繼承于NetworkBehaviour類,作為一個包含網(wǎng)絡(luò)功能的腳本繼承基類,它之中封裝了大量的網(wǎng)絡(luò)通訊及處理的函數(shù)。我們之前了解到,此項目是以UNet(unity networking)技術(shù)實現(xiàn)的多玩家在線游戲,利用這個技術(shù)來保持?jǐn)?shù)據(jù)的同步。下圖為代碼:

這里的CmdSendAtGoal函數(shù)內(nèi)部邏輯沒被本地調(diào)用,而是在函數(shù)簽名上加特性[Command],此時每個有權(quán)限的用戶需要向主機端發(fā)送“Command”,來傳遞參數(shù)給主機端,經(jīng)由主機端處理完成之后再通過網(wǎng)絡(luò)分發(fā)給所有用戶。
注意:標(biāo)有[Command]屬性的函數(shù),在服務(wù)端上調(diào)用,在服務(wù)端運行,函數(shù)參數(shù)會通過網(wǎng)絡(luò)傳到服務(wù)端。這里的服務(wù)端指第一個創(chuàng)建Session的主機端。