為Unity3D創(chuàng)建素材(2):模型、綁定、動畫


模型(Mesh)

在Unity3D中使用三維模型,主要依靠Mesh Filter組件載入多邊形表面物體(polygon mesh),然后依靠Mesh Renderer組件將Mesh正確渲染出來。

內(nèi)置基本3D模型

Unity3D內(nèi)置有一些基本幾何體,通過Hierarchy面板上的Create按鈕或者菜單選擇GameObject > 3D Object來創(chuàng)建:

Name Model
Cube 方塊:1×1的正方體
Sphere 球體
Capsule 藥丸
Cylinder 圓柱
Plane 平面:10×10的平面
Quad 單面:1×1的單面

這些內(nèi)置的基本幾何體其實就是引擎自帶的mesh。等同于我們在外部創(chuàng)建一個Cube或Plane模型然后導(dǎo)入Unity使用。這與我們的在Maya中使用預(yù)設(shè)幾何體有本質(zhì)不同。Unity3D的基本幾何體不具備任何調(diào)整參數(shù)選項。

普通3D模型導(dǎo)入Unity3D

由于基本幾何體都非常簡單,Unity3D本身也不提供多邊形編輯工具給我們使用(但可以使用
ProBuilder Advance 插件來進(jìn)行一些多邊形編輯工作),所以很多情況下我們需要其他3D軟件來制作模型,然后再導(dǎo)入到Unity3D中。

雖然U3D現(xiàn)在支持直接導(dǎo)入Maya的.ma文件,但建議大家還是先將模型清理好后導(dǎo)出成.fbx格式,然后再導(dǎo)入到U3D中,這樣比較便于管理。

并不是所有的Maya節(jié)點都能夠被正確導(dǎo)入到Unity3D中,實際上,Unity3D僅支持Polygon Mesh、Joints、空節(jié)點、蒙皮信息、攝影機(jī)、關(guān)鍵幀動畫的導(dǎo)入,而Maya中常用的NURBS表面、Curve曲線、變形器、IK、Constraints等內(nèi)容都不支持。

并且,我還建議大家在導(dǎo)出.fbx之前對Maya文件進(jìn)行一下“清理”工作,檢查好模型的發(fā)現(xiàn)方向,烘焙好關(guān)鍵幀動畫,刪除掉多余無用的節(jié)點,刪除無用的構(gòu)造歷史,同時將模型放在坐標(biāo)原點中心位置,凍結(jié)Transform屬性(歸零)。

Unity3D可以識別單個模型文件中的多個mesh,且Mesh Filter組件僅支持載入單個mesh,所以我們可以用一個文件導(dǎo)出所有游戲所需要用到的mesh,然后在U3D中一一調(diào)用。

因此,為Unity3D制作模型素材的時候,在三維軟件中就搭建好全部模型并不是一個好選擇。因為三維軟件中重復(fù)出現(xiàn)的模型,導(dǎo)入U3D中以后會被識別成不同的mesh,直接載入整個場景會浪費掉很多系統(tǒng)資源。更有效的制作流程是在三維軟件中制作好不同的“小物件”,然后在Unity3D中完成具體場景的搭建工作。

PS:地形、植被等模型可能更適合于利用Unity3D自帶的功能模塊來創(chuàng)建呢!

模型導(dǎo)入的設(shè)置參數(shù)

選擇相應(yīng)的模型Asset,其導(dǎo)入?yún)?shù)會顯示在Inspector面板中。

Model一欄是關(guān)于模型的導(dǎo)入?yún)?shù),Rig一欄是關(guān)于綁定設(shè)置的導(dǎo)入?yún)?shù),Animations一欄是關(guān)于動畫數(shù)據(jù)的導(dǎo)入?yún)?shù)。

unity_model_import_02.png

