1. 程式人生 > >Unity3D 5 官方教程:地形引擎

Unity3D 5 官方教程:地形引擎

建立和編輯地形

通過選單中的GameObject->3D Object ->Terrain,你可以為你的場景建立一個地形物件(這也將在專案檢視中增加一個對應的地形資源)。然而,初始的地表除了一個巨大而單調的平面,什麼都沒有。但如果當地形物件被選中時你檢視檢視器,你將看到Unity提供了一些工具,你可以用來建立任何你喜歡的地表元素。
Terrain Editing Tools appear in the Inspector
除了樹木放置工具和設定面板,在工具欄的所有工具提供了“刷子”的集合,以及對刷子尺寸與透明度的設定。這些繪製工具類似於影象編輯並非巧合,因為地形中的細節正是通過這種方式精確地建立, 通過在地表上“繪製”細節。如果你選擇工具欄上最左邊的工具(Raise/Lower Terrain)並在場景檢視中於地形上移動滑鼠,你將在地形表面上看到一個類似於點光源的游標。當你點選滑鼠,你可以於滑鼠位置處,繪製地表在高度上逐漸的變化。通過在數字工具欄中選擇不同選項,你可以繪製不同的形狀。刷子的尺寸和透明度選項分別改變刷子的面積,以及它效果的強度。
所有工具的細節將在隨後的板塊中給出。然而,它們都基於繪製細節的概念,並且除了樹木放置工具,都有對刷子相同的選項,即尺寸和透明度。工具可以被用來設定地形的高度,也可以增加染色,平面和其它物件。

地形的快捷鍵

你可以在地形檢視器中使用以下鍵盤快捷鍵:
按shift+從Q到Y的某一按鍵,來選擇對應的地形工具(例如,Shift-Q選擇了Raise/Lower工具)。
逗號(,)和句點(.)迴圈選擇可用的刷子。
小於號(<)和大於號(>)迴圈選擇可用的樹木物件,紋理和細節。
另外,標準的F按鍵,對地形有輕微的不同。通常,當滑鼠在場景檢視中時,它將圍繞整個物件適配選中狀態。然而,由於地形通常很大,按F會將場景檢視聚焦到地形中滑鼠/刷子當前處理的區域。這提供了非常快和直管的方式來跳轉到你希望編輯的區域。如果你按F當滑鼠不在地形物件上,將回應標準的適配行為。

高度工具

在地形檢視器工具欄上,前三個工具被用來繪製地形在高度上的變化。
這裡寫圖片描述
從左邊開始,第一個按鈕啟用Raise/Lower Height 工具。當你使用這個工具時,高度將隨著你用滑鼠在地形上掃過而升高。如果你在一處固定滑鼠,高度將逐漸增加,這類似於在影象編輯器中的噴霧器工具。如果你按下shift鍵,高度將會降低。不同的刷子可以被用來建立不同的效果。例如你可以建立丘陵地形,通過soft-edged刷子進行擡升,然後削減陡峭的山峰和山谷通過使用hard-edged刷子進行降低。
Rolling hills cut by a steep valley
左起第二個工具,是Paint Height,類似於Raise/Lower工具,除了它有額外的屬性來設定目標高度。當你在物件上繪製時,此高度的上方區域會下降、下方的區域會上升。你可以使用高度屬性來手動設定高度,或者你可以使用在地形上shift+點選來取樣滑鼠位置的高度(相當類似於圖片編輯器中的“eyedropper”工具)。在高度屬性旁邊是一個Flatten按鈕,它簡單地拉平整個地形到選定的高度。這對設定一個凸起的地面水平線很有用,如果你希望地表包含在水平線上的山峰和水平線下的山谷。Paint Height對於在場景中建立高原以及新增人工元素如道路、平臺和臺階,都很方便。
Hillside with a flat road


左邊第三個工具,Smooth Height 並不會明顯地擡升或降低地形高度,但平均化附近的區域。這緩和了地表,降低了陡峭變化的出現,類似於圖片處理中的模糊工具(blur tool)。你可以使用這個,例如,當你已經在可用集合中使用一個噪聲更大的刷子繪製了細節。這些刷子圖案將傾向於在地表上造成尖銳、粗糙的岩石,但可以通過使用Smooth Height來緩和。

用高度圖工作

