能做到去掉Scale曲线,降低浮点精度

  1. using System;
  2. using UnityEngine;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using UnityEditor;
  7.  
  8. public static class RemoveAnimationClipScale
  9. {
  10.  
  11. [MenuItem("Tools/Animation/Remove Animation Clip Scale")]
  12. public static void RemoveAnimationClipScaleMenu()
  13. {
  14.  
  15. int i = 0;
  16. int total = 0;
  17.  
  18. try
  19. {
  20. EditorUtility.DisplayProgressBar("Remove Animation Clip Scale", "Collecting Animation Clip", 0);
  21. var gos = EnumAssets.EnumInCurrentSelection<UnityEngine.AnimationClip>();
  22. total = gos.Count();
  23. if (total > 0)
  24. {
  25. foreach (var go in gos)
  26. {
  27. EditorUtility.DisplayProgressBar("Remove Animation Clip Scale", go.name, i * 1.0f / total);
  28. OnPostprocessAnimation(go);
  29. i++;
  30. }
  31. }
  32. }
  33. catch (Exception)
  34. {
  35.  
  36. }
  37. finally
  38. {
  39. EditorUtility.ClearProgressBar();
  40. AssetDatabase.Refresh();
  41. AssetDatabase.SaveAssets();
  42. Debug.Log("Tools/Animation/Optimize Animation: total[" + total + "]");
  43. }
  44.  
  45. }
  46.  
  47. static void OnPostprocessAnimation(AnimationClip theAnimation)
  48. {
  49. try
  50. {
  51. //去除scale曲线
  52. foreach (EditorCurveBinding theCurveBinding in AnimationUtility.GetCurveBindings(theAnimation))
  53. {
  54. string name = theCurveBinding.propertyName.ToLower();
  55. if (name.Contains("scale"))
  56. {
  57. AnimationUtility.SetEditorCurve(theAnimation, theCurveBinding, null);
  58. }
  59. }
  60.  
  61. //浮点数精度压缩到f3
  62. AnimationClipCurveData[] curves = null;
  63. curves = AnimationUtility.GetAllCurves(theAnimation);
  64. Keyframe key;
  65. Keyframe[] keyFrames;
  66. for (int ii = 0; ii < curves.Length; ++ii)
  67. {
  68. AnimationClipCurveData curveDate = curves[ii];
  69. if (curveDate.curve == null || curveDate.curve.keys == null)
  70. {
  71. //Debug.LogWarning(string.Format("AnimationClipCurveData {0} don't have curve; Animation name {1} ", curveDate, animationPath));
  72. continue;
  73. }
  74. keyFrames = curveDate.curve.keys;
  75. for (int i = 0; i < keyFrames.Length; i++)
  76. {
  77. key = keyFrames[i];
  78. key.value = float.Parse(key.value.ToString("f3"));
  79. key.inTangent = float.Parse(key.inTangent.ToString("f3"));
  80. key.outTangent = float.Parse(key.outTangent.ToString("f3"));
  81. keyFrames[i] = key;
  82. }
  83. curveDate.curve.keys = keyFrames;
  84. theAnimation.SetCurve(curveDate.path, curveDate.type, curveDate.propertyName, curveDate.curve);
  85. }
  86. }
  87. catch (Exception e)
  88. {
  89. Debug.LogError(string.Format("CompressAnimationClip Failed !!! animationPath : {0} error: {1}", theAnimation.name, e));
  90. }
  91. }
  92. }

  

