在上一篇,我們具體的講解了有關(guān)動(dòng)畫(huà)的融合,也提到了有關(guān)動(dòng)畫(huà)狀態(tài)的權(quán)重問(wèn)題。那么這次,我來(lái)以一個(gè)例子的形式來(lái)向大家講解動(dòng)畫(huà)的疊加,或許會(huì)涉及到多方面的知識(shí),我力求一次講清。好了,我們開(kāi)始吧!
CharacterAnimation這個(gè)工程中摳出了一個(gè):Soldier。然后我將其導(dǎo)入到了次工程文件夾下面的,然后簡(jiǎn)單的錯(cuò)了一個(gè)場(chǎng)景,取名為:AnimationAdditive,下圖就是我們的工程預(yù)覽:
然后我們新建一個(gè)名為CustomScripts的文件夾,用于存放我們接下來(lái)要建立的腳本文件。
我們此次的目的是要能夠在腳本中熟練運(yùn)用動(dòng)畫(huà)的疊加方法。那么什么是動(dòng)畫(huà)的疊加呢?所謂動(dòng)畫(huà)的疊加,就是指我們可以在任意動(dòng)畫(huà)上面來(lái)疊加動(dòng)畫(huà)效果。這就非常棒了,因?yàn)檫@項(xiàng)功能可以削減美術(shù)為游戲角色創(chuàng)建的動(dòng)畫(huà)片段的數(shù)量,既減小了工程所占用空間的大小,又對(duì)簡(jiǎn)化了我們的代碼編寫。官方舉了一個(gè)例子,大體上是這樣的:加入我們有一個(gè)角色,具備基本的“站立”,“跑步”,“左傾”,“右傾”的動(dòng)畫(huà),我們還想讓其在跑步圖中轉(zhuǎn)身時(shí)有一種傾斜的效果,比如左轉(zhuǎn)彎時(shí)不只是播放跑步的動(dòng)畫(huà),而且還疊加了一個(gè)左傾的(或者右傾的)動(dòng)畫(huà)。如果我們不用疊加,那么我們勢(shì)必會(huì)多創(chuàng)建兩個(gè)動(dòng)畫(huà)效果:“跑步時(shí)左傾”,“跑步時(shí)右傾”。一旦有了動(dòng)畫(huà)的疊加,我們根本就不需要去做這兩個(gè)動(dòng)畫(huà)片段,厲害吧!那么我們?cè)撛趺慈?shí)現(xiàn)這個(gè)呢?
我們首先要知道怎么去疊加動(dòng)畫(huà),為此,我們必須了解一下這個(gè)屬性:AnimationState.blendMode,即混合模式。此屬性的返回值類型為AnimationBlendMode ,我們看文檔:
這里只有兩個(gè)變量:Blend和Additive。在默認(rèn)狀態(tài)下,Animation組件所管理的每個(gè)動(dòng)畫(huà)狀態(tài)的混合模式都是:
AnimationBlendMode.Blend,即融合模式,我們只有在程序中才能對(duì)其進(jìn)行相應(yīng)的修改。如果你將此動(dòng)畫(huà)模式修改成了Additive,那么你的這個(gè)動(dòng)畫(huà)狀態(tài)就具備疊加到其他動(dòng)畫(huà)上的功能了,此時(shí)你只需動(dòng)態(tài)的調(diào)節(jié)這兩個(gè)動(dòng)畫(huà)狀態(tài)之間的權(quán)重就可以產(chǎn)生相應(yīng)的疊加動(dòng)畫(huà)了。下面我來(lái)編寫一個(gè)試驗(yàn)性的腳本來(lái)證明我們的猜想,我為這個(gè)腳本取名為:
AdditiveAnimaitonTest1,代碼如下:
using UnityEngine;
using System.Collections;
public class AdditiveAnimaitonTest1 : MonoBehaviour {
private AnimationState***n;
private AnimationState leanLeft;
void Start () {
animation.wrapMode = WrapMode.Loop;//聲明各動(dòng)畫(huà)狀態(tài)的播放方式為循環(huán)模式
***n = animation["***nSlow"];//實(shí)例化成員變量
leanLeft = animation["leanLeft"];
if ***n)
{
***n.weight = 1f;//設(shè)定動(dòng)畫(huà)狀***n的混合權(quán)重為1
***n.layer = 10;//讓這個(gè)動(dòng)畫(huà)狀態(tài)的layer為最高層10
***n.enabled = ***e;//啟用此動(dòng)畫(huà)狀態(tài)
}
if (leanLeft)
{
leanLeft.weight = 1f;
leanLeft.layer = 10;//讓此動(dòng)畫(huà)狀態(tài)***n為同一層,又由于此動(dòng)畫(huà)狀體的混合權(quán)重也為1,那么其獲得動(dòng)畫(huà)混合權(quán)重的幾率***n一樣
leanLeft.enabled = ***e;//啟用此動(dòng)畫(huà)狀態(tài)
leanLeft.blendMode = AnimationBlendMode.Additive;//將此動(dòng)畫(huà)狀態(tài)設(shè)定為疊加模式
}
}
void OnGUI()
{
GUILayout.BeginHorizontal();//利用拖動(dòng)條來(lái)控制每種動(dòng)畫(huà)狀體的權(quán)重
***n.weight = GUILayout.VerticalSlider***n.weight,1.0f,0.0f);
leanLeft.weight = GUILayout.VerticalSlider(leanLeft.weight, 1.0f, 0.0f);
GUILayout.EndHorizontal();
}
}
上面的代碼比較少,可是里面所涉及到的內(nèi)容卻并不那么容易理解。因?yàn)檫@次我們不是靠明顯代碼來(lái)播放動(dòng)畫(huà),而是依靠調(diào)節(jié)權(quán)重來(lái)實(shí)現(xiàn)的。為了理解這個(gè)方法的原理,我們必須明白一個(gè)結(jié)論:假如一個(gè)動(dòng)畫(huà)狀態(tài)被激活了,例如:animation["idle"].enable = ***e ,那么此動(dòng)畫(huà)就會(huì)處于播放狀態(tài)(此時(shí)沒(méi)有執(zhí)行類似:
animation.Play或者animation.CrossFade之類的語(yǔ)句)。不信的話你可以在上面的Start()函數(shù)中寫下以下語(yǔ)句:
if(animation.IsPlaying("idle")){
Debug.Log("idle is***nning!");
}
if(animation.IsPlaying("leanLeft ")){
Debug.Log(" leanLeft is***nning!");
}
我相信第二個(gè)if語(yǔ)句中的Debug會(huì)被打印出來(lái),而第一個(gè)則不會(huì),不信你試試。
好了,我們運(yùn)行一下游戲吧!