這個模型素材來自: "Unity-chan"Model 1.1

  • Scale Factor:導(dǎo)入尺寸縮放(按照實際長度計算)
  • Use File Scale是否保留模型本身的縮放屬性
  • Mesh Compression:網(wǎng)格數(shù)據(jù)壓縮程度,會一定程度上減少mesh的多邊形面數(shù)
  • Read/Write Enabled:是否支持直接修改本文件
  • Optimize Mesh:是否精簡mesh的面數(shù)
  • Import BlendShapes:是否導(dǎo)入BlendShapes
  • Generate Colliders:是否自動創(chuàng)建碰撞體
  • Keep Quads:是否保持所有的四邊面(而不自動轉(zhuǎn)換為三角面)
  • Weld Vertices:是否自動融合重合的頂點
  • Swap UVs:交換UV組(通常模型有多套UV組,且導(dǎo)入后發(fā)現(xiàn)貼圖不正確時勾選)
  • Generate Lightmap UVs:是否自動創(chuàng)建用于光照烘焙的UV組
  • Normals:如何處理法線方向(Import代表導(dǎo)入模型原來的法線數(shù)據(jù)、Calculate代表用下面的Smoothing Angle參數(shù)來進(jìn)行自動光滑計算、None代表完全無光滑發(fā)現(xiàn)設(shè)置)
  • Smoothing Angle:夾角在多少度以上的邊會被自動計算成光滑邊界
  • Tangents:切線計算設(shè)置
  • Import Materials:是否導(dǎo)入模型材質(zhì)球
  • Material Naming:使用什么名稱來命名材質(zhì)球
  • Material Search:材質(zhì)球搜索規(guī)則

設(shè)置完畢千萬不要忘記點擊 Apply 按鈕確認(rèn)哦?。?!

關(guān)于比例

在Unity3D中尺寸比例非常重要,因為很多Unity3D操作都依賴于physics物理解算,而物理解算會因為物體的尺寸比例不同而呈現(xiàn)出差異極大的結(jié)果。一個100米高的大石頭和一個1厘米高的小石塊從空中落到地面的行為顯然是很不一樣的。

Unity3D中默認(rèn) 1單位距離 = 1米。

由于Maya中默認(rèn)設(shè)置為 1單位距離 = 1厘米,所以Maya模型導(dǎo)出成.fbx以后再導(dǎo)入Unity3D,要設(shè)置scale為0.01,否則就會變得超級大。

總結(jié)一下導(dǎo)入模型的技術(shù)要求:

  • 法線要正確:Unity3D中不可以修改多邊形法線方向,所以如果錯了就必須返回Maya進(jìn)行修改再重新導(dǎo)入;
  • 比例要正確:如果按照Maya默認(rèn)1單位=1厘米,那么1米高的物體在Maya中就應(yīng)該高100個單位,同時導(dǎo)入時Scale Factor設(shè)置為0.01;
  • Pivot Point要提前設(shè)置好;
  • 位移歸零位置要在坐標(biāo)原點(但初始位置不一定要在原點);
  • 不能有構(gòu)造歷史(導(dǎo)出FBX的時候會自動統(tǒng)一清空構(gòu)造歷史,所以不要有任何依賴于構(gòu)造歷史的修改變化);
  • UV都放在(0,1)象限內(nèi),且保持UV正向(Maya中顯示為藍(lán)色為正向);
  • 單一mesh的UV不要有重疊;
  • 只使用smooth bind進(jìn)行綁定;
  • 動畫必須全部由動畫曲線關(guān)鍵幀控制;
  • 骨骼命名最好提前做好。

綁定(Rig)

Rig一欄下的設(shè)置比較簡單,最重要的是設(shè)置Animation Type

  • Legacy:這種方式比較老式了,不支持Avatar,通過Animation組件來調(diào)用動畫
  • Generic:這種方式現(xiàn)在比較常用,對動畫的調(diào)用主要通過Animator組件來完成
  • Humanoid:這種方式類似Generic,也是配合Animator使用的,但專門針對人形骨架,可以點擊Configure...按鈕進(jìn)入人形骨架Avatar的詳細(xì)設(shè)定

所謂Avatar,在我認(rèn)為是對于骨骼結(jié)構(gòu)的一種標(biāo)準(zhǔn)化描述方式,用來方便在不同模型之間自由應(yīng)用動畫數(shù)據(jù)。比如Humanoid類型的Avatar,就把人形生物的各關(guān)鍵骨點都標(biāo)準(zhǔn)化為了特定的名稱,這樣不論動畫數(shù)據(jù)是基于怎樣的命名規(guī)范,只要將動畫數(shù)據(jù)fbx文件以及目標(biāo)模型fbx文件都標(biāo)準(zhǔn)化成人形Avatar,就可以自由的將動畫數(shù)據(jù)應(yīng)用在新模型上。

眼尖的同學(xué)應(yīng)該可以發(fā)現(xiàn),這個概念和Maya中的HumanIK很像。

