能做到去掉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));
}
}
}