• unity的animation动画资源压缩


    最近更新了一批骨骼动画资源,不看不知道,一看吓一跳,之前优化掉的内容还需要重新处理一遍,因此。。现在就先把之前的东西拿出来做个记录。

    所幸之前对动画有做动态加载,现在只需要重新将多余的信息清除掉即可(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资源师可以自动化处理,可以扩展为监听动画资源的导致,然后自动化处理。
  • 相关阅读:
    JS面试题(一)
    cookie、locakstorage、sessionstorage的区别
    BOM操作
    DOM表单(复选框)
    DOM表格操作
    Javascript的组成——EMACScript、DOM、BOM
    scrollto 到指定位置
    编写一个javscript函数 fn,该函数有一个参数 n(数字类型),其返回值是一个数组,该数组内是 n 个随机且不重复的整数,且整数取值范围是 [2, 32]。
    使用bluebird解决promise兼容性问题
    Mac 更改/usr/bin 目录权限失败
  • 原文地址:https://www.cnblogs.com/wayland/p/7131055.html
Copyright © 2020-2023  润新知