Unity官方示例:在ARCore和ARKit中實現多人遊戲

2021-01-08 雷鋒網

雷鋒網(公眾號:雷鋒網)按:自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應用做到沒?

雷鋒網版權文章,未經授權禁止轉載。詳情見轉載須知。

相關焦點

  • 使用Unity 粒子系統實現 2D 人物足跡效果
    前言 項目中使用的基本角色控制腳本是由 Unity Learn 中的官方教程 John Lemon's Haunted Jaunt(很不錯的教程
  • 【官方說明】Unity 5 引擎專業版和個人版解析
    最新Unity 5的Professional Edition(專業版)具備全新而強大的功能,除了全局動態光照或是最新的基於物理的著色器之外,也把原本分開銷售的Team License放入,並含有12個月的Unity Cloud Build 和Unity Analytics 授權,價格只要1500美金一套或是月租75美金。
  • unity遊戲製作初始人物控制代碼
    大家好,今天小編帶大家學習一哈unity遊戲製作中初始人物控制代碼。1.我們知道遊戲中,選中人物,在人物未開始運動前,往往會有一個初始的動作,好的,我們這節課通過unity中相關代碼和基礎設置來實現這一效果。
  • 2021新年匯總:Unity項目原型快速開發資源,看這一篇就夠
    /windridge-city-132222 資源商店中免費模型搜索: https://assetstore.unity.com/packages/3d/props/exterior/rock-and-boulders-2-6947?
  • Unity項目開發過程中常見的問題,你遇到過嗎?
    最近看到有朋友問一個unity遊戲開發團隊,需要掌握哪些知識之類的問題。
  • Unity 實用技巧 - 物理系統初識
    兩個引擎的主要概念是相同的,但是它們是使用不同的組件實現的。例如,Rigidbody和Rigidbody2D。物理系統主要由以下幾部分組成:Rigidbody(剛體)、Collider(碰撞器)、Triggers(觸發器) 、Joint(關節)、Character Controller(角色控制器)。
  • Unity 2020.2 優化了 Time.deltaTime,以實現更流暢的遊戲體驗
    而要實現獨立於幀的運動,則要用到時間增量(Delta Time):  void Update(){transform.position += m_Velocity * Time.deltaTime;}  右滑查看完整代碼  上方代碼可以實現對象以不變的矢量向前運動的效果,且運動會無視遊戲的幀率。
  • 如何製造一個簡單的2D遊戲?
    那麼,選擇好了遊戲引擎接下來應該怎麼做呢?當然是從官網上下載Unity(廢話)!下載和安裝Unity是完全免費的,建議在下載時選擇「從Hub下載」(p4中的綠色選項)。Unity Hub非常便於管理項目和許可證(有的時候打不開項目是因為許可證過期,手動激活即可),也可以在Hub中選擇安裝多個不同版本的Unity自由切換。
  • 王者榮耀是怎樣煉成的(三)unity組件與腳本
    這回我們來侃侃unity中的組件與腳本。一.組件與腳本簡介1.組件組件(Component),顧名思義,就是遊戲物體的組成部件。這和我們對現實生活的認識是一致的。就比如說一臺主機,是有CPU,顯卡,主板,內存條等等組成的。這些部件就是主機的「組件」。這些組件一旦有不滿意的,隨時可以增刪改查。
  • 使用unity製作RPG遊戲3——2D精靈
    context=%7B%22nid%22%3A%22news_9564882242542237691%22%2C%22sourceFrom%22%3A%22bjh%22%2C%22url_data%22%3A%22bjhauthor%22%7D下面需要利用Tiled2Unity把01地圖導入unity下載Tiled2Unity,在根目錄下打開可執行文件進入unity。
  • 遊戲粒子碰撞魔法特效Unity遊戲素材資源
    人人素材社區-最專業的CG藝術交流網站小夥伴們玩遊戲時遇到打鬥的畫面會不會感覺很爽,法術碰撞會產生格外好看的效果,這些特效是怎麼做出來的呢,今天為就大家介紹一款遊戲粒子碰撞的魔法特效素材,一起來了解一下。
  • mac版Unity Pro遊戲開發工具如何創建和使用腳本
    Unity Pro 2018 for mac是遊戲開發必備的軟體之一,unity mac版主要用於創建2D和3D跨平臺遊戲,比如三維視頻遊戲、實時三維動畫、建築可視化等類型,儘管Unity的內置組件可以實現多種用途,但是您很快就會發現,您需要超越它們提供的功能來實現自己的遊戲功能。
  • Unity 最新版本迎來260項功能改進,高清渲染管線HDRP升級
    最新上線的Unity 2019.3版本帶來了超過260項功能改進,其中的高清渲染管線(HDRP)功能可在高端遊戲主機和PC上解鎖高清精美畫質的無限潛能。高清渲染管線在2019.3中經過驗證幾近純熟,帶來了全新的功能和藝術創作工具,可用於製作高保真圖像。
  • Unity基礎之物理引擎
    我們在unity裡面建了一個正方體cube , 要如何使這個cube可以跟現實中的物體一樣受重力呢 ? 這就需要用到Rigidbody(剛體)組件了 .官方建議物體質量最好不要大於其他物體的100倍或者小於其他物體的 1/100 ;2. Drag : 空氣阻力 . 數值越大,表示物體所受阻力越大,物體越難移動 ;3. Angular Drag : 角阻力,也就是物體旋轉受到的阻力 ,數值越大物體越難旋轉 ;4.
  • 遊戲中的Volumetric Rendering
    最常用的三種計算霧強度的公式:Linear : factor = (end-z)/(end-start)Exp: factor = exp(-density*z)Exp2: factor = exp(-(density*z)^2)unity中的全局霧設置和宏APPLY_FOG就是使用這種方式
  • 28組炫酷多彩遊戲粒子碰撞爆炸特效Unity遊戲素材資源
    人人素材社區-最專業的CG藝術交流網站在遊戲中我們是不是總會看見爆炸的場面感覺既炫酷又刺激呢  這種效果又是怎麼形成的呢今天為大家帶來就粒子碰撞爆炸特效快讓我們看看這種特效究竟是怎麼回事吧本遊戲資料是個關於28組炫酷多彩遊戲粒子碰撞爆炸特效Unity遊戲素材資源,大小:1MB ,
  • Unity 2018.3 Beta版發布
    直播課程:Facial AR Remote面部捕捉解決方案課程(第一期)直播地址:https://connect.unity.com/events/unitychina-facialarUnity官方教師培訓報名火熱進行中Unity將在10月22-26日,舉辦為期5天的專業的Unity官方教師培訓課程,誠邀廣大教師與
  • unity實戰之大主宰
    通過修改object.transform.position可以實現最直接的修改,此外還提供了函數,放在Update中:Vector3.MoveTowards(Vector3 now,Vector3 target,float speed)Vector3.Slerp(Vector3 start,Vector3
  • 2020 Google 多項 ARCore 更新帶來AR開發全新可能!
    ARCore在中國 - 越來越多開發者正在創新運用從 2018 年 ARCore 技術登陸中國,已經在教育、購物、遊戲等多個行業和大量開發者進行合作。隨著 ARCore 的不斷更新,越來越多的中國開發者正在創新應用這項技術,為本地用戶帶來更多新奇體驗。
  • 在unity中用C#連接資料庫步驟
    歐陽小白之前做的一直是單機遊戲,所以根本用不到資料庫和伺服器。不過最近我開始折騰聯網遊戲。所以本文就介紹一下unity連MySQL資料庫所遇到的一些坑。unity連接資料庫,首先你需要導入如圖所示的五個數據連結庫。