第二章 動畫

 前言:作爲一個遊戲開發,難免要跟圖片打交道,想讓圖片動起來就得導入動畫了,如果遇到一個好說話的美工往往程序事半功倍,但是公司往往不遂人願。誰也不願意多加班,就是爲了美工做還是程序做而傷腦筋,所以導入動畫的時候很多讓美工改動工作量”所謂大“就讓程序改了,這也是爲什麼需要學好動畫的原因,永遠不知道下一個美工是個什麼水平。

一 龍骨動畫。//幀動畫,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.0fint 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上面太多動畫的時候,邏輯麻煩,可以直接用代碼強制播放其中的一個動畫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章