在下面圖片所示的Mapping面板中,我們可以手動指定各關(guān)鍵骨點所對應(yīng)的場景節(jié)點,甚至還可以對于頭部和手指的細(xì)節(jié)進(jìn)行設(shè)置,非常方便:

unity_model_rig_avatar1.png

Muscles & Settings面板我還沒怎么用過,以后用到了再補(bǔ)充進(jìn)來。

對模型進(jìn)行綁定設(shè)置的基本流程可以總結(jié)如下:

  • 對于非常非常簡單的動畫對象,可以選擇Legacy方式進(jìn)行設(shè)置(但我還是不太推薦)
  • 對于標(biāo)準(zhǔn)人形對象,選擇Humanoid方式,Avatar Definition可以直接Create From This Model,也就是根據(jù)本模型新建一個Avatar
    • 如果對自動創(chuàng)建的Avatar不滿意,點擊Configure...進(jìn)入Mapping面板自行設(shè)置
    • 如果已經(jīng)設(shè)置過同樣的Avatar,可以在Avatar Definition中選擇Copy From Other Avatar以避免重復(fù)工作
  • 對于非標(biāo)準(zhǔn)人形對象,選擇Generic方式,Avatar Definition同上
    • Generic方式還需要指定一個Root Node,也就是“根”節(jié)點,這個節(jié)點是所有動畫的起點,通??梢灾付ü趋梨湹淖铐敹薺oint,或者骨骼鏈的父物體節(jié)點等等
  • **點擊Apply按鈕確認(rèn)?。?!

將設(shè)置好的.fbx資源拖進(jìn)場景中,Inspector中會顯示這個游戲物體的組件

可以看到已經(jīng)附加了一個Animator組件(動畫人),其Avatar參數(shù)已經(jīng)添加好了,但Controller參數(shù)還是空的。這時候模型是不會在場景中播放動畫。

