地形高度

地形高度可讓您在使用 Maps SDK for Unity 建立的遊戲中加入可完全樣式的三維地形。您可以使用 Google 地球的高度資料,為遊戲內地形增添一層真實感。您可以顯示在真實世界中特定位置找到的丘陵、山谷和其他土地地圖項目,讓玩家更容易辨識周遭的環境,並掌握自己的周遭環境。

例如,下圖顯示大峽谷的地形高度算繪。圖片使用相對簡單的樣式,在斜坡上混合運用岩石和草地紋理,但樣式可能會比較複雜。

大峽谷的地形高度圖片

由於地形高度已與 Unity Terrain Engine 整合,因此系統會以 Unity 地形圖塊的形式產生地形。系統會根據地形自動調整現有地圖項目。您可以使用地形圖層完全控制地形的樣式,也可以定義自訂方法,根據地形屬性來混合圖層。這與 Unity 的地形繪圖工具類似,但可在執行階段套用。您不必知道地形網格的具體細節,

建立每個地形圖塊後,Maps SDK for Unity 事件系統就會通知遊戲。如有需要,您可以將其他邏輯整合到地形產生管道中。

Maps SDK for Unity 包含範例場景,示範如何使用地形圖層來設定地形高度的樣式。您可以在 Unity 的「Project」窗格中找到這個場景,依序點選「Assets」>「GoogleMaps」>「Examples」資料夾。場景中包含名為「Terrain Example Script」的 GameObject,其中包含 C# 指令碼元件 TerrainExample.cs

如要進一步瞭解範例場景,請參閱「Maps SDK for Unity 範例場景」。

啟用地形高度

在呼叫 Awake() 前,使用 Maps SDK for Unity Maps Service 元件啟用地形高度。

如何使用地圖服務元件啟用地形高度:

  1. 在 Unity 檢查器中,開啟 Maps Service 指令碼元件。

  2. 勾選「地圖項目選項」 >「地形」下方的「啟用地形」核取方塊。

設定地形參數

初始化地形高度時,您必須在 MapsService 元件中設定下列參數。

TerrainMeshMetersPerPoint

產生的 Unity 地形圖塊的目標解析度 (以公尺/每個點為單位)。預設值為 1。

每個地形圖塊的實際解析度可能與指定的 TerrainMeshMetersPerPoint 值不同。Unity 地形圖塊的高度對應解析度必須為 2 加上 1 的次方。Maps SDK for Unity 會將提供的值無條件進位至最接近的 2 次方,再加上 1 才符合這項規定。

與混合縮放元件搭配使用時,每次縮放等級降低時,TerrainMeshMetersPerPoint 值都會自動加倍。

AltitudePrecision

地形高度的垂直精確度,以公尺為單位,介於 0.01 (公分層級精確度) 和 10000 (10 公里等級精確度) 之間。預設值為 0.01。

繪製地形表面

Unity 的地形引擎會根據一組 Alpha 版地圖,將多個地形圖層合併在一起,藉此算繪地形介面。每個地形層都有一些關聯的紋理 (例如擴散、法線)。地形圖層可由多個地形圖塊共用。

每個地形圖塊都有一個 Alpha 版,用於控制圖塊表面上任何特定點的混合權重。任何特定點的所有層權重總和應等於 1。地形圖層紋理會在多個地形表面上並排顯示,而 Alpha 版地圖會縮放一次,讓每個圖塊的整個表面都涵蓋一次。

基於效能考量,Alpha 版地圖必須以程式輔助方式產生。執行著色器程式,該程式從功能遮罩圖片中取樣 (包含不同顏色的地圖項目)。功能遮罩會根據每種材質的一般樣式設定中提供的材料,以及包含在 AlphaMapsNeedPaint 事件的引數中所提供的材料。請使用適當的「無光」材質,並以統一顏色為每個地圖項目上色。如果是區域或區隔等基本地圖功能,請確保素材使用適當的基本地圖相容著色器

