大家好,我是秦元培,歡迎大家關注我的部落格,我的部落格地址是blog.csdn.net/qinyuanpei。博主總算趕在這個月底寫出了這篇文章。這個月因為期末考試一直沒時間研究太多關於技術方面的東西,雖然部落格一直在更新,可是對於文章的品質博主還是有一個很清楚的認識的。那麼,作為這個月的最後一篇文章,今天博主想和大家分享的是關於Unity3D中的Mecanim動畫系統。博主很早就想寫這篇文章了,可是由於各種原因一直沒有機會去深入地研究這個問題,這幾天考完試時間變得寬裕起來,所以博主就花時間研究了下這個問題。Mecanim動畫系統是Unity3D推出的全新的動畫系統,具有重新導向、可融合等諸多新特性,通過和美工人員的緊密合作,可以協助程式設計人員快速地設計出角色動畫。
今天文章的標題叫做《Unity3D遊戲開發之當仙劍遇上Mecanim動畫系統》,為什麼取這樣一個題目呢?因為博主今天想和大家分享的是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動畫系統的方法,好了,下面我們來編寫一段指令碼來控制人物切換動畫,因為只有預設動畫是沒有什麼實際用途的:
using UnityEngine;using System.Collections;public class MecanimController : MonoBehaviour {//Mecanim動畫組件private Animator mAnim;void Start () {mAnim=GetComponent<Animator>();}void Update () {//如果按下W則步行前進if(Input.GetKey(KeyCode.W)){//播允許存取走動畫mAnim.SetInteger("ActionID",1);transform.Translate(Vector3.forward * 2.5f * Time.deltaTime);}//如果按下Shift+W則跑步前進if(Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.LeftShift)){//播放奔跑動畫mAnim.SetInteger("ActionID",2);transform.Translate(Vector3.forward * 2.5f * Time.deltaTime);}//如果按下I,則播放攻擊動畫1if(Input.GetKey(KeyCode.I)){//播放攻擊動畫1mAnim.SetInteger("ActionID",3);}//如果按下J,則播放攻擊動畫2if(Input.GetKey(KeyCode.J)){//播放攻擊動畫2mAnim.SetInteger("ActionID",4);}//如果按下K,則播放攻擊動畫3if(Input.GetKey(KeyCode.K)){//播放攻擊動畫3mAnim.SetInteger("ActionID",5);}//如果鬆開各鍵位,則還原為Idle狀態if(Input.GetKeyUp(KeyCode.W) || Input.GetKeyUp(KeyCode.I) || Input.GetKeyUp(KeyCode.J) || Input.GetKeyUp(KeyCode.J) || Input.GetKeyUp(KeyCode.K) || Input.GetKeyUp(KeyCode.LeftShift)){ //播放待機動畫 mAnim.SetInteger("ActionID",0);}}}
最後我們一起來看實際的效果吧!
情境中的地形由Unity3D內建的地形工具建立,其實博主是想搭建一個《仙劍奇俠傳五前傳》中的雲來石的情境,因為博主堅信,憑藉瑾軒的智慧怎麼會想不到在和瑕雙雙墜崖後召喚雲來石呢,所以博主堅信他們倆都沒有死,因為暮姐最後回眸的一瞬間表情是喜悅的,而背後傳來了一急一慢兩種腳步聲,所以結局大家可以自己去想象啦。在同人遊戲《仙劍奇俠傳五後傳:心愿》中他們策劃的劇情和博主的基本一致,或許這就是《仙劍奇俠傳》系列遊戲之所以能讓博主一直願意樂觀下去、努力下去的原因吧,我們都是普通人,可是我們並不是因為普通而普通,而是我們選擇了不作為。以前博主聽說過一款由仙劍玩家發起的遊戲《仙劍奇俠傳四:回到起點》,當時看到遊戲的宣傳動畫時激動了好一陣子,可是到了後來這部遊戲因為製作團隊的解散而宣布停止,這似乎總讓人想起上海軟星的過去。細心的朋友一定發現了博主使用的素材是仙劍四中的模型,可以發現這個模型是較為簡陋的,樹木基本上是紙片拼成的,影子是在模型裡建立的,當年弓長君帶領上軟製作仙劍三、仙劍三外傳、仙劍四的艱難程度可窺一斑。不過目前由上軟核心骨幹組成的上海燭龍已經從當年的困境中走了出來,成為和大宇雙劍抗衡的第三把劍。為何博主總是鐘情於劍呢?因為劍的傳說,直到永恒。好了,謝謝大家關注我的部落格,今天的內容就是這樣了,希望大家喜歡啊,呵呵。
學習Mecanim動畫系統推薦視頻地址:http://www.tudou.com/programs/view/Ul78LC6rukI/
每日箴言:事情並不是因為難而讓我們不敢做,而是因為我們不敢做事情才變得難.
喜歡我的部落格請記住我的名字:秦元培,我部落格地址是blog.csdn.net/qinyuanpei。
轉載請註明出處,本文作者:秦元培,本文出處:http://blog.csdn.net/qinyuanpei/article/details/35330525