Unity官方示例:在ARCore和ARKit中實(shí)現(xiàn)多人游戲
雷鋒網(wǎng)按:自ARKit和ARCore推出以來(lái)产雹,不少游戲開(kāi)發(fā)者已經(jīng)用ARKit開(kāi)發(fā)出了很多好玩的游戲奕锌。但是不少開(kāi)發(fā)者都向雷鋒網(wǎng)(公眾號(hào):雷鋒網(wǎng))表示由于ARKit目前還難以支持多人游戲,大大降低了AR游戲的社交性和可玩性,也限制了游戲場(chǎng)景。在Unity Austin 2017中,Unity向大家介紹了如何在Unity中使用ARKit和ARCore髓梅,以及如何解決多人游戲的問(wèn)題。此文原發(fā)于“Unity官方平臺(tái)”公眾號(hào)绎签,雷鋒網(wǎng)獲授權(quán)轉(zhuǎn)載枯饿。
在Unite Austin 2017中,Unity的開(kāi)發(fā)人員 Jimmy Alamparambil和Tim Mowrer做了一場(chǎng)演講《在Unity中使用ARKit和ARCore》诡必。演講的目地是為了把AR介紹給大家奢方,并給大家展示ARKit和ARCore的各種功能。更重要Unity想讓開(kāi)發(fā)者有足夠的興趣為這兩個(gè)平臺(tái)開(kāi)發(fā)內(nèi)容爸舒。
下面是一個(gè)小時(shí)的Unite Austin 2017視頻(流量黨慎入s帧)
請(qǐng)注意:演講中用到的例子和代碼都是試驗(yàn)性的。所用到包也不會(huì)得到Unity的官方支持扭勉,在ARCore或是ARKit上之后的任何改動(dòng)都可能讓這個(gè)包失效鹊奖。
開(kāi)發(fā)者們的第一個(gè)需求,他們想要編寫(xiě)出能夠跨平臺(tái)使用的代碼涂炎,這樣能便于同時(shí)在ARKit和ARCore上嫉入,或是其它未來(lái)可能出現(xiàn)的平臺(tái)上使用。這個(gè)需求與Unity的核心價(jià)值十分相符璧尸,我們就是要實(shí)現(xiàn)統(tǒng)一化開(kāi)發(fā)咒林,讓開(kāi)發(fā)者能夠一次編碼、多平臺(tái)部署爷光。為了實(shí)現(xiàn)這個(gè)目的垫竞,我們開(kāi)發(fā)了一個(gè)試驗(yàn)性的API,并希望這個(gè)API能演變?yōu)榧傻目缙脚_(tái)API。
第二個(gè)需求是如何解決AR中顯示縮放內(nèi)容的問(wèn)題欢瞪。
第三個(gè)需求是如何使用Unity中現(xiàn)成的功能來(lái)實(shí)現(xiàn)多人游戲功能活烙。
這次演講中,我們回應(yīng)了以上的三個(gè)需求遣鼓。而在這篇文章中啸盏,我們希望為你帶來(lái)演講中的更多細(xì)節(jié),幫助你使用演講中的示例代碼骑祟。
下載示例代碼
你可以訪問(wèn)GitHub下載演講中的示例代碼回懦,下載地址請(qǐng)?jiān)L問(wèn)文末。
要想使用ARKit或ARCore次企,以下條件必須全部滿(mǎn)足怯晕。
Unity 2017.2.0f3或以上版本
Unity ARKit插件 – 可以在BitBucket或是Asset Store資源商店獲取
Unity ARCore插件請(qǐng)參考《Unity支持ARCore,為移動(dòng)AR再下一城》一文中的步驟安裝
ARInterface
開(kāi)始之前需要特別強(qiáng)調(diào)缸棵,我們?cè)赨nite Austin中使用的ARInterface仍處于試驗(yàn)階段舟茶。我們僅用了二周時(shí)間開(kāi)發(fā)這個(gè)工具,旨在為這次演講制作出一些跨平臺(tái)的演示項(xiàng)目堵第,所以并沒(méi)有考慮它與當(dāng)前Unity版本或現(xiàn)有的API是否完全兼容吧凉。
在Unity內(nèi)部,我們已經(jīng)在為多個(gè)AR平臺(tái)開(kāi)發(fā)原生的跨平臺(tái)集成工具踏志。在官方正式工具發(fā)布前客燕,這個(gè)C# API將是一個(gè)用于開(kāi)發(fā)ARCore和ARKit跨平臺(tái)應(yīng)用的有用工具。
在為ARKit或是ARCore開(kāi)發(fā)AR應(yīng)用時(shí)狰贯,通常要用到不同平臺(tái)的API和組件也搓。ARInterface則將多個(gè)平臺(tái)的一些共同點(diǎn)抽象化為一個(gè)單獨(dú)的層面,這意味著若是開(kāi)發(fā)者在代碼中調(diào)用的是ARInterface的API涵紊,那么ARInterface可以確保開(kāi)發(fā)者的代碼將會(huì)調(diào)用到正確的相關(guān)平臺(tái)的API傍妒。
目前的ARInterface可以在ARKit和ARCore上進(jìn)行跨平臺(tái)工作,但通過(guò)類(lèi)似的方法摸柄,我們也可以用它來(lái)支持其它擁有類(lèi)似功能的AR平臺(tái)颤练。
當(dāng)前可用的API
現(xiàn)在我們打開(kāi)項(xiàng)目中的ARInterface.cs,看看這個(gè)接口用到了哪些API驱负。下面是關(guān)于這個(gè)接口的介紹和使用方法嗦玖。
首先我們用這些API來(lái)控制AR會(huì)話(huà)的開(kāi)啟和關(guān)閉:
public abstract bool StartService(Settings settings);
public abstract void StopService();
Settings參數(shù)能讓你啟用會(huì)話(huà)中的創(chuàng)造點(diǎn)云(point cloud)、光照估算和平面檢測(cè)功能跃脊。
下一個(gè)是AR的基本功能:世界跟蹤宇挫。這個(gè)功能用于跟蹤現(xiàn)實(shí)世界中AR設(shè)備的具體位置和空間方位。
public bool TryGetPose(ref Pose pose);
這里的Pose參數(shù)用來(lái)確定所用設(shè)備攝像頭的位置和旋轉(zhuǎn)角度酪术,它通常用來(lái)讓Unity的攝像機(jī)跟著真實(shí)攝像頭移動(dòng)器瘪。
下面這些是針對(duì)平面檢測(cè)的事件代理:
public static Action<BoundedPlane> planeAdded;
public static Action<BoundedPlane> planeUpdated;
public static Action<BoundedPlane> planeRemoved;
這些調(diào)用能讓你跟蹤AR會(huì)話(huà)中被檢測(cè)到的平臺(tái)翠储,了解它們何時(shí)被添加、更新或移除橡疼。
要想把現(xiàn)實(shí)場(chǎng)景添加到AR中援所,你需要將設(shè)備攝像機(jī)的畫(huà)面渲染為編輯器場(chǎng)景中攝像機(jī)的背景:
public abstract void SetupCamera(Camera camera);
把你需要顯示視頻背景的Unity攝像機(jī)作為參數(shù)傳入,系統(tǒng)會(huì)自動(dòng)完成設(shè)置欣除。
對(duì)于背景渲染住拭,我們還需要進(jìn)行顯示變換,它能讓著色器根據(jù)設(shè)備的旋轉(zhuǎn)角度和屏幕尺寸來(lái)旋轉(zhuǎn)背景紋理:
public abstract Matrix4x4 GetDisplayTransform ();
這個(gè)調(diào)用用于獲取被檢測(cè)到的點(diǎn)云:
public abstract bool TryGetPointCloud(ref PointCloud pointCloud);
PointCloud參數(shù)包含一個(gè)Vector3列表历帚,這個(gè)列表會(huì)記錄我們?cè)谑澜缱鴺?biāo)系中各個(gè)點(diǎn)的位置滔岳。
AR平臺(tái)通常會(huì)返回場(chǎng)景中的預(yù)估光照:
public abstract LightEstimate GetLightEstimate();
LightEstimate(光照估算)參數(shù)里包含了ambientIntensity(環(huán)境強(qiáng)度)參數(shù)和ambientColorTemperature(環(huán)境色溫)參數(shù)。
有些情況下抹缕,你需要從現(xiàn)實(shí)環(huán)境中鏡頭捕捉到的畫(huà)面來(lái)得到畫(huà)面的像素值,這類(lèi)情況下墨辛,你需要使用:
public abstract bool TryGetCameraImage(ref CameraImage cameraImage);
CameraImage變量包含了捕捉到的實(shí)際像素卓研,這些數(shù)據(jù)是從CPU獲取的。
ARKitInterface和ARCoreInterface
這部分介紹用ARInterface來(lái)分別處理ARKit和ARCore平臺(tái)的具體實(shí)現(xiàn)睹簇。這些實(shí)現(xiàn)使用了底層插件來(lái)完成所需功能奏赘。閱讀這部分可以明白如何將這些方法應(yīng)用到其它平臺(tái)上。
AREditorInterface: ARInterface
我們也可以用ARInterface做一個(gè)新功能:在Unity編輯器里面使用ARInterface來(lái)模擬出一個(gè)AR環(huán)境太惠。在這個(gè)例子中磨淌,我們模擬的AR環(huán)境生成了兩個(gè)平面:一個(gè)在一秒后生成,另一個(gè)在兩秒后生成凿渊。
它還能生成由20個(gè)隨機(jī)點(diǎn)構(gòu)成的點(diǎn)云梁只。這個(gè)例子中的代碼在AREditorInterface.cs里,你可以根據(jù)需要模擬出自己想要的擁有不同細(xì)節(jié)的AR環(huán)境埃脏。
現(xiàn)在我們可以與這個(gè)環(huán)境展開(kāi)互動(dòng)搪锣,就像真的通過(guò)設(shè)備在里面移動(dòng)一樣,我們還可以據(jù)此進(jìn)行調(diào)試和迭代彩掐,因?yàn)檫@個(gè)環(huán)境就在編輯器中构舟。要想在環(huán)境中移動(dòng)攝像頭,使用WASD鍵即可堵幽。要想調(diào)整攝像頭方向狗超,按住右鍵移動(dòng)鼠標(biāo)。
由于我們是在編輯器中朴下,可以通過(guò)檢視窗口改變?nèi)我釭ameObject參數(shù)努咐,并馬上看到改變結(jié)果。我們還能修改代碼殴胧,因?yàn)樵谛薷耐甏a以后可以瞬間完成編譯麦撵,所以我們可以立即重新運(yùn)行修改后的場(chǎng)景。除此之外,我們還能在代碼中設(shè)置斷點(diǎn)免胃,檢查為何有些地方?jīng)]按預(yù)期實(shí)現(xiàn)音五。
在開(kāi)發(fā)新示例和從其它平臺(tái)移植示例時(shí),我們發(fā)現(xiàn)這個(gè)工具十分有用:使用它可以進(jìn)行快速迭代羔沙,甚至不需要AR設(shè)備躺涝!
ARRemoteInterface: ARInterface
和ARKit插件同時(shí)發(fā)布的一個(gè)最受歡迎的工具是ARKit Remote。(https://blogs.unity3d.com/2017/08/03/introducing-the-unity-arkit-remote/)
這個(gè)工具有二個(gè)部分:一個(gè)是安裝在AR設(shè)備上的遠(yuǎn)程應(yīng)用扼雏,另一個(gè)是放在場(chǎng)景內(nèi)的組件坚嗜。后者將從遠(yuǎn)程應(yīng)用收集ARKit數(shù)據(jù),然后在編輯器里生成模擬環(huán)境诗充。
這能讓開(kāi)發(fā)者在編輯器中迭代并調(diào)試苍蔬,功能類(lèi)似EditorInterface,但和EditorInterface不同的是蝴蜓,這個(gè)工具能從現(xiàn)實(shí)環(huán)境中獲取真實(shí)的數(shù)據(jù)碟绑。
ARKit Remote非常受到開(kāi)發(fā)者們的歡迎,這意味著當(dāng)ARCore預(yù)覽版發(fā)布時(shí)茎匠,開(kāi)發(fā)者們會(huì)強(qiáng)烈建議得到用于ARCore的類(lèi)似工具格仲。
有了跨平臺(tái)使用的ARInterface后,開(kāi)發(fā)用于ARCore的類(lèi)似工具會(huì)更簡(jiǎn)單诵冒,只要通過(guò)端口對(duì)現(xiàn)有的ARKit Remote加入相應(yīng)功能即可凯肋。
若要使用這個(gè)工作流程,首先你需要構(gòu)建RemoteDevice場(chǎng)景(在Assets/UnityARinterface/ARRemote目錄下可以找到)汽馋,然后將其安裝到支持ARKit或ARCore的設(shè)備上侮东。
構(gòu)建時(shí),要記得在Build Settings(構(gòu)建設(shè)置)中勾選“Development Build”(開(kāi)發(fā)構(gòu)建)選項(xiàng)豹芯,這樣會(huì)啟用PlayerConnection機(jī)制苗桂,用于遠(yuǎn)程應(yīng)用和編輯器的數(shù)據(jù)溝通。
接著需要把迭代的AR場(chǎng)景在編輯器中打開(kāi)告组,并在ARRoot GameObject上新建一個(gè)ARRemoteEditor組件煤伟。
如果在同一GameObject上有ARController組件,則禁用該組件∧痉欤現(xiàn)在運(yùn)行裝在設(shè)備上的遠(yuǎn)程應(yīng)用便锨,用控制臺(tái)的“Connected Player”菜單連接設(shè)備。在編輯器中按下”P(pán)lay”按鈕我碟,然后你便會(huì)得到如下的結(jié)果放案。
按下屏幕頂部的“Start Remote AR Session”按鈕,然后AR設(shè)備會(huì)將AR數(shù)據(jù)發(fā)送到編輯器中〗冒常現(xiàn)在就能使用從設(shè)備得到的真實(shí)AR數(shù)據(jù)吱殉,并在編輯器中迭代了掸冤。
移植示例
我們利用ARInterface將幾個(gè)ARKit示例移植到了ARCore平臺(tái)上。此外友雳,這樣做還讓我們能使用AREditorInterface和ARRemoteInterface稿湿。實(shí)際上,這些示例的移植簡(jiǎn)單而快捷押赊,因?yàn)槲覀兡苡肁REditorInterface在編輯器中對(duì)它們進(jìn)行快速迭代饺藤。
Focus Square示例
在Apple的AR Human Interaction Guidelines中,有個(gè)關(guān)鍵組件是指示符流礁,用來(lái)確定在環(huán)境中放置虛擬物品的位置涕俗。Focus Square便是這個(gè)指示符的一個(gè)實(shí)現(xiàn)。
移植這個(gè)示例到ARInterface的過(guò)程比較直接神帅,因?yàn)樗粫?huì)涉及太多平臺(tái)特定代碼再姑,除了HitTest。
所以我們決定對(duì)生成平面游戲?qū)ο笫褂霉饩€(xiàn)投射取代HitTest找御。這將給那個(gè)平面實(shí)現(xiàn)HitTest的效果元镀,而且還能在編輯器上使用。
AR會(huì)話(huà)和攝像頭的其它部分由ARController來(lái)設(shè)置萎坷,ARController和其它對(duì)AR場(chǎng)景進(jìn)行設(shè)置的代碼放在一起 凹联。
AR Ballz示例
Unity AR Ballz是個(gè)有趣的演示沐兰,用于展示在AR中平坦表面的物理交互效果哆档。這個(gè)示例包含兩個(gè)模式。
第一個(gè)模式下住闯,當(dāng)你在屏幕上點(diǎn)擊平面時(shí)瓜浸,被點(diǎn)擊到的平臺(tái)上會(huì)創(chuàng)建球?qū)ο蟆?/p>
第二個(gè)模式下,當(dāng)你在屏幕上點(diǎn)擊平面時(shí)比原,球會(huì)移開(kāi)插佛。
在移植這個(gè)示例時(shí),由于我們只想要對(duì)平面使用HitTest功能量窘,我們用之前提到那個(gè)適合編輯器的插件替換了用于定位并移動(dòng)球?qū)ο蟮腍itTest雇寇。
我們所做的另一個(gè)改變,是使用手指位置的力向量制造交互效果蚌铜,而不是使用碰撞的動(dòng)態(tài)效果锨侯,這樣球的移動(dòng)效果更好。這個(gè)示例讓我們知道冬殃,EditorInterface可以方便地對(duì)檢視窗口中的參數(shù)進(jìn)行迭代囚痴。
你可以在編輯器中嘗試這些示例,在Remotes或?qū)嶋H的ARKit和ARCore設(shè)備中也可以审葬。我們期待能使用ARInterface移植更多的示例深滚。
縮放AR中的物品
我們談了縮放物品還討論了怎樣在不調(diào)整物品本身大小的情況下奕谭,使用一些攝像機(jī)技巧來(lái)實(shí)現(xiàn)類(lèi)似效果。我們展示了兩個(gè)調(diào)整大小的方法痴荐,其中一個(gè)方法使用了一個(gè)攝像機(jī)血柳,另一個(gè)方法則使用了兩個(gè)攝像頭。
你可以在Assets/UnityARInterface/Examples/ScaledContent目錄下了解單個(gè)攝像頭解決方案的實(shí)現(xiàn)蹬昌。
實(shí)現(xiàn)多人游戲
實(shí)習(xí)多人游戲需求來(lái)自游戲開(kāi)發(fā)者混驰,他們想要實(shí)現(xiàn)不同設(shè)備在同一個(gè)空間中玩同一款游戲。為了解決這個(gè)問(wèn)題皂贩,我們要制作一個(gè)多人游戲來(lái)實(shí)現(xiàn)它ARInterface栖榨,為這個(gè)示例的開(kāi)發(fā)提供了很大的幫助。
我們使用了Asset Store資源商店中的《TANKS! Networking Demo》項(xiàng)目明刷。因?yàn)檫@個(gè)項(xiàng)目實(shí)現(xiàn)了多個(gè)移動(dòng)端設(shè)備間運(yùn)行的多人游戲婴栽。但這項(xiàng)目唯一缺少的功能就是AR功能,用于在不同設(shè)備上一同體驗(yàn)AR效果辈末。
這個(gè)項(xiàng)目通過(guò)以下流程運(yùn)行:
Lobby Scene(大廳場(chǎng)景)用于匹配不同設(shè)備的用戶(hù)愚争,然后將匹配到的玩家連接至Main Scene(主場(chǎng)景)下一同游玩。
為了進(jìn)行修改挤聘,我們先去除了主場(chǎng)景中的CameraRig對(duì)象轰枝,因?yàn)槲覀兇蛩銊?chuàng)建一個(gè)由AR設(shè)備控制的攝像頭,而不是由坦克移動(dòng)來(lái)控制组去。然后我們?cè)谠辛鞒讨凹尤胄碌膱?chǎng)景鞍陨。
我們?cè)贏R Setup Scene(AR設(shè)置場(chǎng)景)中設(shè)置了AR會(huì)話(huà)和AR攝像頭。然后我們將控制權(quán)交至Lobby Scene从隆,確保在我們載入后續(xù)場(chǎng)景時(shí)诚撵,AR會(huì)話(huà)和攝像頭仍會(huì)保留在場(chǎng)景中。
AR Setup Scene通過(guò)平面檢測(cè)功能來(lái)確定游戲位置键闺。兩個(gè)設(shè)備都會(huì)對(duì)著相同的桌面位置寿烟,然后用其中心點(diǎn)來(lái)確定游戲的水平面。由于我們的兩個(gè)設(shè)備都會(huì)用到現(xiàn)實(shí)中的桌面中心和方位來(lái)同步各自的坐標(biāo)系統(tǒng)辛燥,共享水平面會(huì)根據(jù)兩個(gè)設(shè)備的畫(huà)面在同一位置生成筛武。
然后我們使用了在ScaledContent(縮放AR中的物品)部分介紹的機(jī)制,根據(jù)平面大小和Tanks!中使用的平面大小挎塌,確定我們所用水平面上物體的大小徘六。然后我們將這個(gè)大小設(shè)定應(yīng)用到Tanks!的水平面上,顯示給兩位玩家勃蜘。我們還做了些改動(dòng)硕噩,讓我們能通過(guò)屏幕點(diǎn)擊和拖動(dòng)直接控制游戲?qū)ο蟆?/p>
資源下載
ARKit下載
Bitbucket:https://bitbucket.org/Unity-Technologies/unity-arkit-plugin
Asset Store:https://www.assetstore.unity3d.com/en/#!/content/92515
ARInterface示例代碼
https://github.com/Unity-Technologies/experimental-ARInterface
TANKS! Networking 示例
https://www.assetstore.unity3d.com/en/#!/content/46213
相關(guān)文章:
蘋(píng)果官方給ARKit開(kāi)發(fā)者的22條建議,你家AR應(yīng)用做到?jīng)]缭贡?