我們?cè)囍{(diào)節(jié)一下Game視圖中的垂直滾動(dòng)條,可以發(fā)現(xiàn),動(dòng)畫(huà)的效果改變了:

我想讀者一定按捺不住現(xiàn)在的心情了。我們成功的將左傾動(dòng)畫(huà)與跑步動(dòng)畫(huà)給疊加起來(lái)了,雖然例子很簡(jiǎn)單,但是我想我們應(yīng)該可以疊加更多的動(dòng)畫(huà)了。希望讀者能夠認(rèn)真體會(huì)。還有一點(diǎn),官方CharacterAnimation工程中的第四個(gè)場(chǎng)景中的代碼完整的展現(xiàn)了動(dòng)畫(huà)疊加的精髓,我的這個(gè)Solider就是從這個(gè)場(chǎng)景中摳出來(lái)的,感興趣的讀者不妨分析一下里面的代碼,保證獲益頗豐。如對(duì)本篇難以理解的不讓留個(gè)言,或者加qq:1597725465,本人一定親囊相受。下一篇,我準(zhǔn)備介紹一下“動(dòng)畫(huà)混合”,他是可以將某個(gè)動(dòng)畫(huà)片段加到角色的某個(gè)部位的,非常神奇,但也有一些限制因素。敬請(qǐng)期待我的下一篇文章!
免責(zé)聲明:本文僅代表作者個(gè)人觀點(diǎn),與納金網(wǎng)無(wú)關(guān)。其原創(chuàng)性以及文中陳述文字和內(nèi)容未經(jīng)本站證實(shí),對(duì)本文以及其中全部或者部分內(nèi)容、文字的真實(shí)性、完整性、及時(shí)性本站不作任何保證或承諾,請(qǐng)讀者僅作參考,并請(qǐng)自行核實(shí)相關(guān)內(nèi)容。