如之前提到的,高度工具令人聯想到圖片編輯器中的繪製工具。實際上,地形是使用一個在場景背後的紋理而實現的,那麼這些工具實際上像紋理繪製工具那樣起作用。
地形上每個點的高度,被表示為一個矩陣列中的值。這個陣列可以用一個被稱為高度圖(heightmap)的灰度圖來表示。使用外部編輯器的高度圖有時候很有用,例如Photoshop,或者在你的遊戲中獲取現有的地理高度圖。Unity提供了為地形匯入、匯出高度圖的選項;如果你點選Settings tool(工具欄最右邊的按鈕),你講找到標記為Import RAW和Export RAW的按鈕。這些允許高度圖從標準RAW格式中被讀取或者寫入;標準RAW格式是16位灰度格式,相容大部分圖片和地表編輯器。

紋理

你可以新增紋理圖片到地形的表面上,來創造著色和良好的細節。由於地形是如此巨大的物件,在實踐中標準的做法是使用一個無空隙地重複的紋理,在表面上用它成片地覆蓋(從接近地面的角色視角來看,這樣的重複通常不是明顯易見的)。一個紋理將作為在地表上的“背景”圖片,但你也可以繪製不同的紋理區域來模擬不同的地面,如草地、沙漠和雪地。繪製出的紋理可以在不同的透明度下使用,這樣你可以在鄉野草地和沙灘之間有一個漸變。
Sand dune terrain with sandy texture

啟用紋理

工具欄中的paintbrush按鈕啟用紋理繪製。
這裡寫圖片描述
一開始,地形將沒有紋理分配用於繪製。如果你點選Edit Textures按鈕並且在選單中選擇Add Texture,你講看到一個視窗,在其中你可以設定一個紋理和它的屬性。
取決於你在Terrain Settings中設定的材質型別,主紋理圖的顏色通道可能有不同的用處。
Add Texture window (Standard)
標準:RGB通道是地形表面的反射顏色,而alpha通道控制平滑。也有一個“Metallic”滑塊,控制表面的所有金屬成色。
Add Texture window (Diffuse)
Diffuse:RGB通道是散射顏色。Alpha通道不被使用。
Add Texture window Specular
Specular: RGB 通道是漫射顏色。Alpha通道為光澤。
Add Texture window (Custom)
Custom:紋理圖如何使用,取決於你的自定義著色器,但通常你希望RGB通道為基色。
除了主紋理貼圖,你也可以為所有3個內建的材質型別指定一個法線紋理。這裡被使用的法線紋理的紋理型別必須為“法線貼圖”(你可以在一個紋理資源的匯入選項中,改變紋理型別)。掌控法線貼圖的著色器程式碼將被開啟,僅當為地形設定了至少一個法線紋理,所以如果你不使用它們,你不需要付出效能消耗。
Size屬性(就在texture boxes下方)允許你設定寬度和高度,即圖片將於地形的表面上伸縮的程度。Offset屬性決定,平鋪紋理開始的位置與地形錨點之間的距離;你可以將它設定為0,讓平鋪從角落開始。一旦你將紋理和屬性設定完成,點選Add按鈕讓紋理對地形可用。
為了改變一個已經添加了的地形紋理,選擇它的thumbnail,點選“Edit Textures”按鈕並從選單中選擇“Edit Texutre”。或者,你可以簡單地雙擊它的thumbnail。為了移除一個地形紋理,選擇它的thumbnail,點選“Edit Textures”按鈕並從選單中選擇“Remove Texture”。

紋理繪製

你新增的第一個紋理將被作為“背景”使用而覆蓋地形。然而,你可以新增你希望數量的紋理;隨後的這些紋理將可以繪製,通過使用類似的刷子工具。在地形檢視器紋理的下方,你可以看到通常的刷子尺寸及透明度選項,但也有另外一個稱為目標強度(Target Strength)的選項。這個設定了刷子將會達到的最大透明度值,即使它重複地通過了相同的點。這對於在一個單一地形型別中,新增細微修補的顏色變動,來破壞一個巨大、平整、用相同紋理不斷重複覆蓋區域的單調,是個有用的辦法。
Grass terrain with dirt texture painted on corners

樹木

