前言:作爲一個遊戲開發,難免要跟圖片打交道,想讓圖片動起來就得導入動畫了,如果遇到一個好說話的美工往往程序事半功倍,但是公司往往不遂人願。誰也不願意多加班,就是爲了美工做還是程序做而傷腦筋,所以導入動畫的時候很多讓美工改動工作量”所謂大“就讓程序改了,這也是爲什麼需要學好動畫的原因,永遠不知道下一個美工是個什麼水平。
一 龍骨動畫。//幀動畫,spine動畫以後有機會再補充。
1.首先,在用龍骨動畫的時候,得導入龍骨動畫的插件。相當於庫支持吧。
https://pan.baidu.com/s/1hsEOy7y 密碼: jvpe //如果掛了或者沒有資源可以回覆我。
2. 然後美工給我們的圖一般包含三個文件
然後導入unity中,右鍵ske.json這類文件新建一個Data
這樣就得到這個配置文件。
3.龍骨動畫的兩種簡單運用
(1)直接在需要的組件上附加 unity Armature Component,然後將配置文件拖入到DragonBones Data;點擊隨後出來的Create按鈕,然後點保存全部。
然後在這個界面就可以調節。默認動畫是<None>狀態。
(2)往往(1)中方法不能滿足所有要求和優化//有的美工即使都是龍骨動畫也要不同的處理,美工動畫開始的界面會掩蓋精靈圖片。
這樣我們創建一個空的gameObject;按(1)中方法弄好配置文件。然後加入以下寫好的腳本。拖入資源文件夾變成一個預製體。
以上都是簡單的入門,接下來纔是我要寫這篇文章的重點。以免我以後忘了在得看源碼找半天。
4.龍骨動畫的代碼控制。
1)龍骨動畫需要引入using DragonBones;
2) 獲取龍骨動畫。
public UnityArmatureComponent thisArmature;
直接在unity中託給他複製或者
thisArmature=this.GetComponent<UnityArmatureComponent>();
3)播放動畫。
thisArmature.animation.Play("fall");
//"fall"爲這個動畫組件的動畫名字,一個動畫可能包含多個動畫。
animation.Play("fall",1);//第二個參數爲播放次數,默認爲循環。
4)動畫的回調(監聽事件)
thisAnimation.AddEventListener(EventObject.LOOP_COMPLETE,ArmatureEnd);
其中EventObject.LOOP_COMPLETE爲播放完一次動畫的回調,還有
EventObject.START爲一個動畫開始的時候的回調,還有淡入淡出等,詳情可以點進EventObject查看。
第二個參數爲自己寫的需要回調的函數,形式如下:
private void ArmatureEnd(string type, EventObject baseObject)
(其中type表示之前寫的EventObject.LOOP_COMPLETE;baseObject表示這個動畫的參數信息,這兩個參數都沒有什麼用)
只要在每個監聽都不調用同一個方法,就不需要判定type;直接控制thisAnimation即可。
thisAnimation.animation.lastAnimationName回調函數裏面通過這個來判斷是那在動畫在播放到回調函數。
5.動畫的播放控制
* 從指定時間開始播放動畫。
* @param animationName 動畫數據的名稱。
* @param time 開始時間。 (以秒爲單位)
* @param playTimes 播放次數。 [-1: 使用動畫數據默認值, 0: 無限循環播放, [1~N]: 循環播放 N 次]
* @returns 對應的動畫狀態。
public AnimationState GotoAndPlayByTime(string animationName, float time = 0.0f, int playTimes = -1)
相應的還有從指定幀,指定進度開始播放。
* 將動畫停止到指定的時間。
* @param animationName 動畫數據的名稱。
* @param time 時間。 (以秒爲單位)
* @returns 對應的動畫狀態。
public AnimationState GotoAndStopByTime(string animationName, float time = 0.0f)
相應的還有停止到指定幀,指定進度。
自己測試的時候就是停止那一幀,而不是播放到那一幀。很坑。
還有一種播放方式,即不用默認的,通過自己配置來播放
比如
AnimationConfig ac = thisAnimation.animation.animationConfig;
ac.duration = stayAnimationTime; //持續時間
ac.name = animationName; //播放的名字
ac.playTimes = 1; //播放次數
thisAnimation.animation.PlayConfig(ac);
上一段表示將該動畫從0秒開始播放到stayAnimationTime秒停止在那一刻。
相關的配置參數可以在AnimationConfig查看。
這個停止那一刻會直接跳轉到<None>狀態,即
thisAnimation.animation.isPlaying == false;
6.龍骨動畫的補充
thisAnimation.Alpha控制透明度。
thisAnimation.timeScale控制播放速度。
還有一個很坑的控制翻轉不是thisAnimation.flipX或者thisAnimation.flipY
而是thisAnimation._armature._flipX = true;
而thisAnimation.flipX這個改了沒啥用。
龍骨動畫還有很多坑,以後再來補充。之前遇到的幀動畫,spine動畫的坑有時間再來補充咯。
第二章就到這裏了。
2018.1.10更新幀動畫
二、幀動畫。
1.幀動畫不需要庫支持。
幀動畫分爲
動畫控制器(Window->Animator),
動畫(Window—>Animation).
2.創建幀動畫。
1)沒有遊戲對象時
直接全選所有幀動畫的對象拖到場景中,例如:
會自動創建一個動畫控制器
場景就有一個包括動畫控制機的對象。
2)在一個對象上附加動畫
點擊該對象。在Animation新建一個動畫。
會在該對象自動有一個動畫控制機,其中包含剛剛新建的動畫
一個動畫控制器上添加多個動畫
3.動畫控制器
動畫控制分動畫層,還有控制動畫的參數。
不同動畫可以在不同的層同時播放,參數用來控制動畫的連接條件。
連線表示可以連接的動畫的條件,比如圖中默認是Fly動畫,但任何動畫滿足條件都可以下次播放到fly或者死亡動畫。其中連線的條件在:
這裏的isDeath就是我創建的一個bool值滿足了他等ture就會通過。
其中Has Exit Time表示上個動畫是否播放完,打鉤表示等待播放完,不打鉤表示直接跳轉過來。
單個動畫的循環與只播放一次在單個動畫上
4.代碼控制
gameObject.GetComponent<Animator>().SetBool("isDeath", false);
表示將之前的bool值isDeath改爲false;
同理還有setFloat,setInteger等。
每一幀執行的還有幀事件:
在動畫幀上面郵件添加一個幀事件
這個幀事件可以執行相應腳本上的函數,每次播到這裏就執行。
如果不用邏輯控制,可以直接play(“”“”)相應的名字來控制動畫,遇到一個gameobject上面太多動畫的時候,邏輯麻煩,可以直接用代碼強制播放其中的一個動畫