Unity3D动作资源(AnimatinClip)优化的更多相关文章

  1. Unity 打包总结和资源的优化和处理

    1. Texture,都去掉alpha通道,作为背景展示的图片,基本都没有透明要求,有特殊要求的则放到atlas里面 a. Loading图这类需要比较精细的,则把图片设置为Automatic Tru ...

  2. Unity3d Web3d资源的动态加载

    Unity3d Web3d资源的动态加载 @灰太龙 参考了宣雨松的博客,原文出处http://www.xuanyusong.com/archives/2405,如果涉及到侵权,请通知我! Unity3 ...

  3. Unity3d代码及效率优化总结

    1.PC平台的话保持场景中显示的顶点数少于200K~3M,移动设备的话少于10W,一切取决于你的目标GPU与CPU. 2.如果你用U3D自带的SHADER,在表现不差的情况下选择Mobile或Unli ...

  4. Intel64及IA-32架构优化指南第8章多核与超线程技术——8.9 其它共享资源的优化

    8.9 其它共享资源的优化 在多线程应用中的资源优化依赖于处理器拓扑层级内相关联的Cache拓扑以及执行资源.在第7章中讨论了处理器拓扑以及标识处理器拓扑的一种软件算法. 在带有共享总线的平台中,总线 ...

  5. Unity3D移动端内存优化(NGUI方面)

     Unity3D引擎技术交流QQ群:[21568554] 做3d移动端内存一直是人们头疼的问题,载入的资源释放了,还有其它的须要释放.比方ngui释放,事实上主要是NGUI的Texture和Spr ...

  6. Unity3D 的大场景内存优化

    我们公司的一个 MMORPG 项目最近在内存方面碰到了红线,昨天开会讨论了一下.我提出了一个改进方案,写篇 blog 记录一下. 问题是这样的.在当下的手机及平板硬件设备条件下,操作系统留给应用的可用 ...

  7. 跟我从零基础学习Unity3D开发--资源打包篇(AssetBundle)

    好久没更新了,一直在加班敢项目进度.这里和关注我的博客的童鞋表示一下歉意!这里有我录的Unity3D从零开始的视频教程大家可以关注一下:http://www.imooc.com/view/555  视 ...

  8. unity3d 加密资源并缓存加载

    原地址:http://www.cnblogs.com/88999660/archive/2013/04/10/3011912.html 首先要鄙视下unity3d的文档编写人员极度不负责任,到发帖为止 ...

  9. 详谈 Unity3D AssetBundle 资源加载,结合实际项目开发实例

    第一次搞资源更新方面,这里只说更新,加载,AssetBundle资源加载,谈谈自己的理解,以及自己在项目中遇到的那些神坑,现在回想一下,真的是自己跪着过来的,说多了,都是泪. 我这边是安卓AssetB ...

随机推荐

  1. Write operations are not allowed in read-only mode 只读模式下(FlushMode.NEVER/MANUAL)写操作不允

    org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read ...

  2. fdisk mkfs blkid fstab

    fdisk -l  查看系统分区信息 mkfs  制作文件系统mke2fs 制作ext型文件系统mkntfs  制作ntfs型文件系统 e2label  更改ext型文件系统卷标ntfslabel 更 ...

  3. storm学习之七-storm UI页面参数详解

    http://lbxc.iteye.com/blog/1522318 --参考文章 http://blog.csdn.net/rong_89/article/details/39473917 --参考 ...

  4. kafka_2.10-0.8.1.1.tgz的1或3节点集群的下载、安装和配置(图文详细教程)绝对干货

    运行kafka ,需要依赖 zookeeper,你可以使用已有的 zookeeper 集群或者利用 kafka自带的zookeeper. 单机模式,用的是kafka自带的zookeeper, 分布式模 ...

  5. zabbix监控系列(5)之通过trap模式监控网络设备

  6. 怎么安装ABBYY FineReader

    ABBYY FineReader是市场领先的文字识别(OCR)软件,可快速方便地将扫描纸质文档.PDF文件和数码相机的图像转换成可编辑.可搜索信息,ABBYY FineReader 12是目前最新版本 ...

  7. 通过Nginx反向代理,IIS和apache 共用80端口

    #user nobody; worker_processes ; #error_log logs/error.log; #error_log logs/error.log notice; #error ...

  8. C#静态构造函数调用机制

    https://blog.csdn.net/cjolj/article/details/56329230 若一个类中有静态构造函数,在首次实例化该类或任何的静态成员被引用时,.NET自动调用静态构造函 ...

  9. 已知大小分别为m、n的两个无序数组A、B和一个常数c,求满足A[i]+B[j]=c的所有A[i]和B[j]

    方法一:枚举法.该方法是最容易.也是最简单的方法,枚举出数组A和数组B中所有的元素对,判断其和是否为c,如果是,则输出. 方法二:排序+二分查找法.首先,对两个数组中长度较大数组,不妨设为A,排序:然 ...

  10. cordova开发ios炸鸡

    cordova/lib/copy-www-build-step.sh: Permission denied 解决办法: cd platforms/ios/cordova/lib sudo chmod ...