如果之前選擇的是Legacy方式的Rig,游戲物體會被自動附上Animation組件。其中Animation參數(shù)也是空的(因為這個fbx模型本身是不帶動畫的?。?。

初學(xué)者大多會“自作多情”地認(rèn)為,帶動畫的fbx模型導(dǎo)入Unity3D不是應(yīng)該直接就自動播放動畫么?其實并不是這樣的。如果是Legacy方式導(dǎo)入,模型又自帶動畫的話,倒是有可能自動播放,但LegacyAnimation組件目前其實已經(jīng)逐漸被大家拋棄了,而使用Animator的話,不添加Controller是不會有動畫被播放的。


動畫(Animation)

上面所使用的Unity-chan的素材,動畫文件是和模型文件分開的,如果選擇模型.fbx文件打開Animations面板的話,看到的是一片空白:

大家如果也使用這個資源的話,可以在UnityChan > Animations目錄下找到帶動畫的.fbx文件。

我選擇unitychan_WALK00_F.fbx文件來做演示,點擊文件右邊的小箭頭,可以顯示這個.fbx文件的全部內(nèi)容,我們可以看到只有一些貌似面部的mesh,一個Avatar,以及一個WALK00_F文件。

這個.fbx文件實際上只包含動畫數(shù)據(jù),之所以會有這些mesh出現(xiàn),是因為這些mesh上的動畫并不是通過骨骼綁定來實現(xiàn)的,而是blendshape或者是直接transform動畫,所以必須保留動畫數(shù)據(jù)所依附的節(jié)點,也就是這些mesh。

而這個WALK00_F文件就是動畫數(shù)據(jù)所存放的文件了(在硬盤上的文件后綴名是.anim)。

有動畫的.fbx文件在Animations面板下是有內(nèi)容的。

unity_model_animation_2.png
  • Bake Animation:我沒用過這個選項,應(yīng)該是把IK動畫烘焙成關(guān)鍵幀動畫的意思吧,但不保險,還是在三維軟件中做好所有的烘焙工作吧。

  • Anim. Compression:是否精簡壓縮動畫曲線,當(dāng)然選擇Off

  • Clips:這里可以對動畫曲線做切割,點擊+號可以添加一個片段,并給這個片段指定Start幀和End幀,每一個Clip對應(yīng)之前看到的一個動畫文件,默認(rèn)是將整段動畫曲線做成一個大Clip,也就是WALK00_F。我們可以在一個文件中把全部需要的動畫都做進(jìn)去,然后在導(dǎo)入的時候手動分割,我個人比較推薦這種做法。

    要注意的是,手動分割以后的clips文件才會真正出現(xiàn)在硬盤上,前面展開fbx文件看到的那個動畫文件實際上是包含在fbx文件內(nèi)部的,在硬盤上找不到的。

  • Loop Time:該片段是否默認(rèn)循環(huán)播放

實際上,從設(shè)定clip的名稱開始,后面的所有設(shè)定都是針對某一個特定clip來做的詳細(xì)參數(shù),這里不細(xì)說了。

這張圖片中顯示出兩條Warning警告,說明這個模型其實是有一點點小問題的,我檢查了一下,應(yīng)該是有一根Spine骨骼稍微有點歪,不過不影響大局,就不管它了。

在最底下的預(yù)覽框中可以看到,這種單獨導(dǎo)出動畫文件的工作方式真不咋地,由于沒有實體模型,所有動畫文件預(yù)覽時都看不到,點擊播放就看到一張白臉在那里晃來晃去。

解決辦法是用鼠標(biāo)將模型fbx文件拖到這個預(yù)覽窗口中,這樣就替換了原始模型,便可以看到該段動畫clip在正確的模型上優(yōu)雅地播放了。

Animator Controller (動畫人控制器)

下面我們來讓這個模型能夠動起來。

unity_animation_1.png

如果使用老式的Animation組件,只需要將動畫片段clip拖到到Animation欄中,這段clip相當(dāng)于“當(dāng)前動畫片段”,會自動在game object被載入時自動開始播放了,如果設(shè)置了loop,那么就會不斷循環(huán)。
Animations一欄中,可以添加任意多個clips,這些clips則是“后備動畫片段”,未來可以通過腳本來調(diào)用他們進(jìn)行播放。

老式Animation組件的問題在于,游戲中動畫片段之間的切換是非常頻繁且復(fù)雜的,使用這種方式的話,所有的動畫切換都要通過腳本來實現(xiàn),變成了程序員的負(fù)擔(dān)。所以那些編寫游戲引擎的程序員們當(dāng)然就要想辦法把這份工作甩給美工去做咯,于是就開發(fā)了后面的Animator系統(tǒng),把動畫片段的切換邏輯設(shè)計給“可視化”。

unity_animator_1.png

新式的Animator組件需要調(diào)用一個Controller,我們可以在Assets中新建一個,暫且起名叫AC吧。

將這個AC拖到Animator組件的Controller一欄中,然后雙擊這個AC文件打開Animator面板。

這個面板現(xiàn)在空空蕩蕩的就3個類似按鈕的東西,我們可以拖動這些“按鈕”來隨意布局。

unity_animator_controller_1.png

把動畫文件拖到這個面板上,可以看到動畫clip變成了一個較大的橘色長條,然后從Entry長條中延伸出一個箭頭指向這個新加入的clip長條。

unity_animator_controller_2.png
unity_animator_controller_3.png

實際上,Animator Controller是一個“狀態(tài)機(jī)”(關(guān)于狀態(tài)機(jī)的解釋可以看這里),而Animator面板則將這個狀態(tài)機(jī)的設(shè)計工作“可視化”了。我們后面會學(xué)習(xí)到的PlayMaker也是一個基于狀態(tài)機(jī)的交互設(shè)計插件。

這些不同顏色的“長條”代表不同的“狀態(tài)”,“箭頭”則代表狀態(tài)可以從一端變化到另一端。所以上面這樣圖可以這樣解釋:當(dāng)該物體“進(jìn)入”場景時,物體動畫狀態(tài)變?yōu)?code>WALK00_F,也就是“一經(jīng)載入,模型播放WALK00_F動畫”的意思。

點擊WALK00_F,我們可以看到與在Project面板中點擊WALK00_F動畫片段文件時不同的Inspector面板顯示內(nèi)容:

unity_animator_controller_4.png

在這里我們可以設(shè)置這個“動畫狀態(tài)”下播放哪個動畫片段(Motion),用什么速度(Speed)來播放,要不要把動畫倒放(Mirror)等等。

在Project面板中點擊WALK00_F動畫片段文件時Inspector面板顯示的內(nèi)容是這樣的:

顯示成灰色是因為我點擊的是fbx文件中包含的clip,所以不可編輯,我們可以Ctrl+D將其復(fù)制成單獨的clip文件,然后再修改。

如何使用Animator Controller設(shè)計動畫切換邏輯,可以閱讀《設(shè)計角色動畫切換邏輯》(未完成)一文中的詳細(xì)介紹。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容