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资源师可以自动化处理,可以扩展为监听动画资源的导致,然后自动化处理。
时间: 2024-08-25 23:09:41

unity的animation动画资源压缩的相关文章

Android应用资源---动画资源(Animation Resources)

有两种类型的动画资源: 属性动画 在设定的时间内,通过修改与Animator类相关的对象的属性值来创建一个动画. 视图动画 有两种类型的视图动画框架 补间动画(Tween animation):通过执行通过执行一系列的与Animation类相关的单一图片的转换来创建动画. 帧动画(Frame animation):通过显示与AnimationDrawable类的顺序相关的图片序列来创建动画. 属性动画 动画被定义在要修改的目标对象属性的XML中,如设定时间内的背景色或alpha值. 文件位置(F

关于Unity中Mecanim动画的动画状态代码控制与代码生成动画控制器

对于多量的.复杂的.有规律的控制器使用代码生成 动画状态代码控制 1:每个动画状态,比如进入状态,离开状态, 等都有可能需要代码来参与和处理,比如,进入这个动画单元后做哪些事情,来开这个动画单元后做哪些事情,为了解决这个问题,unity允许每个动画单元来绑定一个脚本代码,这个脚本代码必须继承于StateMachineBehaviour;2: 可以在动画状态的Add Behaviour上添加挂载一个脚本到动画状态;3: StateMachineBehaviour主要接口: (1)OnStateEn

unity 对Animator动画系统的研究

unity的新动画系统叫Mecanim,使用Animator来取代旧系统Animation,按Unity文档的惯例:知识点主要分2部分:unity manual和unity script,读者可以边看文章边查阅文档,最好能动手测试. 文章的开始之前,先讲几个基本的知识的: 1.创建动画的一个基本步骤是设置一个unity3d可理解的简化后的骨骼到骨架中实际骨骼的映射:在Mecanim的术语中,这个映射称为Avatar,即avatar是骨骼到骨架的映射. (图片来自网) Avatar主要用于类人骨骼

Android Animation (动画设计)

Android Animation(动画设计) 本文主要介绍逐帧动画,补间动画,属性动画 使用简单的图片 1.Bitmap和BitmapFactory 把一个Bitmap包装成BitmapDrawable对象,调用BitmapDrawable的构造器 BitmapDrawable drawable = new BitmapDrawable(bitmap); 获取BitmapDrawable所包装的Bitmap, Bitmap bitmap = drawable.getBitmap(); 2.Bi

unity shader序列帧动画代码,顺便吐槽一下unity shader系统

http://www.cnblogs.com/hellohuan/archive/2014/01/10/3512784.html 一.看到UNITY论坛里有些人求unity shader序列帧动画,写shader我擅长啊,就顺势写了个CG的shader.代码很简单,就是变换UV采样序列帧贴图,美术配置行数列数以及变换速度. Shader "HELLOHUAN/Hello_Sequence" { Properties { _Color ("Main Color", C

Android Animation 动画Demo(Frame逐帧动画)

上一篇介绍了Animation动画其一:Tween补间动画. 这篇文章接下来介绍Animation另一种动画形式:Frame逐帧动画. Frame动画是一系列图片按照一定的顺序展示的过程,和放电影的机制很相似,我们称为逐帧动画.Frame动画可以被定义在XML文件中,也可以完全编码实现(后面会给出这两种实现方式的源代码Demo). 下面分别介绍: 一.定义在xml中实现: 实现效果图: 源代码: 布局文件:main.xml: <?xml version="1.0" encodin

Android Animation动画详解(二): 组合动画特效

前言 上一篇博客Android Animation动画详解(一): 补间动画 我已经为大家介绍了Android补间动画的四种形式,相信读过该博客的兄弟们一起都了解了.如果你还不了解,那点链接过去研读一番,然后再过来跟着我一起学习如何把简单的动画效果组合在一起,做出比较酷炫的动画特效吧. 一. 动画的续播 如题,大家想想,如果一个页面上包含了许多动画,这些动画要求按顺序播放,即一个动画播放完成后,继续播放另一个动画,使得这些动画具有连贯性.那该如何实现呢? 有开发经验或者是逻辑思维的人肯定会想,对

UE4开发神秘海域类游戏原型 初阶(二):动画资源的整合

前一篇已经确定神海类游戏原型的目标,首先要做的就是3C's(Character, Controls, Camera)的开发. UE4的3C's的程序部分开发主要也就是基于他的GamePlay Framework来进行的,只要在C++里开发完成,通过蓝图类继承,把参数暴露给蓝图就可以由策划和美术师来直接使用了.鉴于UE4自带的Learn Project的示例代码里还是有相当多参考示例的,一些基础内容这里就跳过不讲了,具体的功能实现会在面涉及需求时详细说明.官方的介绍在这里. https://doc

Android Animation 动画

动画类型 Android的animation由四种类型组成  Android动画模式 Animation主要有两种动画模式:一种是tweened animation(渐变动画) XML中 JavaCode alpha AlphaAnimation scale ScaleAnimation 一种是frame by frame(画面转换动画) XML中 JavaCode translate TranslateAnimation rotate RotateAnimation 如何在XML文件中定义动画