关于动画文件的压缩,其实前辈们已经讲得非常详尽了:
http://www.codershu.com/2017/06/14/UnityOptimizeAnimationClip/
http://gad.qq.com/article/detail/15869
写这篇文章一是为了弥补原文已失效的附件,二是为了更新已过时的API。
不多说,直接上代码:

这里只介绍两种压缩方案:

删减帧:

private static void ReduceScaleKey(AnimationClip clip, string keyName)
{EditorCurveBinding[] curves = AnimationUtility.GetCurveBindings(clip);for (int j = 0; j < curves.Length; j++) {EditorCurveBinding curveBinding = curves[j];if (curveBinding.propertyName.ToLower().Contains(keyName)) {AnimationUtility.SetEditorCurve(clip, curveBinding, null);}}
}

动画精度压缩:

private static void ReduceFloatPrecision(AnimationClip clip)
{EditorCurveBinding[] bindings = AnimationUtility.GetCurveBindings(clip);for (int j = 0; j < bindings.Length; j++){EditorCurveBinding curveBinding = bindings[j];AnimationCurve curve = AnimationUtility.GetEditorCurve(clip, curveBinding);if (curve == null || curve.keys == null){continue;}Keyframe[] keys = curve.keys;for (int k = 0; k < keys.Length; k++){Keyframe key = keys[k];key.value = float.Parse(key.value.ToString("f3"));key.inTangent = float.Parse(key.inTangent.ToString("f3"));key.outTangent = float.Parse(key.outTangent.ToString("f3"));keys[k] = key;}curve.keys = keys;AnimationUtility.SetEditorCurve(clip, curveBinding, curve);}
}

提供两种压缩选择:

1.导入时压缩动画:

public class AnimCompress : AssetPostprocessor
{public const string ScaleKeyName = "localscale";public const string RotationKeyName = "localrotation";void OnPostprocessModel(GameObject go){List<AnimationClip> clips = new List<AnimationClip>(AnimationUtility.GetAnimationClips(go));if (clips.Count == 0) {AnimationClip[] objectList = Object.FindObjectsOfType(typeof(AnimationClip)) as AnimationClip[];if (objectList != null){clips.AddRange(objectList);}}for (int i = 0; i < clips.Count; i++){CompressAnim(clips[i]);}}public static void CompressAnim(AnimationClip clip){ReduceScaleKey(clip, ScaleKeyName);ReduceFloatPrecision(clip);}
}

但是由于动画文件在改动后会恢复原始大小,所以增加另一种方案

2.压缩选择的动画文件:

[MenuItem("Tools/Animation/CompressAnim &v")]
public static void CompressAnimMenu()
{try{var selectGos = Selection.gameObjects;for (int i = 0; i < selectGos.Length; i++){EditorUtility.DisplayProgressBar("CompressAnim", selectGos[i].name + " Compressing...", ((float)i / selectGos.Length));AnimationClip[] clips = GetAnimationClips(selectGos[i]);foreach (var c in clips) {CompressAnim(c);}}}catch (Exception){EditorUtility.ClearProgressBar();throw;}EditorUtility.ClearProgressBar();
}/// <summary>
/// 获取GameObject上的AnimationClips
/// </summary>
public static AnimationClip[] GetAnimationClips(GameObject go)
{List<AnimationClip> clips = new List<AnimationClip>();string path = AssetDatabase.GetAssetPath(go);Object[] objects = AssetDatabase.LoadAllAssetsAtPath(path);foreach (var o in objects) {if (o is AnimationClip) {clips.Add((AnimationClip)o);}}return clips.ToArray();
}

这样我们就可以先设置好动画文件的参数以及其他准备工作,最后再压缩就好了



本文采用了两种效率最高的压缩方案,惊奇的是,在Editor下测试的结果,一个动画从284k压到到50k,最高压缩率接近82%!虽然不是真机测试结果,但足以说明动画文件优化的提升空间有多大。
小伙伴儿门赶紧在自己的项目中测试一下吧!

