溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Unity3D中模型動(dòng)畫的使用分析

發(fā)布時(shí)間:2021-11-11 09:33:14 來(lái)源:億速云 閱讀:441 作者:柒染 欄目:游戲開(kāi)發(fā)

今天就跟大家聊聊有關(guān)Unity3D中模型動(dòng)畫的使用分析,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

如何導(dǎo)入一個(gè)模型,導(dǎo)入的模型在unity3d的project面板中是怎樣顯示的?包含什么內(nèi)容?如何加載到場(chǎng)景中?怎樣去控制它?模型和動(dòng)畫之間的關(guān)系?

【模型導(dǎo)入】:

Unity可以讀取fbx,dae,3ds,dxf,obj等格式的文件,可以在這里找到FBX導(dǎo)出器,

http://usa.autodesk.com/fbx/

每一個(gè)被導(dǎo)入的項(xiàng)目中的模型,都包含下面這些東西:

Meshes 網(wǎng)格,每個(gè)模型都是由無(wú)數(shù)的三角面組合而成

相關(guān)選項(xiàng):

Scale Factor 縮放系數(shù) 調(diào)整模型的比例

Use File Units 使用此文件單位 只適用于3dsMax文件,啟用時(shí)1Max=1Unity,否則1厘米Max=1Unity

Mesh Compression 網(wǎng)格壓縮 在差異允許的范圍內(nèi),盡量調(diào)高這個(gè)值

Mesh Optimization 網(wǎng)格優(yōu)化 決定網(wǎng)格中的三角形排列順序

Generate Colliders 生成碰撞體 是否生成網(wǎng)格碰撞體

Swap UVs 交換UV 當(dāng)有光照貼圖的物體的UV通道不正確時(shí)啟用此選項(xiàng)

Generate Lightmap UVs 產(chǎn)生光照貼圖UV 為光照貼圖創(chuàng)建第二個(gè)UV通道

Normals & Tangents 法線和切線,這主要是用來(lái)描述三角面朝向用的,可以應(yīng)用在裁切(只顯示正面,不顯示背面)光照上

相關(guān)選項(xiàng):

Normals 法線 默認(rèn)導(dǎo)入法線,可選Calculate根據(jù)平滑度計(jì)算法線,也可禁用

Tangents 切線 當(dāng)啟用法線時(shí),切線才有作用,默認(rèn)為自動(dòng)計(jì)算,可以選擇導(dǎo)入和禁用

Smoothing Angle 平滑角 設(shè)置邊角的平滑程度,用來(lái)切分法線貼圖切線?

Split Tangents 分離切線 如果您的網(wǎng)格上的接縫破壞了法線貼圖光照,啟用此選項(xiàng)。這通常只適用于角色

Materials 材質(zhì),主要是描述顏色,在各種光照效果下的顯示,以及上面的貼圖!

相關(guān)選項(xiàng):

Import Materials 導(dǎo)入材質(zhì) 禁用則所有材質(zhì)為漫反射

Material Naming 材質(zhì)命名 貼圖名,材質(zhì)名,模型-材質(zhì)名等等命名方式

Material Search 材質(zhì)搜索 決定如何根據(jù)材質(zhì)命名查找已有的材質(zhì)

Animations 動(dòng)畫,如果這個(gè)文件附帶了動(dòng)畫的話,可以在這里看到

相關(guān)選項(xiàng):

Generation 生成 控制動(dòng)畫的導(dǎo)入,以及動(dòng)畫存儲(chǔ)的位置(Root還是Node)

Bake Animations 烘焙動(dòng)畫 用于使用了IK的動(dòng)畫

Animation Wrap mode 動(dòng)畫循環(huán)模式 

Split Animations 分割動(dòng)畫

Anim.Compression 動(dòng)畫壓縮的方法

Anim.Compression.Errors 當(dāng)壓縮關(guān)鍵幀的時(shí)候,設(shè)置誤差控制