Unity地形可以用樹木佈置。可以像高度圖和紋理被使用那樣,樹木補丁被繪製到地形上,但樹木是固定的、從表面生長出的三維物件。Unity使用了優化(例如,對遠距離樹木的公告板化)來維持好的渲染效果,所以你可以擁有上千棵樹組成的密集森林,同時保持在可接受的幀率。
Terrain with trees

啟用樹木

在工具欄上的tree按鈕啟用樹木繪製。

一開始,地形將沒有可用的樹木,但如果你點選Edit Trees按鈕並且選擇Add Tree,將彈出一個視窗來讓你從自己的專案中選擇一個樹木資源。
The Add Tree window
在標準資源包中,Unity帶有幾個樣例SpeedTree樹木物件,用作藍本(Assets->Import Package ->Terrain Assets);但也可以用SpeedTree Modeler應用,UnityTree Creator工具或者其他3D建模應用,來建立合適的物件。
如果選中的樹木物件是用Tree Creator所建立的,視窗將顯示搖擺特性,用於調整對風的響應度。這些請看下面的“讓樹在風中搖擺”部分。

繪製樹木

當一棵樹被選中,你可以在地表上用繪製紋理或高度圖的相同方式來繪製。可以用按住shift鍵來從區域中移除樹木,而通過按下ctrl,只繪製、移除當前選中的樹木。類似的刷子尺寸選項對樹木繪製有效,但透明度選項被樹木密度(Tree Density)所替代,這控制了在區域的一個給定單元中,繪製樹木的平均數量。
一個範圍滑塊讓你控制樹木的最小高度和最大高度。如果你停用隨機(Random),你可以為所有樹木的高度指定一個值。預設下,一棵樹的寬被鎖定關聯到其高度,這樣樹木通常被一致地縮放。然而你可以停用“鎖定寬度到高度”(Lock Width to Height)選項並分別指定其寬度。
同樣也有對顏色變化和隨機樹木旋轉的控制。變動選項幫助建立隨機、看起來自然的森林,而非由完全相同樹木組成的人工種植園。
Mass Place Trees 按鈕對建立一個用樹木進行完全的覆蓋而不在全部地表上繪製,是非常有用的辦法。在一個大量安置之後,你仍可以使用繪製來增加或移除樹木,來建立更密集或更稀疏的區域。

SpeedTree/LOD Trees

從Unity5開始,你可以使用來自IDV的SpeedTree建模來建立帶有高階視覺效果如平滑LOD過渡、快速公告板以及自然風動畫的樹木。請到他們的頁面獲取更為細節的資訊。你也可以從資源商店包或其他第三方來源免費匯入SpeedTree資源到你的專案資料夾中。
檢視這裡來獲取更多資訊。

Tree Creator樹木

Unity有它自己的樹木建立器,你可以用它來產生新的樹木資源;但你也可以用標準的3D建模應用來完成此項任務。樹木網格必須少於2000個三角面(出於效能考慮),錨點必須在樹木從地面上長出的根基處。網格應當有兩個材質,一個用於樹幹,另一個用於樹葉。
樹木必須使用自然/柔和咬合樹葉(Nature/Soft Occlusion Leaves)和自然/柔和咬合樹皮(Nature/Soft Occlusion Bark)著色器。為了使用這些著色器,你也不得不將樹放在特定的包含了名稱“Ambient-Occlusion”的資料夾中。當你在這樣一個資料夾中放了個模型並再次匯入它,Unity將在一種特別為樹木設計的方式中計算軟環境咬合。“自然/柔和咬合”著色器依賴資料夾命名習慣;如果你不遵守,樹木將不會正確地渲染。
當你從建模應用中儲存一個樹木資源,你需要點選Refresh按鈕(當樹木繪製工具被選中時在檢視器中顯示),目的是檢視你地形上更新了的樹木。

在樹木上使用碰撞器

你可以為一個新的樹木資源新增一個膠囊碰撞器,通過在場景中例項化它、新增碰撞器(選單:Component->Physics->Capsule Collider)、為修改後的樹木物件建立一個新的預物體。當你新增樹木到地形中,確保你選擇了帶有碰撞器的預物體而不是原始的那個。你也應當在地形的Terrain Collider元件檢視器中啟用Create Tree Colliders。

讓樹木在風中搖擺

