最近更新了一批骨骼动画资源,不看不知道,一看吓一跳,之前优化掉的内容还需要重新处理一遍,因此。。现在就先把之前的东西拿出来做个记录。
所幸之前对动画有做动态加载,现在只需要重新将多余的信息清除掉即可(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资源师可以自动化处理,可以扩展为监听动画资源的导致,然后自动化处理。
时间: 2024-10-29 06:55:18