需要注意的是!我們導(dǎo)入的模型,并不包含貼圖,要導(dǎo)入一個(gè)模型需要同時(shí)導(dǎo)入模型材質(zhì)用到的貼圖! u3d搜索貼圖的規(guī)則是模型所在路徑下的Textures文件夾,然后逐步搜索上級(jí)目錄的Textures文件夾,搜索不到就進(jìn)行全局搜索(慢,而且當(dāng)兩張紋理同名的話,可能會(huì)找錯(cuò))

每一個(gè)導(dǎo)入的材質(zhì),Unity使用下列規(guī)則:

1. 如果禁用了導(dǎo)入材質(zhì)選項(xiàng),所有材質(zhì)默認(rèn)為漫反射材質(zhì)

2. 根據(jù)材質(zhì)名設(shè)置為Unity的材質(zhì)名

3. 在已有的材質(zhì)中尋找名字相同的材質(zhì)

4. 找到該材質(zhì)則直接賦給對(duì)象,否則生成新的材質(zhì)

Unity提供了兩種碰撞器,一種Mesh Colliders 網(wǎng)格碰撞器,可以精確地檢測(cè)碰撞,而Primitive Colliders 原始碰撞器,雖然沒(méi)有前者精確,但效率高很多,應(yīng)該盡量使用這種

如果你有一個(gè)從高精度多邊形版本生成的帶法線貼圖的角色,你應(yīng)該以180度的平滑角度(Smoothing angel)導(dǎo)入此角色的游戲質(zhì)量版本。這將防止由于切線切割在光照中產(chǎn)生的奇怪的接縫。如果在應(yīng)用了這些設(shè)置后仍然存在接縫,啟用在UV接縫處分割切線選項(xiàng)(Split tangents across UV seams)。

【動(dòng)畫導(dǎo)入】

Maya的.mb,.ma文件,Cinema 4D的c4d文件和fbx文件都支持導(dǎo)出動(dòng)畫,當(dāng)我們導(dǎo)入這些模型的時(shí)候,可以順帶導(dǎo)入動(dòng)畫

1.分割動(dòng)畫 使用動(dòng)畫分割導(dǎo)入動(dòng)畫,所有的動(dòng)作都放在同一個(gè)模型中,最為節(jié)省資源,導(dǎo)入模型的時(shí)候,分割動(dòng)畫會(huì)被自動(dòng)導(dǎo)入,可以在拆分動(dòng)畫表中看到所有的動(dòng)畫片段

2.@動(dòng)畫 創(chuàng)建單獨(dú)的模型文件,并按照"模型名"@"動(dòng)畫名".fbx這樣的格式命名,導(dǎo)入模型文件時(shí),Unity會(huì)自動(dòng)導(dǎo)入該模型相關(guān)的動(dòng)畫文件,在導(dǎo)出這樣的文件時(shí),單獨(dú)導(dǎo)出模型,另外再導(dǎo)出所有動(dòng)作的剪輯。

3.反向動(dòng)力學(xué) 設(shè)置烘焙IK和仿真箱????

【動(dòng)畫腳本】

動(dòng)畫腳本的相關(guān)接口 http://game.ceeger.com/Script/Animation/Animation.html

如果想播放一個(gè)簡(jiǎn)單的動(dòng)畫,可以使用Animation.Play;
如果想在動(dòng)畫之間交叉淡入,可以使用Animation.CrossFade;
如果想改變動(dòng)畫模式(循環(huán),一次,乒乓),可以改變動(dòng)畫導(dǎo)入設(shè)置里面的動(dòng)畫幀的WrapMode,或者在運(yùn)行時(shí)改變AnimationState.wrapMode的值;
AnimationState可以用于改變動(dòng)畫的層,修改播放速度,并且直接控制融合與混合。

動(dòng)畫疊加,混合,分層等等——參考u3d的hello world——angrybots