需要做的第一件事是建立一個有風區域。你可以通過從選單:Game Object->Create General->WindZone來進行。
這裡,你需要確保你的樹被設定為搖擺的。選擇你的樹,然後選擇Edit Trees->Edit Tree。設定搖擺值為1將導致樹進行調整,如果你尚未做這件事。
你可能注意到了,你的樹木相當狂暴地動著。為了修正,你可以改變你的搖擺值,但直接在“風區”中設定這些值或許會更簡單,而保持你的樹的搖擺值設定為1。為了避免樹木搖動太大,降低風湍流至0.1到0.3,所有東西將明顯低更平緩。如果你不希望所有樹都飄向同一個方向,降低Wind Main 值與湍流相同的值。

草地和其它細節

一個地形可以有草叢,和其它小物體,比如覆蓋表面的石頭。草地使用2D影象進行渲染來表現單個草叢,而其它細節從標準網格中生成。
Terrain with grass

啟用細節

在工具欄上的細節按鈕啟用了草地/細節繪製。
這裡寫圖片描述
一開始,地形沒有草地或細節可用,但如果你點選在檢視器中的Edit Details按鈕,在出現的選單中將看到Add Grass Texture和Add Detail Mesh選項。出現的視窗將讓你選擇你希望新增到地形中繪製的資源。
對於草地,視窗是這樣的:
The Add Grass Texture window
Detail Texture是表現草地的紋理。一些合適的紋理包含在了Unity的標準資源庫中,可以從資源商店裡下載。你可也可以自己建立它們。紋理就是一個小圖片,其空白區域的alpha通道設定為0(當然“草地”是個專業術語,你可以使用圖片來表現花朵,灌木叢,甚至一些像鐵絲網之類的人造物體。
Min Width, Min Height, Max Width and Max Height值指定了生成草地的尺寸上下限。為了看著真實,草地用隨機“帶噪聲”模式生成,草地上散落光禿的部位。
Noise Spread值控制替換塊的近似尺寸,更大的值導致在給定區域中更大的變化。(技術說明:噪聲實際上使用柏林噪聲Perlin Noise所生成;噪聲的傳播取決於作用在地形上x,y位置之間的縮放,以及噪聲影象。)在中心的草地替換塊,被認為是比在邊緣上的更“健康”;Healthy/Dry Color設定用它們的顏色展示草地的健康程度。
最後,當公告板選項被啟用,草地影象會被旋轉,這樣它們永遠面向鏡頭。當你想要展示草地的密集區域時這個選項有用,因為二維影象不可能從哪個方向都能看到。然而,稀疏的草地,單個草叢的旋轉變得明顯,產生奇怪的效果。
對細節網格,如石頭,選項視窗是這樣的:
The Add Detail Mesh window
Detail屬性用來從你的專案中選擇一個預物體來設定,它將用隨機的Width和Height值縮放出單個例項。Noise Spread和Healthy/Dry Color值如它們對草地影響那樣進行工作(儘管當應用到如石頭的物體上時,“健康”的概念擴充套件了)。渲染模式可以被設定為草地Grass或者Vertex Lit。在草地模式中,場景中的細節物體例項將被抹平為2D影象,像草地紋理那樣表現。在Vertex Lit模式中,細節將被如場景中的固定,定點光照物體那樣渲染。

風區

你可以通過新增一個或多個帶有風區元件的物件,在你的地形上建立風的效果。帶有風區的樹木將以逼真的動畫效果擺動,而風自身將間歇性生成,來產生樹木自然擺動的效果。

使用風區

風區物件可以直接建立(選單:GameObject->3D Object->Wind Zone)或者你可以向場景中已經存在的任何合適物體新增這個元件(選單:Component->Miscellaneous->Wind Zone)。風區檢視器有一些選項來控制它的行為。
Wind Zone inspector
Mode可以被設定為定向(Directional)或球形(Spherical)。在定向模式中,風會同時影響整個地形;而一個球形風從一個用Radius屬性定義的球體中向外吹。定向風在創造樹木自然運動時更有用,而球形風更適合如爆炸這樣的特定效果。
Main屬性決定風的整體強度,但這可以使用Turbulence進行一些隨機的變化。如前文提到的,風間歇地吹在樹上產生更為自然的效果。間歇的強度和時間間隔用Pulse Magnitude和Wind Frequency屬性來控制。

粒子系統

風的主要用途是讓樹木運動,但它也可以影響到被使用外力模組的粒子系統產生的粒子。更深入的細節內容參考粒子系統