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