Animation是一個(gè)組件,可以被添加到GameObject上,當(dāng)我們把腳本掛載到一個(gè)GameObject上的時(shí)候,可以通過(guò)animation成員變量來(lái)訪問(wèn)掛載在它身上的動(dòng)畫,動(dòng)畫的方法有這些

  • Animation

    • AddClip添加剪輯

    • animateOnlyIfVisible可見(jiàn)時(shí)動(dòng)畫

    • animatePhysics是否物理動(dòng)畫

    • Blend混合

    • clip剪輯

    • CrossFadeQueued淡入淡出隊(duì)列

    • CrossFade淡入淡出

    • cullingType消隱類型

    • GetClipCount獲取剪輯數(shù)

    • IsPlaying是否在播放?

    • isPlaying是否在播放?

    • localBounds本地邊界框

    • playAutomatically自動(dòng)播放

    • PlayQueued播放隊(duì)列

    • Play播放

    • RemoveClip移除剪輯

    • Rewind倒回

    • Sample采樣

    • Stop停止

    • SyncLayer同步層

    • this [string name]操作名字

    • wrapMode循環(huán)模式

動(dòng)畫融合:

    用于確保角色的平滑動(dòng)畫,當(dāng)我們?cè)谟螒蛑幸獜囊粋€(gè)動(dòng)畫過(guò)渡的另外一個(gè)動(dòng)畫,我們不希望這兩個(gè)動(dòng)作之間是突然跳轉(zhuǎn),而希望平滑地過(guò)渡。

    我們使用CrossFade("animate name")來(lái)平滑地切換到另外一個(gè)動(dòng)畫(這中間可能是做了一個(gè)補(bǔ)間動(dòng)畫)

動(dòng)畫層:

    層允許群組動(dòng)畫和優(yōu)先級(jí)別,動(dòng)畫之間的過(guò)渡,可以用CrossFade或者指定手工融合權(quán)重來(lái)自動(dòng)處理動(dòng)畫的權(quán)重,當(dāng)兩個(gè)動(dòng)畫的權(quán)重都是100%,Unity生成最終動(dòng)畫會(huì)規(guī)格化權(quán)重,這意味著兩者都占50%的權(quán)重,但在考慮優(yōu)先級(jí)的情況下,需要設(shè)置哪個(gè)動(dòng)畫的權(quán)重更高,還要確保權(quán)重之和為100%,使用層的話會(huì)容易很多。

    要做到這點(diǎn)最簡(jiǎn)單的方法是在射擊時(shí)簡(jiǎn)單的保持行走和空閑動(dòng)畫,然后我們需要確保射擊動(dòng)畫比空閑和行走動(dòng)畫在更高的層。這意思是射擊動(dòng)畫將首先接收融合權(quán)重。行走和空閑動(dòng)畫僅當(dāng)射擊動(dòng)畫不使用融合權(quán)重100%時(shí),接收權(quán)重。因此,交叉淡入淡出射擊動(dòng)畫時(shí),權(quán)重將從0開(kāi)始很短時(shí)間內(nèi)變?yōu)?00%,在開(kāi)始時(shí)步行和空閑層仍然會(huì)收到融合權(quán)重,但當(dāng)射擊動(dòng)畫完全切入時(shí),它們不再接收權(quán)重,這正是我們所需要的!

function Start () {
   // Set all animations to loop
   animation.wrapMode = WrapMode.Loop;
   // except shooting
   animation["shoot"].wrapMode = WrapMode.Once;

   // Put idle and walk into lower layers (The default layer is always 0)
   // This will do two things
   // - Since shoot and idle/walk are in different layers they will not affect
   //   each other's playback when calling CrossFade.
   // - Since shoot is in a higher layer, the animation will replace idle/walk
   //   animations when faded in.
   animation["shoot"].layer = 1;

   // Stop animations that are already playing
   //(In case user forgot to disable play automatically)
   animation.Stop();
}

