码迷,mamicode.com
首页 > 编程语言 > 详细

unity的animation动画资源压缩

时间:2017-07-07 11:41:05      阅读:1559      评论:0      收藏:0      [点我收藏+]

标签:tin   eof   tor   版本   selection   int   自身   自动   gac   

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

所幸之前对动画有做动态加载,现在只需要重新将多余的信息清除掉即可(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资源师可以自动化处理,可以扩展为监听动画资源的导致,然后自动化处理。

 

unity的animation动画资源压缩

标签:tin   eof   tor   版本   selection   int   自身   自动   gac   

原文地址:http://www.cnblogs.com/wayland/p/7131055.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!