根據預設,系統不會將任何地圖項目轉譯為功能遮罩。如要讓地圖項目顯示在地圖項目遮罩中,請將樣式設定中的 GameObjectLayer 欄位設為您在 TerrainStyle 物件中為地形算繪的指定圖層。如果您使用地平面物件來填補地圖項目之間的地面落差,您也必須將這個平面放在地形算繪圖層上並指派適當的材質,避免地圖項目遮罩出現落差。

繪製地圖項目遮罩時,系統會使用投影投影在場景的相關區域繪製地形繪製圖層。如果您尚未以適當色彩標示整個遊戲物件,功能遮罩中會顯示基礎天空箱。Maps SDK for Unity 會確保在嘗試繪製地圖項目遮罩前,已建立所有相關的地圖項目遊戲物件,但您也可以自行放置地平面。Maps SDK for Unity 提供的範例中,已為您放置合適的地面物件。

Alpha 版地圖繪製本身會在您在處理常式內為 AlphaMapsNeedPaint 事件指定的協同程式進行。此協同程式的內容會因所需介面外觀和方式而異,但在傳回協同程式前,有時必須先設定地形圖塊的 Alpha 版地圖。這些大小分成 4 組,並分為 ARGB 控制項紋理,每個管道代表特定圖層的 Alpha 版地圖。寫入這些控制項紋理的技術會因使用的 Unity 版本而異。舉例來說,在 Unity 2019.2 以上版本中,請使用 TerrainData.CopyActiveRenderTextureToTexture。透過 Maps SDK for Unity 發布的地形範例說明瞭支援 Unity 版本的建議技巧。

請注意,繪製協同程式可在沒有傳回的情況下取消,因此您必須使用 AlphaMapsNeedPaintArgs 提供的委派來註冊最終化器,清除您已建立供協同程式內使用的任何臨時資源 (例如臨時轉譯紋理)。

詳情請參閱封裝範例。

取代結構

啟用地形高度時,建築物和地標等建築物會與地形垂直對齊。

如為延伸結構,每個結構都會放在與平面圖交會的最低高度,確保地形和結構底部之間沒有間距。每次展開作業都會延長,以避免任何屋頂被夾在地面上,同時仍保持建築物的其餘部分。

建立模型的結構只會按照上述放置程序操作,不會修改結構模型。由於模型式結構是任意形狀,因此足跡是由結構中最低點的頂點定義。

與 Unity 互動

使用父項和轉換

根據預設,Maps SDK for Unity 產生的 GameObjects 都屬於包含 MapsService 元件 (地圖錨點) 的 GameObject 轉換作業。所有非地形的 GameObjects 均會正確遵循地圖錨點的轉換。

Unity 不支援地形物件的旋轉和縮放設定。因此,Maps SDK for Unity 產生的 Terrain GameObjects 無法旋轉或縮放,在套用這類轉換時也不會沿用父項 GameObject。只要 Terrain GameObject 未標示為靜態,系統就會支援翻譯。

因此,Maps SDK for Unity 不支援任何涉及地形的物件轉換,且嘗試這麼做可能會導致異常或非預期的行為。

裝置端算繪

Unity 的地形系統使用特定資產進行裝置端轉譯。在編輯時為場景新增地形時,這些元素會自動納入。只有在執行階段和 Maps SDK for Unity 中使用時,才需要明確加入這些素材資源。如果沒有這些地形資料,則可能無法正常顯示或完全無法顯示。

Unity 的建議做法是執行下列步驟,納入這些資產:

  1. 在場景中新增 Terrain GameObject。

  2. 透過檢查器中的元件設定,為 GameObject 的地形元件啟用 Draw Instanced

這會自動新增所有必要資產的依附元件,而且對於 Unity 版本之間的變更是穩固可靠的。接著,您可以在檢查器中取消勾選該 Terrain GameObject 名稱旁的方塊,即可隱藏這個 Terrain GameObject。這種做法在隨附地形範例場景中已示範:

如「地形」範例場景所示的地形素材資源。