function Update () {
   // Based on the key that is pressed,
   // play the walk animation or the idle animation
   if (Mathf.Abs(Input.GetAxis("Vertical")) > 0.1)
      animation.CrossFade("walk");
   else
      animation.CrossFade("idle");

   // Shoot
   if (Input.GetButtonDown ("Fire1"))
      animation.CrossFade("shoot");
}
Animation Playback and Sampling 動(dòng)畫播放和取樣:
    取樣這個(gè)詞可能不大好理解,取樣在Unity里面是涉及到渲染的一個(gè)術(shù)語(yǔ),就是對(duì)像素取樣來(lái)進(jìn)行綜合運(yùn)算,我們的動(dòng)畫是在不斷運(yùn)動(dòng)的,將動(dòng)畫當(dāng)前的運(yùn)動(dòng)狀態(tài)提取出來(lái),并渲染到屏幕上,這是我理解的取樣。
    我們?cè)?ds Max或者M(jìn)aya等模型編輯工具中編輯一個(gè)動(dòng)畫,我們按照某個(gè)幀速率(FPS)來(lái)創(chuàng)建這個(gè)動(dòng)畫,在動(dòng)畫被導(dǎo)入到U3D的時(shí)候,這個(gè)幀速率也會(huì)被導(dǎo)入,所以會(huì)跟編輯器的速率保持一致。
    但我們游戲的運(yùn)行幀速率并不穩(wěn)定,可能有硬件的原因或者要渲染的對(duì)象,處理的邏輯復(fù)雜度不一樣,而導(dǎo)致的幀速率不穩(wěn)定,如果我們按照它設(shè)定的幀率來(lái)播放,動(dòng)畫就會(huì)一卡一卡的。Unity是在變化的幀頻中對(duì)動(dòng)畫進(jìn)行取樣,而不在制作時(shí)的幀頻。3D電腦圖形動(dòng)畫不是由分散的動(dòng)畫組成,而是連續(xù)的曲線。這些曲線可以讓我們?cè)谌魏螘r(shí)間點(diǎn)取樣,而不只是對(duì)應(yīng)某一個(gè)原始幀的時(shí)間點(diǎn)。這樣當(dāng)我們的電腦比較快的時(shí)候,動(dòng)畫將會(huì)更加地平滑和流暢。
    對(duì)于大多數(shù)的實(shí)際應(yīng)用,事實(shí)上Unity對(duì)變化幀速的采樣不是我們需要關(guān)切的,然而,如果你的某個(gè)游戲邏輯依賴于動(dòng)畫變換或?qū)傩缘膭?dòng)畫在一個(gè)非常特殊的配置,那必須知道這一點(diǎn)。例如,如果有一個(gè)動(dòng)畫是把一個(gè)物體30幀內(nèi)從0旋轉(zhuǎn)到180度,想從代碼中知道當(dāng)它已達(dá)到了一半,你不能寫一段條件語(yǔ)句來(lái)檢查現(xiàn)在旋轉(zhuǎn)值是不是90度。因?yàn)?nbsp;
Unity 依照游戲的變化速率來(lái)對(duì)動(dòng)畫取樣,它可能在旋轉(zhuǎn)快到90度時(shí)進(jìn)行取樣,或剛好過(guò)90度的時(shí)候取樣。當(dāng)在一個(gè)動(dòng)畫指定一個(gè)點(diǎn)到達(dá)時(shí),需要通知, 應(yīng)該使用AnimationEvent來(lái)代替。
    還要注意的變化幀速率采樣的結(jié)果,一個(gè)使用WrapMode.Once模式播放的動(dòng)畫的采樣不一定是精確的最后一幀。在游戲中很有可能是剛好結(jié)束前的某一幀,在下一幀時(shí)間可能超過(guò)動(dòng)畫的長(zhǎng)度,所以它被禁用,而不再采樣。如果需要?jiǎng)赢嫷淖詈笠粠泳_,你可以使用WrapMode.ClampForever。 
如在這種情況下,動(dòng)畫在這種情況下,動(dòng)畫將保持無(wú)限取樣最后一幀,直到你停止動(dòng)畫。

【動(dòng)畫視圖】

按下Ctrl+6,可以彈出動(dòng)畫編輯視圖,選擇Hierarchy面板上的任意對(duì)象,可以編輯它們的動(dòng)畫。

看完上述內(nèi)容,你們對(duì)Unity3D中模型動(dòng)畫的使用分析有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI