# **靜態模型的導出**
## 零、Blender和Unity的模型比例
**H子:** AOI老師,模型做出來之后,想要導出到Unity,但是又擔心資源導出之后會各種混亂,所以有什么好辦法處理呢。
**AOI:** 一般來說資源導出之后各種混亂基本都是自己的開發規范沒做好吧,除了問題不要賴軟件阿。
**H子:** 但是啊,導出模型之后,導入Unity,尺寸比例,還有角度朝向什么的,一不小心就出錯了阿。
**AOI:** 這些的話,因為3D軟件間各自使用的坐標系各有不同,所以最終確實會導致這樣的結果。既然現在是使用Blender的話,那就直接確定Blender的規范吧。第一步就是先確認Unity和Blender之間的單位關系。
**H子:** 這樣的話,直接用Blender默認的Cube導出之后,再跟Unity的Cube進行比較,就可以知道,在默認狀態下,兩個軟件間的比例關系了吧。
**AOI:** 這個確實是一種簡單易懂而又客觀的做法。
**H子:** 那么直接就用新建場景的時候的默認的這個Cube就好了

導出FBX再倒入到Unity
和默認的Unity的Cube進行比較

啊,大了一倍呢。

這么說,Unity和Blender的尺寸比例是1:2 了?
**AOI:** 所以你什么時候能改改這種做事不仔細的習慣。
**H子:** 嗯??
**AOI:** 再回去Blender看看Blender里面的Cube的具體參數。

你看清楚了,這可是長寬高都是2的Cube。
**H子:** 啊,看到了。也就是說,實際上Unity和Blender的默認單位是1:1了。這樣的話,只要以Blender的標準單位為標準統一制作即可。
**H子:** 確定好標準之后,首先根據標準調整模型就可以了吧。角色,場景模型的比例,實際上我建模的時候就是以Blender的cube為標準進行建模的呢。
**AOI:** 對的,確保模型的比例本身是很重要的,理應在建模階段就已經考慮好。既然本身已經有一套標準的話,那么直接按照這套標準進行就好了。但是確保在Unity內部的比例和尺寸,會影響到光照,物理模擬等等相關的計算。所以盡可能確保比例和尺寸比較好。
**H子:** 那么我直接利用Blender內建的人形骨骼作為標準人體進行參考也是可以的吧。
**AOI:** 這倒是沒有什么問題。
**H子:** 那么,就這樣!


## 壹、導出的基本設置
### **1) 模型的材質**
**AOI:** 那么,有檢查一下模型的材質設置嗎。
**H子:** 沒問題的,畢竟這個是在做基礎模型的時候就已經添加好的材質,自動化生成的模型都是這個基礎模型的副本,所以材質方面沒問題。

**AOI:** OK,可以。在這里明確一下的事情就是。你給材質進行的命名,在導入Unity的時候,如果選擇了導入材質,那么自動導入的材質就會使用這里的材質命名。如果不設置材質直接導出一個模型,那么導入Unity之后,就會自動產生一個叫**No Name**的材質了。
為了不出錯,所以材質的命名要規范。而如果這里使用了多組材質的話,就更應該仔細的細分了。而且這里也并不推薦一個模型使用多個材質。關于這一點,我們后面關于格式的時候再說。
**H子:** 恩,我這里并沒有使用了多個材質的物體呢。那么下一步該是確認什么東西呢?
**AOI:** 那么下一步,該確認一下模型的對象名稱和網格名稱了。
### **2) 模型的網格名稱**
**AOI:**首先打開在大綱視圖,把需要導出的對象展開看看吧。

可以看到,大綱視圖上面,橙黃色三角形圖標的是對象,而白色三角形圖標的是網格,材質球圖標的自然就是材質了。
從這里可以得知,現在選中的對象,對象名稱是TreeTri.002,而網格名稱卻是TreeTri.007,也就是說兩者并不一致。
**H子:** 這里不一致會有什么問題呢?
啊,我知道了,導入Unity之后,如果要對Mesh而不是GameObject操作的時候,名稱不同的話,索引會有難度吧。雖然對使用本身是沒有太多的影響。
**AOI:** 對的,不過歸根結底,這個是一個項目規范和項目需求的問題了。根據需求,你決定好網格和對象名稱是不是需要一致。
**H子:** 啊,把全部模型改過來好累啊!快進行下一步吧!
### **3) 模型的朝向與Unity的前向**
**AOI:** 這里有一件事情需要提醒一下,就是模型朝向的問題。因為Unity和Blender用的并不是同一套坐標系,所以建模和導出的時候,要牢牢的記住模型的朝向問題。
1. Blender的Z軸,是垂直地面向上的軸向,而對應的是Unity的Y軸,同時軸向相同,也就是上方。
2. Blender的Y軸的負方向,對應的是Unity的Z軸正方向,也就是前方。
3. Blender的X軸負方向,對應的是Unity的X軸正風向,也就是右方。
**H子:** 阿,老師,這樣記憶起來好復雜啊。有什么方便的方法嗎。
**AOI:** 這個時候,Blender自帶的人形骨骼就是我們最好的朋友了。直接創建一個人形骨骼,人形骨骼默認狀態下的臉朝向就是Unity的Z軸正方向,也就是Unity坐標系的前方,右手就是右,至于上的話,就沒有什么好說了。
**H子:** 嗯嗯,這個就簡單明白多了。
### **4) 模型的變換塌陷與清零**
**AOI:** 那么,進行下一步,為了模型在Unity里面能正常的調用,不會出現坐標偏差,所以必須確保導出的模型每一個的中心都落在世界中心(0,0,0)上。
而現在可以看到的就是,因為當初為了方便觀察,所以隨機生成的樹木都落在了場景的各處。
所以在導出前,都必須確保模型的變換歸零或者塌陷。
而Blender的重置快捷鍵是Alt+G,Alt+R,Alt+S,分別對應位置,旋轉和縮放的歸零。
如果已經確定當前的模型的變換,則不應進行歸零操作,而是塌陷變換。對應操作為,選中對象,按下Ctrl+A,在彈出的快捷菜單選擇需要塌陷的項目即可。