Unity实用案例之——动画压缩相关推荐

  1. Unity实用案例之——屏幕画线和线框渲染

    游戏里经常会遇到各种画线的需求,今天我们利用GL来实现其中的两个画线功能. 一.屏幕画线 屏幕画线是一种很好的用户交互方式,通过屏幕画线可以控制游戏中的各种元素,Unity提供了UnityEnige. ...

  2. Unity实用案例之——“吃鸡”手雷弹道模拟

    最近吃鸡游戏火啊,至今也吃了好几晚的鸡了,无奈手雷就是丢不准,从窗户丢雷丢几个弹出几个,各种误伤自己人--而别人家的手雷: 一般的游戏里手雷都是盲投,不过一般游戏也不会对弹道有这么精确的要求,尽管往敌 ...

  3. Unity 动画压缩及其优化

    一:为什么要做动画优化 动画文件在游戏包体和内存中占的比例仅次于贴图,优化好动画文件,就优化了一小半游戏内存.拿我们正在开发的游戏举例,优化后的包体和内存比优化前减少了一百多兆,大概优化掉了五分之一的 ...

  4. 【Unity编辑器扩展】包体优化神器,图片压缩,批量生成图集/图集变体,动画压缩

    功能介绍: 1. 压缩工具支持对图片原文件压缩(支持png/jpg),也支持使用Unity内置图片压缩批量对图片设置压缩参数. 2. 支持以文件夹或及其子文件夹为单位批量生成图集(SpriteAtla ...

  5. Unity ASE案例解析—AnimatedFire(火焰动画效果)

    效果图 目录 1.基础配置 2.Emission-自发光处理 3.其他处理 火焰效果,主要是处理自发光效果,其他的不做特殊处理. 1.基础配置 Opaque 不透明模式 ZTestMode Less ...

  6. Java语言最新实用案例教程_Java语言最新实用案例教程

    第1章Java语言基础 1.1初识Java程序 案例11一个简单的Java应用程序 案例12一个简单的GUI程序 1.2Java语言基础 案例13两个数的计算程序 案例14求素数 1.3数组与 ...

  7. 《Unity 游戏案例开发大全》一6.5 游戏主场景

    本节书摘来异步社区<Unity 游戏案例开发大全>一书中的第6章,第6.1节,作者: 吴亚峰 , 杜化美 , 于复兴 责编: 张涛,更多章节内容可以访问云栖社区"异步社区&quo ...

  8. jquery audio没有声音_Python实用案例编程入门:第十四章 通过声音控制您的计算机

    本章的主题为通过声音来控制您的电脑.当下的语音识别已经相对比较成熟,比如有的车载系统,或手机都支持语音识别,您可以通过声音来下达指令.比如您告诉导航系统"我要去北京",它会自动帮您 ...

  9. Unity 3D 人形角色动画(Avatar)||Unity 3D 导航系统||Unity 3D 障碍物

    Unity 3D 人形角色动画(Avatar) Mecanim 动画系统适合人形角色动画的制作,人形骨架是在游戏中普遍采用的一种骨架结构.. 由于人形骨架在骨骼结构上的相似性,用户可以将动画效果从一个 ...

最新文章

  1. SQL server中SET ANSI_PADDING对char、varchar、nvarchar的影响
  2. vc6.0 记录一些常见问题的解决方案
  3. torch div优化
  4. 归并排序之——二路归并(c/c++)
  5. DISCUZ x2.5 插件实现DIY功能,让页面也可以自由设计
  6. Weblogic12c T3 协议安全漏洞分析【CVE-2020-14645 CVE-2020-2883 CVE-2020-14645】
  7. c语言中初始值的作用,初始C语言学习
  8. 遍历对象键值对的两种方法
  9. c# html正则,c# 使用正则解析html
  10. matlab中的取整函数(ceil、floor、round)
  11. 2021年智慧校园APP全新上线
  12. 信息安全与密码学概论
  13. Day004--MySQL中的多表查询
  14. 读取没开计算机硬盘,电脑磁盘读取错误开不了机怎么办
  15. 会员营销体系中,促成会员转化的关注点有哪些
  16. 数博会金蝶揭秘智能零售:名企转型底气
  17. node判断文件是否为加密文件
  18. SourceTree跳过Bitbucket服务器或者Bitbucket登录的方法
  19. 浅谈Robots.txt文件给网站带来的好处
  20. 服务器型号E52680,八核心Intel Xeon E5-2680性能大爆光

热门文章

  1. 简单的身份证号码,全面填写,可以比较年份、月份、天数(初学者学习可以看看)
  2. R语言基础图形元素——多边形
  3. python另存为对话框_“另存为文件”对话框如何不允许覆盖
  4. 《环球》杂志|“宇宙级”漏洞过后,一个技术总裁的忠告……
  5. 2020 CCPC - 网络选拔赛 签到计划
  6. 主频和睿频有什么区别
  7. 云计算与大数据系列:1分钟看懂弹性计算云EC2的关键技术
  8. 2023华为软件精英挑战赛,探寻软件人才与科技创新的最优解
  9. 解决Unable to open debugger port错误
  10. 微信小程序源码案例大全