在項目開發中,動畫的編輯一般由美術完成,他們會輸出一個.anim的文件。
其實.anim文件實際上由一系列的關鍵幀組成,可以對這些關鍵幀進行操作,達到一定的目的。
本文章介紹實現將曲線變換形狀,值偏移,時間偏移,上下、左右翻轉。
目錄
5.通過bind屬性,將對應的新曲線應用回去,或者應用到新的動畫文件,最後保存刷新資源
一、獲取一個動畫文件上的所有曲線
1.獲得動畫文件的bind屬性
EditorCurveBinding[] editorCurveBindings = AnimationUtility.GetCurveBindings(mClip);
2.通過bind屬性獲得曲線
AnimationCurve curve = AnimationUtility.GetEditorCurve(mClip, bind);
3.拿到曲線後獲得關鍵幀
Keyframe[] frame = curve.keys;
4.操作關鍵幀後,創建新的曲線
AnimationCurve ac2 = new AnimationCurve(frame);
5.通過bind屬性,將對應的新曲線應用回去,或者應用到新的動畫文件,最後保存刷新資源
AnimationUtility.SetEditorCurve(targetClip, bind, curve);
二、關鍵幀KeyFrame的屬性和曲線的關係
通過操作關鍵幀上的數值,達到形狀變換,偏移,翻轉的目的。
關於屬性的詳細介紹和曲線形狀插值可以參考Unity動畫關鍵幀插值
inTangent、outTangent代表斜率
inWeight、outWeight代表這個方向上影響的權重
這幾個值是影響曲線走向的關鍵
三、對曲線上的關鍵幀進行偏移
偏移不影響原本的貝塞爾曲線插值,通過修改KeyFrame.value達到值偏移,修改KeyFrame.time達到時間偏移
四、複用曲線而不改變取值範圍
1.首先添加編輯好的曲線
2.獲取編輯好的曲線
EditorGUILayout.CurveField(shapeCurve);
3.根據原曲線上的關鍵幀進行一定比例的縮放和偏移
對值和時間進行偏移後,會改變原本的曲線形狀,這裏要根據原曲線的插值,對新曲線的關鍵幀參數進行修改
根據Unity動畫關鍵幀插值提供的公式,計算出未縮放前的座標,按照縮放比例縮放計算新的P1和P2,然後利用縮放後的P0和P3這兩個端點的值,得到ow0,ot0,iw1,it1,設置到關鍵幀。
五、上下和水平翻轉
上下和水平翻轉都影響了原本貝塞爾曲線的斜率,tangent值其實是正切值,翻轉過後剛好爲原本值對應的角α的補角正切,即-tanα
所以上下翻轉:
//切值取補角的值
Keyframe key = new Keyframe(oldKey.time, 2 * first.value - oldKey.value, -oldKey.inTangent, -oldKey.outTangent, oldKey.inWeight, oldKey.outWeight);
左右翻轉還需要對權重翻轉,in和out對換
//切值取補角,權重調換
Keyframe key = new Keyframe(2 * midTime - oldKey.time, oldKey.value, -oldKey.inTangent, -oldKey.outTangent, oldKey.outWeight, oldKey.inWeight);