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));
}
}
}
|