本期教程和大家分享Mecanim動畫系統的重定向特性,Mecanim動畫系統是Unity3D推出的全新的動畫系統,具有重定向、可融合等諸多新特性,通過和美工人員的緊密合作,可以幫助程序設計人員快速地設計出角色動畫。一起跟著人氣博主秦元培學習吧!
博主今天想和大家分享的是Mecanim動畫系統的重定向特性,眾所周知,《仙劍奇俠傳》是一部經典的RPG游戲,這部游戲到今天依然煥發著強大的生命力。博主在網上認識了一個制作《仙劍奇俠傳》同人游戲的小團隊,他們目前正在著手制作一個稱為《仙劍奇俠傳五外傳:心愿》的同人游戲,該游戲基于Unity3D,由于技術上的一致性,博主向他們索取了一些游戲素材,而這成為了博主決心要研究Mecanim動畫系統的一個主要原因。如圖是《仙劍奇俠傳五前傳》中瑕的一個模型:
拿到這個模型的時候,博主發現這個模型的所有動畫都是放在一個AnimationClip中的,所以博主果斷將這個動畫文件進行了分割,分割的方法是在資源目錄中找到這個AnimationClip,然后在右側的屬性窗口中選擇Animations選項卡中通過+號來新建一個AnmationClip,在指定了起點幀數和終點幀數后就實現對動畫的分割。如圖示博主經過分割后的動畫文件列表:
可以看到這里博主將一個動畫片段分割成了4個動畫片段,這樣我們就可以通過Animation組件來實現對動畫的播放。而這正是在Mecanim動畫系統推出之前Unity3D采用的動畫控制形式。由于這個模型在建模的時候存在問題,所以導致瑕在游戲場景中的角度出現錯誤,博主只好自己用3D建模軟件進行調整,結果意外得發現瑕的模型中是有骨骼的,博主忽然間想到了一個問題,是否可以利用Mecanim動畫系統來為這個模型添加動畫呢?答案是肯定的。由于這個模型在建模的時候將動畫和模型一起創建了,因此我們需要首先將這個動畫從模型中去除,因為Mecanim動畫系統的一個主要思路就是讓一套動畫可以通過重定向應用到不同的模型上,既然有動畫可用,那么模型自帶的動畫可以暫時去除。而讓動畫從模型中去除的方法很簡單,就是在導出FBX模型的時候將嵌入的媒體選項不要勾選,這樣我們的模型就可以和動畫分離開了,經過這一步后,我們正式開始Mecanim動畫系統的講解。要理解Mecanim動畫系統,首先需要了解這樣幾個概念:
一、Avater,即阿凡達,這是Mecanim動畫系統中實現動畫綁定的一個接口,該接口可以實現骨骼和肌肉系統的匹配,從而保證角色在執行動畫的時候,角色能夠按照預先設定的動畫來運動。我們首先在項目資源窗口中找到了模型文件,如圖:
我們注意到在右側的屬性窗口中有三個選項卡:Model、Rig、Animations。這里我們選擇Rig選項卡,將Animation Type設為Humanoid,即雙足類型的動畫。這種類型可以支持大多數的類人形的模型。此外,Lagacy類型用來兼容Unity3D低版本中的模型動畫,Generic類型是一種介于人形和非人形的模型之間的通用類型。我們選擇Humanoid類型后,在下方選擇生成Avater的類型誒Create Form This Model,即通過當前的模型來生成一個Avater。此時,Configure按鈕由不可用狀態變成可用狀態,我們點擊該按鈕,如果我們沒有保存游戲場景的話,此時Unity3D會提示我們保存場景,我們直接選擇保存,接下來回打開一個新的場景,如圖:
此時場景中會顯示模型的骨骼結構,對應地,在右側窗口中顯示了該模型主要的身體結構,可以看到此時右側窗口中所有的點都是以綠色顯示的,這表示當前模型的骨骼關節和模型匹配正確。此時,我們可以切換到Muscles選項卡中,這是我們可以通過拖動滑塊來檢查模型匹配是否正確。在使用Avater的時候,有兩點需要注意:
1、如果模型建模沒有嚴重的錯誤的話,可以通過窗口底部的Mipping->AutoMap來實現對模型的自動匹配,這一點可以提高工作效率,但是作為一名有節操的開發人員,我們絕不能過度地依賴于這一功能。
2、當在手動調整模型匹配時,如果提示T-Pose錯誤,可以通過Pose->Enforce T-Pose來實現強制轉化,博主最近才開始學習游戲建模,所以這里可能暫時無法解釋清楚,大家就作為經驗之談來看吧。
確認模型匹配沒有什么問題后,點擊Done完成編輯。
二、AnimatorController:如果說Avater是將模型的身體和骨骼實現匹配的接口,那么AnimatorController就是講動畫和模型實現綁定的接口。我們這里創建一個XiaAnimaterController。雙擊該文件,會打開Animator窗口,如圖:
博主這里不想詳細介紹關于Unity3D動畫系統中的狀態機和混合樹等概念,因為這些概念現在解釋起來實在困難,博主打算放在下一篇文章中來詳細的講解Mecanim動畫的狀態機和混合樹的概念。今天我們只是對Mecanim動畫系統做一個初步的了解,因為要想徹底理解這個動畫系統,絕非一朝一夕之功啊。博主在這里創建了6種動畫狀態,并通過帶箭頭的線條將它們連了起來。博主這里想實現什么功能呢?博主希望在一定條件下可以觸發相應的條件,當出發結束后立即回到默認的狀態,這里默認的狀態是Idle。估計大家到這里會有點混亂,博主前面不是說這個模型沒有動畫的嘛,那么這個的動畫是哪里來的呢?對此,博主這里做一下解釋啊,博主在創建這個項目之前呢,提前準備了一個叫做WomanKnightAnimationPack的動畫包,它提供了游戲中常用的動畫,我們這里就是要通過Mecanim的重定向功能將這個動畫運用到我們的模型上去,這個動畫包可以從官方的資源商店中下載。好了,現在我們來講解怎么講動畫和模型綁定,我們單擊默認的Idle動畫,在窗口右側將會顯示如下內容:
通過Motion文本框我們可以為當前的狀態綁定一種動畫,選中Foot IK和Mirror這兩個選項,似乎可以解決角色在行走或者奔跑過程中出現的問題,可是博主在查API文檔的時候并沒有找到相關的解釋,如果有朋友知道的話,希望可以告訴博主啊。類似地,我們可以為不同的狀態綁定一個動畫片段,可是問題馬上又來了,我們如何按照游戲策劃在適當地時候播放相應的動畫呢?這就是動畫的觸發問題了,博主請大家想一想有限狀態機的概念,如果不知道這個概念的,請自行了解,這是游戲設計中非常重要、非常有用的一個概念。我們知道在有限狀態機中,無論我們使用switch-case結構還是if-else結構,都需要一個狀態值來作為判斷的依據,那么在Mecanim中這個原則依然適用。因為,Mecanim動畫系統就是基于狀態機的。好了,下面我們來創建一個狀態值。如圖,
在Mecanim動畫系統中提供了四種類型的狀態值,分別是Float、Int、Bool、Trigger,其中Trigger和OnTrigger()方法可以聯用,實現觸發式播放動畫。好了,現在我們創建一個整型的狀態值,默認值為0。我們首先選中Idle->Walk這條路線,在右側的窗口中將參數設為ActionID,將值設為1,將方法設為Equals,其含義是當ActionID的取值為1時將執行Walk動畫。同樣地,我們將Walk->Idle這條路線選中,設將參數設為ActionID,將值設為0,將方法設為Equals,其含義是當ActionID的取值為1時將執行Idle動畫。其余的動畫狀態參數和Walk設置方法相同,從Idle出發的線路依次為1,2,3,4,5,指向Idle的路線全部為0。現在我們將這個AnimatorController指定給場景中的模型,如圖:
此時我們運行程序,由于我們已經為瑕指定了默認的動畫,于是我們將看到:
雖然這個動畫和我們的瑕妹子搭配得有點違和,但是我們已經初步掌握了使用Mecanim動畫系統的方法,好了,下面我們來編寫一段腳本來控制人物切換動畫,因為只有默認動畫是沒有什么實際用途的:
最后我們一起來看實際的效果吧!
場景中的地形由Unity3D自帶的地形工具創建,其實博主是想搭建一個《仙劍奇俠傳五前傳》中的云來石的場景,因為博主堅信,憑借瑾軒的智慧怎么會想不到在和瑕雙雙墜崖后召喚云來石呢,所以博主堅信他們倆都沒有死,因為暮姐最后回眸的一瞬間表情是喜悅的,而背后傳來了一急一慢兩種腳步聲,所以結局大家可以自己去想象啦。在同人游戲《仙劍奇俠傳五后傳:心愿》中他們策劃的劇情和博主的基本一致,或許這就是《仙劍奇俠傳》系列游戲之所以能讓博主一直愿意樂觀下去、努力下去的原因吧,我們都是普通人,可是我們并不是因為普通而普通,而是我們選擇了不作為。以前博主聽說過一款由仙劍玩家發起的游戲《仙劍奇俠傳四:回到起點》,當時看到游戲的宣傳動畫時激動了好一陣子,可是到了后來這部游戲因為制作團隊的解散而宣布停止,這似乎總讓人想起上海軟星的過去。細心的朋友一定發現了博主使用的素材是仙劍四中的模型,可以發現這個模型是較為簡陋的,樹木基本上是紙片拼成的,影子是在模型里創建的,當年弓長君帶領上軟制作仙劍三、仙劍三外傳、仙劍四的艱難程度可窺一斑。不過目前由上軟核心骨干組成的上海燭龍已經從當年的困境中走了出來,成為和大宇雙劍抗衡的第三把劍。為何博主總是鐘情于劍呢?因為劍的傳說,直到永恒。