Unity3D动作资源(AnimatinClip)优化
能做到去掉Scale曲线,降低浮点精度
using System; using UnityEngine; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEditor; public static class RemoveAnimationClipScale { [MenuItem("Tools/Animation/Remove Animation Clip Scale")] public static void RemoveAnimationClipScaleMenu() { int i = 0; int total = 0; try { EditorUtility.DisplayProgressBar("Remove Animation Clip Scale", "Collecting Animation Clip", 0); var gos = EnumAssets.EnumInCurrentSelection<UnityEngine.AnimationClip>(); total = gos.Count(); if (total > 0) { foreach (var go in gos) { EditorUtility.DisplayProgressBar("Remove Animation Clip Scale", go.name, i * 1.0f / total); OnPostprocessAnimation(go); i++; } } } catch (Exception) { } finally { EditorUtility.ClearProgressBar(); AssetDatabase.Refresh(); AssetDatabase.SaveAssets(); Debug.Log("Tools/Animation/Optimize Animation: total[" + total + "]"); } } static void OnPostprocessAnimation(AnimationClip theAnimation) { try { //去除scale曲线 foreach (EditorCurveBinding theCurveBinding in AnimationUtility.GetCurveBindings(theAnimation)) { string name = theCurveBinding.propertyName.ToLower(); if (name.Contains("scale")) { AnimationUtility.SetEditorCurve(theAnimation, theCurveBinding, null); } } //浮点数精度压缩到f3 AnimationClipCurveData[] curves = null; curves = AnimationUtility.GetAllCurves(theAnimation); Keyframe key; Keyframe[] keyFrames; for (int ii = 0; ii < curves.Length; ++ii) { AnimationClipCurveData curveDate = curves[ii]; if (curveDate.curve == null || curveDate.curve.keys == null) { //Debug.LogWarning(string.Format("AnimationClipCurveData {0} don't have curve; Animation name {1} ", curveDate, animationPath)); continue; } keyFrames = curveDate.curve.keys; for (int i = 0; i < keyFrames.Length; i++) { key = keyFrames[i]; key.value = float.Parse(key.value.ToString("f3")); key.inTangent = float.Parse(key.inTangent.ToString("f3")); key.outTangent = float.Parse(key.outTangent.ToString("f3")); keyFrames[i] = key; } curveDate.curve.keys = keyFrames; theAnimation.SetCurve(curveDate.path, curveDate.type, curveDate.propertyName, curveDate.curve); } } catch (Exception e) { Debug.LogError(string.Format("CompressAnimationClip Failed !!! animationPath : {0} error: {1}", theAnimation.name, e)); } } }