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