zoukankan      html  css  js  c++  java
  • Unity3D动作资源(AnimatinClip)优化

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

    using System;
    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using UnityEditor;
    
    public static class RemoveAnimationClipScale 
    {
    
    	[MenuItem("Tools/Animation/Remove Animation Clip Scale")]
    	public static void RemoveAnimationClipScaleMenu()
    	{
    
    		int i = 0;
    		int total = 0;
    
    		try
    		{
    			EditorUtility.DisplayProgressBar("Remove Animation Clip Scale", "Collecting Animation Clip", 0);
    			var gos = EnumAssets.EnumInCurrentSelection<UnityEngine.AnimationClip>();
    			total = gos.Count();
    			if (total > 0)
    			{
    				foreach (var go in gos)
    				{
    					EditorUtility.DisplayProgressBar("Remove Animation Clip Scale", go.name, i * 1.0f / total);
    					OnPostprocessAnimation(go);
    					i++;
    				}	
    			}
    		}
    		catch (Exception)
    		{
    
    		}
    		finally
    		{
    			EditorUtility.ClearProgressBar();
    			AssetDatabase.Refresh();
    			AssetDatabase.SaveAssets();
    			Debug.Log("Tools/Animation/Optimize Animation: total[" + total + "]");
    		}
    
    	}
    
    	static void OnPostprocessAnimation(AnimationClip theAnimation)
    	{
    		try
    		{
    			//去除scale曲线
    			foreach (EditorCurveBinding theCurveBinding in AnimationUtility.GetCurveBindings(theAnimation))
    			{
    				string name = theCurveBinding.propertyName.ToLower();
    				if (name.Contains("scale"))
    				{
    					AnimationUtility.SetEditorCurve(theAnimation, theCurveBinding, null);
    				}
    			}
    
    			//浮点数精度压缩到f3
    			AnimationClipCurveData[] curves = null;
    			curves = AnimationUtility.GetAllCurves(theAnimation);
    			Keyframe key;
    			Keyframe[] keyFrames;
    			for (int ii = 0; ii < curves.Length; ++ii)
    			{
    				AnimationClipCurveData curveDate = curves[ii];
    				if (curveDate.curve == null || curveDate.curve.keys == null)
    				{
    					//Debug.LogWarning(string.Format("AnimationClipCurveData {0} don't have curve; Animation name {1} ", curveDate, animationPath));
    					continue;
    				}
    				keyFrames = curveDate.curve.keys;
    				for (int i = 0; i < keyFrames.Length; i++)
    				{
    					key = keyFrames[i];
    					key.value = float.Parse(key.value.ToString("f3"));
    					key.inTangent = float.Parse(key.inTangent.ToString("f3"));
    					key.outTangent = float.Parse(key.outTangent.ToString("f3"));
    					keyFrames[i] = key;
    				}
    				curveDate.curve.keys = keyFrames;
    				theAnimation.SetCurve(curveDate.path, curveDate.type, curveDate.propertyName, curveDate.curve);
    			}
    		}
    		catch (Exception e)
    		{
    			Debug.LogError(string.Format("CompressAnimationClip Failed !!! animationPath : {0} error: {1}", theAnimation.name, e));
    		}
    	}
    }
    

      

  • 相关阅读:
    Tomcat + Mysql高并发配置优化
    Qt Widget 利用 Qt4.5 实现酷炫透明窗体
    使用VC2005编译真正的静态Qt4.4.3程序 good
    详解 Qt 线程间共享数据(使用signal/slot传递数据,线程间传递信号会立刻返回,但也可通过connect改变)
    浅析在QtWidget中自定义Model(beginInsertRows()和endInsertRows()是空架子,类似于一种信号,用来通知底层)
    英国著名芯片厂商与苹果谈崩 中资收购机会来了!
    跨站脚本攻击(XSS)
    Kafka 协议实现中的内存优化
    读取配置信息
    英语面试准备
  • 原文地址:https://www.cnblogs.com/mrblue/p/7127677.html
Copyright © 2011-2022 走看看