1. 程式人生 > >unity的animation動畫資源壓縮

unity的animation動畫資源壓縮

objects key oot tostring llc bindings engine edit com

最近更新了一批骨骼動畫資源,不看不知道,一看嚇一跳,之前優化掉的內容還需要重新處理一遍,因此。。現在就先把之前的東西拿出來做個記錄。

所幸之前對動畫有做動態加載,現在只需要重新將多余的信息清除掉即可(FBX使用的導入設置是Legacy|Store in Root(New)的方式,然後動畫信息單獨copy出來使用的方式),主要針對以下兩點:

1)骨骼動畫的scale信息基本是無用的

2)各個骨骼點信息的float存儲精度基本上不需要很高的精度(部分動畫除外,視表現效果而定)

最開始有手動刪除測試效果的嘗試,不過因為unity自身的原因,會導致手動修改後的anim文件增大不少(懷疑是unity的bug)(使用的Unity5.5.2f1的版本),直接使用程序清理的方式則沒有這個問題,先直接上原有代碼:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public class BoneAnimOptimizeTool 
{
    [MenuItem("Window/AnimationTool/Optimize BoneAnim")]
    public static void OptimizeAnim()
    {
        var tObjArr = Selection.gameObjects;
        foreach(var
obj in tObjArr) { RemoveAnimationCurve(obj); } } //移除scale public static void RemoveAnimationCurve(GameObject _obj) {   List<AnimationClip> tAnimationClipList = new List<AnimationClip> (AnimationUtility.GetAnimationClips(_obj));   if(tAnimationClipList.Count == 0
)   {     AnimationClip[] tObjectList = UnityEngine.Object.FindObjectsOfType(typeof(AnimationClip)) as AnimationClip[];     tAnimationClipList.AddRange(tObjectList);   }   foreach(AnimationClip animClip in tAnimationClipList)   {     foreach(EditorCurveBinding curveBinding in AnimationUtility.GetCurveBindings(animClip))     {     string tName = curveBinding.propertyName.ToLower();     if(tName.Contains("scale"))     {     AnimationUtility.SetEditorCurve(animClip, curveBinding, null);     }     }     CompressAnimationClip(animClip);     }   } //壓縮精度 public static void CompressAnimationClip(AnimationClip _clip) { AnimationClipCurveData[] tCurveArr = AnimationUtility.GetAllCurves(_clip); Keyframe tKey; Keyframe[] tKeyFrameArr; for(int i = 0; i < tCurveArr.Length; ++i) { AnimationClipCurveData tCurveData = tCurveArr[i]; if(tCurveData.curve == null || tCurveData.curve.keys == null) { continue; } tKeyFrameArr = tCurveData.curve.keys; for(int j = 0; j < tKeyFrameArr.Length; j++) { tKey = tKeyFrameArr[j]; tKey.value = float.Parse(tKey.value.ToString("f3")); //#.### tKey.inTangent = float.Parse(tKey.inTangent.ToString("f3")); tKey.outTangent = float.Parse(tKey.outTangent.ToString("f3")); tKeyFrameArr[j] = tKey; } tCurveData.curve.keys = tKeyFrameArr; _clip.SetCurve(tCurveData.path, tCurveData.type, tCurveData.propertyName, tCurveData.curve); } } }
為方便每次更新anim資源師可以自動化處理,可以擴展為監聽動畫資源的導致,然後自動化處理。

unity的animation動畫資源壓縮