0
雷鋒網(wǎng)按:自ARKit和ARCore推出以來,不少游戲開發(fā)者已經(jīng)用ARKit開發(fā)出了很多好玩的游戲。但是不少開發(fā)者都向雷鋒網(wǎng)表示由于ARKit目前還難以支持多人游戲,大大降低了AR游戲的社交性和可玩性,也限制了游戲場景。在Unity Austin 2017中,Unity向大家介紹了如何在Unity中使用ARKit和ARCore,以及如何解決多人游戲的問題。此文原發(fā)于“Unity官方平臺(tái)”公眾號(hào),雷鋒網(wǎng)獲授權(quán)轉(zhuǎn)載。
在Unite Austin 2017中,Unity的開發(fā)人員 Jimmy Alamparambil和Tim Mowrer做了一場演講《在Unity中使用ARKit和ARCore》。演講的目地是為了把AR介紹給大家,并給大家展示ARKit和ARCore的各種功能。更重要Unity想讓開發(fā)者有足夠的興趣為這兩個(gè)平臺(tái)開發(fā)內(nèi)容。
下面是一個(gè)小時(shí)的Unite Austin 2017視頻(流量黨慎入?。?/p>
請注意:演講中用到的例子和代碼都是試驗(yàn)性的。所用到包也不會(huì)得到Unity的官方支持,在ARCore或是ARKit上之后的任何改動(dòng)都可能讓這個(gè)包失效。
開發(fā)者們的第一個(gè)需求,他們想要編寫出能夠跨平臺(tái)使用的代碼,這樣能便于同時(shí)在ARKit和ARCore上,或是其它未來可能出現(xiàn)的平臺(tái)上使用。這個(gè)需求與Unity的核心價(jià)值十分相符,我們就是要實(shí)現(xiàn)統(tǒng)一化開發(fā),讓開發(fā)者能夠一次編碼、多平臺(tái)部署。為了實(shí)現(xiàn)這個(gè)目的,我們開發(fā)了一個(gè)試驗(yàn)性的API,并希望這個(gè)API能演變?yōu)榧傻目缙脚_(tái)API。
第二個(gè)需求是如何解決AR中顯示縮放內(nèi)容的問題。
第三個(gè)需求是如何使用Unity中現(xiàn)成的功能來實(shí)現(xiàn)多人游戲功能。
這次演講中,我們回應(yīng)了以上的三個(gè)需求。而在這篇文章中,我們希望為你帶來演講中的更多細(xì)節(jié),幫助你使用演講中的示例代碼。
你可以訪問GitHub下載演講中的示例代碼,下載地址請?jiān)L問文末。
要想使用ARKit或ARCore,以下條件必須全部滿足。
Unity 2017.2.0f3或以上版本
Unity ARKit插件 – 可以在BitBucket或是Asset Store資源商店獲取
Unity ARCore插件請參考《Unity支持ARCore,為移動(dòng)AR再下一城》一文中的步驟安裝
ARInterface
開始之前需要特別強(qiáng)調(diào),我們在Unite Austin中使用的ARInterface仍處于試驗(yàn)階段。我們僅用了二周時(shí)間開發(fā)這個(gè)工具,旨在為這次演講制作出一些跨平臺(tái)的演示項(xiàng)目,所以并沒有考慮它與當(dāng)前Unity版本或現(xiàn)有的API是否完全兼容。
在Unity內(nèi)部,我們已經(jīng)在為多個(gè)AR平臺(tái)開發(fā)原生的跨平臺(tái)集成工具。在官方正式工具發(fā)布前,這個(gè)C# API將是一個(gè)用于開發(fā)ARCore和ARKit跨平臺(tái)應(yīng)用的有用工具。
在為ARKit或是ARCore開發(fā)AR應(yīng)用時(shí),通常要用到不同平臺(tái)的API和組件。ARInterface則將多個(gè)平臺(tái)的一些共同點(diǎn)抽象化為一個(gè)單獨(dú)的層面,這意味著若是開發(fā)者在代碼中調(diào)用的是ARInterface的API,那么ARInterface可以確保開發(fā)者的代碼將會(huì)調(diào)用到正確的相關(guān)平臺(tái)的API。
目前的ARInterface可以在ARKit和ARCore上進(jìn)行跨平臺(tái)工作,但通過類似的方法,我們也可以用它來支持其它擁有類似功能的AR平臺(tái)。
現(xiàn)在我們打開項(xiàng)目中的ARInterface.cs,看看這個(gè)接口用到了哪些API。下面是關(guān)于這個(gè)接口的介紹和使用方法。
首先我們用這些API來控制AR會(huì)話的開啟和關(guān)閉:
public abstract bool StartService(Settings settings);
public abstract void StopService();
Settings參數(shù)能讓你啟用會(huì)話中的創(chuàng)造點(diǎn)云(point cloud)、光照估算和平面檢測功能。
下一個(gè)是AR的基本功能:世界跟蹤。這個(gè)功能用于跟蹤現(xiàn)實(shí)世界中AR設(shè)備的具體位置和空間方位。
public bool TryGetPose(ref Pose pose);
這里的Pose參數(shù)用來確定所用設(shè)備攝像頭的位置和旋轉(zhuǎn)角度,它通常用來讓Unity的攝像機(jī)跟著真實(shí)攝像頭移動(dòng)。
下面這些是針對平面檢測的事件代理:
public static Action<BoundedPlane> planeAdded;
public static Action<BoundedPlane> planeUpdated;
public static Action<BoundedPlane> planeRemoved;
這些調(diào)用能讓你跟蹤AR會(huì)話中被檢測到的平臺(tái),了解它們何時(shí)被添加、更新或移除。
要想把現(xiàn)實(shí)場景添加到AR中,你需要將設(shè)備攝像機(jī)的畫面渲染為編輯器場景中攝像機(jī)的背景:
public abstract void SetupCamera(Camera camera);
把你需要顯示視頻背景的Unity攝像機(jī)作為參數(shù)傳入,系統(tǒng)會(huì)自動(dòng)完成設(shè)置。
對于背景渲染,我們還需要進(jìn)行顯示變換,它能讓著色器根據(jù)設(shè)備的旋轉(zhuǎn)角度和屏幕尺寸來旋轉(zhuǎn)背景紋理:
public abstract Matrix4x4 GetDisplayTransform ();
這個(gè)調(diào)用用于獲取被檢測到的點(diǎn)云:
public abstract bool TryGetPointCloud(ref PointCloud pointCloud);
PointCloud參數(shù)包含一個(gè)Vector3列表,這個(gè)列表會(huì)記錄我們在世界坐標(biāo)系中各個(gè)點(diǎn)的位置。
AR平臺(tái)通常會(huì)返回場景中的預(yù)估光照:
public abstract LightEstimate GetLightEstimate();
LightEstimate(光照估算)參數(shù)里包含了ambientIntensity(環(huán)境強(qiáng)度)參數(shù)和ambientColorTemperature(環(huán)境色溫)參數(shù)。
有些情況下,你需要從現(xiàn)實(shí)環(huán)境中鏡頭捕捉到的畫面來得到畫面的像素值,這類情況下,你需要使用:
public abstract bool TryGetCameraImage(ref CameraImage cameraImage);
CameraImage變量包含了捕捉到的實(shí)際像素,這些數(shù)據(jù)是從CPU獲取的。
這部分介紹用ARInterface來分別處理ARKit和ARCore平臺(tái)的具體實(shí)現(xiàn)。這些實(shí)現(xiàn)使用了底層插件來完成所需功能。閱讀這部分可以明白如何將這些方法應(yīng)用到其它平臺(tái)上。
AREditorInterface: ARInterface
我們也可以用ARInterface做一個(gè)新功能:在Unity編輯器里面使用ARInterface來模擬出一個(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)境展開互動(dòng),就像真的通過設(shè)備在里面移動(dòng)一樣,我們還可以據(jù)此進(jìn)行調(diào)試和迭代,因?yàn)檫@個(gè)環(huán)境就在編輯器中。要想在環(huán)境中移動(dòng)攝像頭,使用WASD鍵即可。要想調(diào)整攝像頭方向,按住右鍵移動(dòng)鼠標(biāo)。
由于我們是在編輯器中,可以通過檢視窗口改變?nèi)我釭ameObject參數(shù),并馬上看到改變結(jié)果。我們還能修改代碼,因?yàn)樵谛薷耐甏a以后可以瞬間完成編譯,所以我們可以立即重新運(yùn)行修改后的場景。除此之外,我們還能在代碼中設(shè)置斷點(diǎn),檢查為何有些地方?jīng)]按預(yù)期實(shí)現(xiàn)。
在開發(fā)新示例和從其它平臺(tái)移植示例時(shí),我們發(fā)現(xiàn)這個(gè)工具十分有用:使用它可以進(jìn)行快速迭代,甚至不需要AR設(shè)備!
和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è)是放在場景內(nèi)的組件。后者將從遠(yuǎn)程應(yīng)用收集ARKit數(shù)據(jù),然后在編輯器里生成模擬環(huán)境。
這能讓開發(fā)者在編輯器中迭代并調(diào)試,功能類似EditorInterface,但和EditorInterface不同的是,這個(gè)工具能從現(xiàn)實(shí)環(huán)境中獲取真實(shí)的數(shù)據(jù)。
ARKit Remote非常受到開發(fā)者們的歡迎,這意味著當(dāng)ARCore預(yù)覽版發(fā)布時(shí),開發(fā)者們會(huì)強(qiáng)烈建議得到用于ARCore的類似工具。
有了跨平臺(tái)使用的ARInterface后,開發(fā)用于ARCore的類似工具會(huì)更簡單,只要通過端口對現(xiàn)有的ARKit Remote加入相應(yīng)功能即可。
若要使用這個(gè)工作流程,首先你需要構(gòu)建RemoteDevice場景(在Assets/UnityARinterface/ARRemote目錄下可以找到),然后將其安裝到支持ARKit或ARCore的設(shè)備上。
構(gòu)建時(shí),要記得在Build Settings(構(gòu)建設(shè)置)中勾選“Development Build”(開發(fā)構(gòu)建)選項(xiàng),這樣會(huì)啟用PlayerConnection機(jī)制,用于遠(yuǎn)程應(yīng)用和編輯器的數(shù)據(jù)溝通。
接著需要把迭代的AR場景在編輯器中打開,并在ARRoot GameObject上新建一個(gè)ARRemoteEditor組件。
如果在同一GameObject上有ARController組件,則禁用該組件?,F(xiàn)在運(yùn)行裝在設(shè)備上的遠(yuǎn)程應(yīng)用,用控制臺(tái)的“Connected Player”菜單連接設(shè)備。在編輯器中按下”Play”按鈕,然后你便會(huì)得到如下的結(jié)果。
按下屏幕頂部的“Start Remote AR Session”按鈕,然后AR設(shè)備會(huì)將AR數(shù)據(jù)發(fā)送到編輯器中?,F(xiàn)在就能使用從設(shè)備得到的真實(shí)AR數(shù)據(jù),并在編輯器中迭代了。
我們利用ARInterface將幾個(gè)ARKit示例移植到了ARCore平臺(tái)上。此外,這樣做還讓我們能使用AREditorInterface和ARRemoteInterface。實(shí)際上,這些示例的移植簡單而快捷,因?yàn)槲覀兡苡肁REditorInterface在編輯器中對它們進(jìn)行快速迭代。
Focus Square示例
在Apple的AR Human Interaction Guidelines中,有個(gè)關(guān)鍵組件是指示符,用來確定在環(huán)境中放置虛擬物品的位置。Focus Square便是這個(gè)指示符的一個(gè)實(shí)現(xiàn)。
移植這個(gè)示例到ARInterface的過程比較直接,因?yàn)樗粫?huì)涉及太多平臺(tái)特定代碼,除了HitTest。
所以我們決定對生成平面游戲?qū)ο笫褂霉饩€投射取代HitTest。這將給那個(gè)平面實(shí)現(xiàn)HitTest的效果,而且還能在編輯器上使用。
AR會(huì)話和攝像頭的其它部分由ARController來設(shè)置,ARController和其它對AR場景進(jìn)行設(shè)置的代碼放在一起 。
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ì)移開。
在移植這個(gè)示例時(shí),由于我們只想要對平面使用HitTest功能,我們用之前提到那個(gè)適合編輯器的插件替換了用于定位并移動(dòng)球?qū)ο蟮腍itTest。
我們所做的另一個(gè)改變,是使用手指位置的力向量制造交互效果,而不是使用碰撞的動(dòng)態(tài)效果,這樣球的移動(dòng)效果更好。這個(gè)示例讓我們知道,EditorInterface可以方便地對檢視窗口中的參數(shù)進(jìn)行迭代。
你可以在編輯器中嘗試這些示例,在Remotes或?qū)嶋H的ARKit和ARCore設(shè)備中也可以。我們期待能使用ARInterface移植更多的示例。
我們談了縮放物品還討論了怎樣在不調(diào)整物品本身大小的情況下,使用一些攝像機(jī)技巧來實(shí)現(xiàn)類似效果。我們展示了兩個(gè)調(diào)整大小的方法,其中一個(gè)方法使用了一個(gè)攝像機(jī),另一個(gè)方法則使用了兩個(gè)攝像頭。
你可以在Assets/UnityARInterface/Examples/ScaledContent目錄下了解單個(gè)攝像頭解決方案的實(shí)現(xiàn)。
實(shí)習(xí)多人游戲需求來自游戲開發(fā)者,他們想要實(shí)現(xiàn)不同設(shè)備在同一個(gè)空間中玩同一款游戲。為了解決這個(gè)問題,我們要制作一個(gè)多人游戲來實(shí)現(xiàn)它ARInterface,為這個(gè)示例的開發(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)目通過以下流程運(yùn)行:
Lobby Scene(大廳場景)用于匹配不同設(shè)備的用戶,然后將匹配到的玩家連接至Main Scene(主場景)下一同游玩。
為了進(jìn)行修改,我們先去除了主場景中的CameraRig對象,因?yàn)槲覀兇蛩銊?chuàng)建一個(gè)由AR設(shè)備控制的攝像頭,而不是由坦克移動(dòng)來控制。然后我們在原有流程之前加入新的場景。
我們在AR Setup Scene(AR設(shè)置場景)中設(shè)置了AR會(huì)話和AR攝像頭。然后我們將控制權(quán)交至Lobby Scene,確保在我們載入后續(xù)場景時(shí),AR會(huì)話和攝像頭仍會(huì)保留在場景中。
AR Setup Scene通過平面檢測功能來確定游戲位置。兩個(gè)設(shè)備都會(huì)對著相同的桌面位置,然后用其中心點(diǎn)來確定游戲的水平面。由于我們的兩個(gè)設(shè)備都會(huì)用到現(xiàn)實(shí)中的桌面中心和方位來同步各自的坐標(biāo)系統(tǒng),共享水平面會(huì)根據(jù)兩個(gè)設(shè)備的畫面在同一位置生成。
然后我們使用了在ScaledContent(縮放AR中的物品)部分介紹的機(jī)制,根據(jù)平面大小和Tanks!中使用的平面大小,確定我們所用水平面上物體的大小。然后我們將這個(gè)大小設(shè)定應(yīng)用到Tanks!的水平面上,顯示給兩位玩家。我們還做了些改動(dòng),讓我們能通過屏幕點(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)文章:
蘋果官方給ARKit開發(fā)者的22條建議,你家AR應(yīng)用做到?jīng)]?
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。