我們可以使用Unity自帶的資源來(lái)學(xué)習(xí)老版本的動(dòng)畫系統(tǒng),新建Unity3D項(xiàng)目,選擇菜單“Assets”->“Import Package”->“Character Controller”,導(dǎo)入的資源里的那個(gè)小人就是使用Legacy動(dòng)畫系統(tǒng)的模型,我們的學(xué)習(xí)可以基于他來(lái)進(jìn)行。
模型文件

在骨骼這一項(xiàng)中,我們發(fā)現(xiàn)動(dòng)畫類型的設(shè)置就是Legacy,說(shuō)明這個(gè)模型使用的動(dòng)畫類型為老版本的動(dòng)畫系統(tǒng)。
我們?cè)倏纯磩?dòng)畫頁(yè):

動(dòng)畫頁(yè)中,我們可以對(duì)動(dòng)畫剪輯進(jìn)行編輯。
控制動(dòng)畫
我們直接將FBX文件拖入場(chǎng)景,Unity會(huì)自動(dòng)幫我們添加Transform和Animation兩個(gè)組件(注意Mecanim動(dòng)畫系統(tǒng)使用的是Animator組件,Legacy動(dòng)畫系統(tǒng)使用的是Animation組件)。

Animation組件的設(shè)置還是比較簡(jiǎn)單的:
Animation:當(dāng)前播放的動(dòng)畫。
Animations:所有可以播放的動(dòng)畫。
Play Automatically:是否自動(dòng)播放。
Animate Physics:動(dòng)畫是否和物理世界進(jìn)行交互。
Culling Type:動(dòng)畫在不可見時(shí)是否還繼續(xù)播放,優(yōu)化選項(xiàng)默認(rèn)即可。
點(diǎn)擊播放按鈕就可以看見動(dòng)畫正常播放了。
animation組件用于播放動(dòng)畫;
如果想播放一個(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)畫的層,修改播放速度,并且直接控制混合與合成。
腳本控制
下面我們來(lái)看看如何使用腳本控制動(dòng)畫的播放,我們將下面的腳本綁定到人物身上即可。
using UnityEngine;
using System.Collections;
public class AnimationScript : MonoBehaviour
{
private Animation _animation;
void Start()
{
_animation = this.animation;
}
void OnGUI()
{
//直接播放動(dòng)畫
if(GUI.Button(new Rect(0, 0, 100, 30), "idle"))
{
_animation.Play("idle");
}
if(GUI.Button(new Rect(100, 0, 100, 30), "walk"))
{
_animation.Play("walk");
}
if(GUI.Button(new Rect(200, 0, 100, 30), "run"))
{
_animation.Play("run");
}
if(GUI.Button(new Rect(300, 0, 100, 30), "jump_pose"))
{
_animation.Play("jump_pose");
}
//使用融合來(lái)播放動(dòng)畫
if(GUI.Button(new Rect(0, 30, 100, 30), "idle"))
{
_animation.CrossFade("idle");
}
if(GUI.Button(new Rect(100, 30, 100, 30), "walk"))
{
_animation.CrossFade("walk");
}
if(GUI.Button(new Rect(200, 30, 100, 30), "run"))
{
_animation.CrossFade("run");
}
if(GUI.Button(new Rect(300, 30, 100, 30), "jump_pose"))
{
_animation.CrossFade("jump_pose");
}
}
}
運(yùn)行程序,會(huì)看見兩排按鈕,其中第一排按鈕使用Play方法來(lái)切換動(dòng)畫,而第二排按鈕則使用CrossFade來(lái)播放動(dòng)畫。
Play與CrossFade的區(qū)別
以從跑步切換到站立動(dòng)畫為例來(lái)看:
Play:直接切換動(dòng)畫,如果人物之前處于傾斜跑步狀態(tài),則會(huì)立即變成站立狀態(tài),表現(xiàn)上比較不真實(shí),特別是當(dāng)兩個(gè)動(dòng)畫姿勢(shì)差別較大時(shí)。
CrossFade:通過(guò)動(dòng)畫融合來(lái)切換動(dòng)畫,第二個(gè)參數(shù)可以指定融合的時(shí)間,如果人物之前處于傾斜跑步狀態(tài),則會(huì)在指定的融合時(shí)間內(nèi)逐漸變成站立狀態(tài),表現(xiàn)上接近真實(shí)的人物動(dòng)作切換效果。
但是當(dāng)使用CrossFade播放跳躍動(dòng)畫時(shí)會(huì)出現(xiàn)問(wèn)題,主要問(wèn)題是跳躍動(dòng)畫不是循環(huán)播放且其持續(xù)時(shí)間小于動(dòng)畫融合的時(shí)間,我們修改為下面的腳本指定融合時(shí)間短一點(diǎn)就可以正常進(jìn)行跳躍的融合播放了:
_animation.CrossFade("jump_pose", 0.1f);
PlayQueued
該方法可以指定當(dāng)當(dāng)前的動(dòng)畫播放完畢后接下來(lái)播放的動(dòng)畫,如下:
_animation.PlayQueued("run", QueueMode.CompleteOthers, PlayMode.StopSameLayer);