[Unity]优化裁剪Unity骨骼动画,减少动画文件容量

2020/04 18 08:04

我们做的android游戏项目对安装包有容量限制,原先是限制在100M之内,分析了一下, Texture占用容量最多, 排名第二的竟然是 角色动画文件

一个角色含有若干个动作,一个动作文件约1M+大小, 原来我们在PC上使用Gamebryo制作端游时,一般一个kf文件也只有20KB. 虽然Unity的动作数据是原始文本文件, 但也不至于这么大…

与美术同学聊了一下, 想到了一个裁剪方案, 由于角色动画一般只有旋转是有效的, 缩放基本上不用,位移用得也很少. 那我们可以制作一个自动裁剪的工具,按规则将不用的绽放和位移属性干掉:

以下是代码

static public bool SetAnimationCurveData(AnimationClip clip)
{
	if (clip == null)
	{
		return false;
	}
 
	AnimationClipCurveData[] curveDatas = AnimationUtility.GetAllCurves(clip, true);
	if (curveDatas == null)
	{
		return false;
	}
 
	// 清除原来所有的数据
	clip.ClearCurves();
 
	float len = clip.length ;
	foreach (AnimationClipCurveData dt in curveDatas)
	{
		// 进行过滤
		if (IsFilterCurveData(dt))
		{
			continue;
		}
 
		// 将数据存回去
		clip.SetCurve(dt.path, dt.type, dt.propertyName, dt.curve);
	}
 
	return true;
}
 
static public bool SetCurveByAssetPath(string assetPath)
{
	UnityEngine.Object obj = AssetDatabase.LoadAssetAtPath(assetPath, typeof(UnityEngine.Object));
	if (obj == null)
	{
		return false;
	}
	
	if (!(obj is AnimationClip))
	{
		return false;
	}
	
	AnimationClip clip = obj as AnimationClip;
	SetAnimationCurveData(clip, true);
	return true;
}

另外还有一种优化选项,把不重要的骨骼,导入的时候,这2条设置为较大的值,例如3