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


模型(Mesh)

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

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

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

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

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

普通3D模型導(dǎo)入U(xiǎn)nity3D

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

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

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

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

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

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

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

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

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

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

unity_model_import_02.png

這個(gè)模型素材來(lái)自: "Unity-chan"Model 1.1

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

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

關(guān)于比例

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

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

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

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

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

綁定(Rig)

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

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

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

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

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

unity_model_rig_avatar1.png

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

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

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

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

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

如果之前選擇的是Legacy方式的Rig,游戲物體會(huì)被自動(dòng)附上Animation組件。其中Animation參數(shù)也是空的(因?yàn)檫@個(gè)fbx模型本身是不帶動(dòng)畫(huà)的!)。

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


動(dòng)畫(huà)(Animation)

上面所使用的Unity-chan的素材,動(dòng)畫(huà)文件是和模型文件分開(kāi)的,如果選擇模型.fbx文件打開(kāi)Animations面板的話,看到的是一片空白:

大家如果也使用這個(gè)資源的話,可以在UnityChan > Animations目錄下找到帶動(dòng)畫(huà)的.fbx文件。

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

這個(gè).fbx文件實(shí)際上只包含動(dòng)畫(huà)數(shù)據(jù),之所以會(huì)有這些mesh出現(xiàn),是因?yàn)檫@些mesh上的動(dòng)畫(huà)并不是通過(guò)骨骼綁定來(lái)實(shí)現(xiàn)的,而是blendshape或者是直接transform動(dòng)畫(huà),所以必須保留動(dòng)畫(huà)數(shù)據(jù)所依附的節(jié)點(diǎn),也就是這些mesh。

而這個(gè)WALK00_F文件就是動(dòng)畫(huà)數(shù)據(jù)所存放的文件了(在硬盤(pán)上的文件后綴名是.anim)。

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

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

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

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

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

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

實(shí)際上,從設(shè)定clip的名稱(chēng)開(kāi)始,后面的所有設(shè)定都是針對(duì)某一個(gè)特定clip來(lái)做的詳細(xì)參數(shù),這里不細(xì)說(shuō)了。

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

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

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

Animator Controller (動(dòng)畫(huà)人控制器)

下面我們來(lái)讓這個(gè)模型能夠動(dòng)起來(lái)。

unity_animation_1.png

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

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

unity_animator_1.png

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

將這個(gè)AC拖到Animator組件的Controller一欄中,然后雙擊這個(gè)AC文件打開(kāi)Animator面板。

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

unity_animator_controller_1.png

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

unity_animator_controller_2.png
unity_animator_controller_3.png

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

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

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

unity_animator_controller_4.png

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

在Project面板中點(diǎn)擊WALK00_F動(dòng)畫(huà)片段文件時(shí)Inspector面板顯示的內(nèi)容是這樣的:

顯示成灰色是因?yàn)槲尹c(diǎn)擊的是fbx文件中包含的clip,所以不可編輯,我們可以Ctrl+D將其復(fù)制成單獨(dú)的clip文件,然后再修改。

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


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容