zoukankan      html  css  js  c++  java
  • 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资源师可以自动化处理,可以扩展为监听动画资源的导致,然后自动化处理。
  • 相关阅读:
    题解 P3960 【列队】
    题解 P3825 【[NOI2017]游戏】
    题解 P3385 【【模板】负环】
    luoguP1555 尴尬的数字(暴力+map)
    luogu P1775 古代人的难题_NOI导刊2010提高(02)(斐波纳契+数学)
    luogu P1405 苦恼的小明(欧拉定理)
    luogu P2117 小Z的矩阵(结论题)
    BZOJ2870 最长道路tree(并查集+LCA)
    BZOJ 4668 冷战(按秩合并并查集+LCA)
    BZOJ 3376 [Usaco2004 Open]Cube Stacking 方块游戏(带权并查集)
  • 原文地址:https://www.cnblogs.com/wayland/p/7131055.html
Copyright © 2011-2022 走看看