**H子:** 把位置歸零之后,再塌陷了變換之后就變成這樣了。

### **5) 導出格式的選擇**
**H子:** 模型的參數各方面都設置好之后,就該導出模型了吧。因為是靜態模型,所以無需專門用FBX吧,那么我直接選擇OBJ就可以了嗎?
**AOI:** OBJ作為純粹的單個材質靜態模型也并非不可,不過其實相較之FBX格式,OBJ格式的優勢其實幾乎不存在。而最大的好處則是OBJ格式本質上就是明文記錄的模型數據,所以只要遵循格式,就可以直接讀取,無需第三方庫的介入。不過這個優勢,對于實際上開發來說卻并不是很重要。
首先我們來看看一些實際情況吧。
1. OBJ并不支持多個材質的模型,所以,當你一個模型使用了多個材質的時候,導出的OBJ文件就會變成一個材質一個對象的結構的模型組。導入到Unity之后看起來是這樣的:

2. OBJ并不支持骨骼形變動畫的記錄,稍作一個測試:
制作這樣的一段簡單的骨骼動畫


導出的時候勾選動畫

最后看起來是這樣的:

3. OBJ作為明文記錄的文件格式,對于同樣的靜態模型,有時候可能會有數據冗余,導致模型數據還會比FBX格式更大。
因此,實際上直接使用FBX格式會更好,當有對單材質靜態模型數據直接操作,又不依賴第三方SDK的時候,OBJ會是一個比較好的選擇。而大部分情況,FBX會是最好的選擇。
### **5)導出參數的設置**
**H子:** 好了!選中需要導出的模型,然后點擊文件-導出-FBX,打開了FBX格式的導出窗口了。
**AOI:** 那么接下來就要好好設置一下導出的參數了。這里雖然并不難,但是實際上也有不少需要留意的細節。
**H子:** 首先果然是主標簽面板的參數吧

**AOI:** 如果這里保持默認,什么都不改的話,那么就會直接把整個Blender項目里面的模型都一起導出了。所以,在導出的時候要注意,因為實際上只需要導出有用的數據即可,但是項目里面為了方便,可能會留存有大量的游戲實際開發中并不需要的數據。
所以這里建議:
1. 勾選上【選定的物體】這一選項。
2. 同時,因為是導出模型,所以并沒有其他的東西,因此下面的導出類型多選欄里面,只要選上網格即可
3. 而!EXPERIMENTAL! Apply Transform,也就是應用變換選項,這個選項建議靜態模型的時候勾選上。在這個功能的前面加上了實驗特性的標簽,意味著這個功能可能會出現不可預料的錯誤。但是對于靜態模型來說,這并沒有任何錯誤可以發生。而且,勾選之后,就可以 **解決模型導入Unity之后,X軸出現-90度的問題。** 而其他的參數,對于Unity游戲開發,并非必要的選項,直接無視即可。但是當需要導出動態模型的時候,這個選項就需要斟酌了,不過這個事情留到動態模型導出的時候再作討論。

而【幾何數據】標簽下面并不需要太多的修改,因為當你導出模型到游戲引擎的時候,不管怎么樣,都需要應用修改器的操作。而其他參數,對導出模型的影響并不算大。當然,要不要勾選并導出【切向空間】,這個取決于你需不需要對切向空間的數據的利用。一般沒有特殊需求的情況下,并沒有導出的必要。

【骨架】標簽下面的參數,同樣不需要多做修改,如果沒有骨骼的模型,則直接無視這一欄

要注意的一個地方就是【Add Leaf Bones】選項,如果勾選了這個選項,那么就會在導出的時候,骨骼的末端,再添加一個以xxxx_end格式命名的末端骨骼。如果取消勾選,就不會產生這個末端骨骼,同樣是根據需要進行設置。
因為目前是進行靜態對象的導出,所以【動畫】標簽下的參數直接去掉【烘焙動畫】的勾選即可。其他參數的意義,在需要導出動態物體的時候再作討論。

而至此,則已經完成了模型導出的關鍵設置。只需要設置好文件的路徑和名稱,點擊導出即可。
**H子:** 全部樹木都塞一起了啊。只能在Unity里面手動一個個模型的拆開做成Prefab嗎?

**AOI:** 在這里的話,倒是建議使用腳本進行批量化導出了,可以根據需要,把這一堆模型每個獨立的導出成一個FBX文件。就算對單個模型修改,也可以只修改對應的模型就可以了,而無需修改一個模型,就全部重新導出一次。
把資源全部獨立分開導出,可以很大限度的降低風險。
**H子:** 那么之后果斷要寫一份把上面的操作全部自動化完成的腳本!這樣手動太煩了!簡直浪費人生!
## 貳、H子的靜態模型導出總結筆記
1. 確保模型的材質與材質命名,如非必要,盡量避免一個模型多個材質
2. 確保模型的對象名和網格名。
3. 確保模型的朝向與變換的塌陷和清零,確保模型的底部或者原點落在世界中心,避免導出的模型坐標偏移
4. 如有特殊需求,導出模型一律FBX總沒錯
5. 導出模型的時候記得勾選【選定的物體】一欄,以免導出多余的東西
6. 可以的話,用腳本導出,用腳本完成模型的規范化處理。