Spine是一個很好的制作2D骨骼動畫的軟件,其中提供的混合(mix)動畫功能可以很柔和過度兩個不同的動畫,但在混合時期,稍有不善,非常容易出現各種錯亂。在Spine2D骨骼動畫群上,有人提出全K幀、K透明軸等等方法,這些方法往往只是恰好解決了一些問題,但還有相當一部分潛在的問題還是可能發生的。
在使用過程中,我發現Spine的錯亂問題主要表現在以下兩個方面:
1. Slot位置下,A動畫中有abcd四個時間軸,而B動畫只有abc三個時間軸,那么從A切換到B時,切換時d軸的狀態(紋理或色彩)可能會殘留到B動畫上(如A是攻擊動畫,B是行走動畫,d是特效軸)。如果是制作疊加動畫(會同時播兩個動畫,比如邊跑邊打),那么可能不需要全部補齊,這種要視需要而定。
2. Slot位置下,A動畫與B動畫混合時期(●表示關鍵幀):
A:●---------------------------●------
B: ●-------------------------------
|混合時期|
在這種狀態下,由於B動畫設置了紋理之后,A動畫又設置了紋理,混合時間之后,Slot位置下的紋理是A動畫的紋理,這時候紋理錯亂了,這種不能通過K幀解決,因為需要注意的問題太多了。
如果以上兩個問題都解決了,那么混合動畫基本就沒有什么問題了(目前我項目中還沒有發現其它問題)。
對於問題1,原則上,A動畫有的軸,B動畫也必須中,如果B動畫中沒有,則自動為B動畫以setup pose狀態為基准生成這條軸(紋理、變換、色彩等)。補齊及二制作轉換腳本請見github
對於問題2,修改spine-runtime中的Animation.c文件中函數_spAttachmentTimeline_apply中的代碼:將"if (self->frames[frameIndex] < lastTime) return;"改為"if (self->frames[frameIndex] < lastTime && 1 - alpha <= FLT_EPSILON) return;", 並且在文件開始部分添加"#include <float.h>"。alpha(0~1)參數表示是混合進度,原理很簡單,在混合時期一直讓新的動畫軸去設置紋理。