Unity 動態編輯Terrain地形(一)介紹

2021-09-04 16:13:20 字數 1158 閱讀 6247

unity自帶了乙個非常強大的地形編輯器,但是總結起來也有一些缺點

1.不能在執行時編輯

2.不能跨多塊地圖編輯(unity2018可以實現跨地形編輯)

github工程鏈結

在場景中建立一塊地形時,unity會幫我們自動建立乙個terraindata檔案,這個檔案展開後會發現有一張含有rgba四個通道資料的貼圖。我們地形資料實際上也就時這張貼圖的資料。由於rgba四個通道的取值範圍時[0,1],所以我們在給地形設定高度圖,透明通道圖等資料時,也都是將其實際值轉化為0到1的比例值進行設定。

下面是隨便建立的一塊地形以及其terraindata的貼圖,由此大致可以猜出rgba四個通道每乙個都代表一種型別的地形資料。

在unity的地形編輯器上,我們在編輯地形貼圖的時候,需要在面板上新增貼圖,unity2018之前,這個貼圖資料其實是splatprootype,到unity2018後官方做了更新,變成了terrainlayer。在我後面的文章中對這一點做了適配。

terrainlayer中包含了漫反射貼圖、法線貼圖等資料,我們在修改地形之前,需要建立乙個terrainlayer的陣列並賦值。

alphamap是乙個三維陣列,第三維表示層級,也就是我們需要在初始化中設定的terrainlayer。alphamap第一維和第二維的長度設定為2的n次方,其索引代表的是乙個小方塊的貼圖。三位陣列的取值範圍一樣是0到1,值的含義的是當前層級貼圖所佔的比例。乙個小方塊可以設定不同的layer,unity會按照你設定的比例自動進行融合。

detailmap在編輯之前也需要初始化乙個陣列detailprototype。

同高度圖一樣,detialmap也是乙個二維陣列,但是它是乙個int型的陣列,其取值範圍也不再是0到1。其值的含義是在索引所對應的小方塊上對應草的數量。

上述幾個資料的設定都是在terraindata中進行的,樹木的設定移到了terrain中,並且f12跟蹤到terrain類後並沒有發現刪除樹木的api,後來看了一下terrain的原始碼,發現刪除樹的方法是受保護的,外界無法直接呼叫,所以我在工具中用了反射,後面的文章會細說這一部分。

Unity 動態載入Prefab

第一種方法,從resources資料夾讀取prefab assets resources是unity中的乙個特殊資料夾,放在這個資料夾裡的資源包括prefab可以被 動態載入。gameobject prefab gameobject resources.load prefabs character ...

unity動態新增指令碼

第一種,被呼叫指令碼函式為static型別,呼叫時直接用 指令碼名.函式名 第二種,gameobject.find 指令碼所在的物體的名字 sendmessage 函式名 能呼叫public和private型別函式 第三種,gameobject.find main camera getcompone...

認識Unity編輯器

儲存整個專案所有資源的載體。專案中無論是從外部匯入的包 package 資源 後面有詳細 講解 模型資源,音訊資源,還是自己建立的各種指令碼 材質等,都需要在本檢視中儲存 編輯與展現出來。scene 場景檢視 視覺化展現與編輯當前場景中所有的遊戲物件。本檢視與上面層級檢視的區別是 場景檢視是視覺化遊...