Unity通过导入器优化动画关键帧数据

Unity通过导入器优化动画关键帧数据

https://zhuanlan.zhihu.com/p/76250183

需求:部分动画导入需要删掉一些骨骼的关键帧,减少动画内存占用

例如:我只要保留表情SkinnedMeshRenderer的动画信息,那上面的Bip01骨骼相关的动画其实都不需要,如果不删除,在内存中就会占用一部分冗余的内存

Unity通过导入器优化动画关键帧数据_第1张图片

思路:通过OnPostprocessAnimation+AnimationUtility在导入的后处理阶段处理一下动画片段的关键帧信息,OnPostprocessAnimation可以获取动画片段的具体数据,并且可以通过AnimationUtility的API修改删除

void OnPostprocessModel(GameObject g) {

   bool hasChanged = false;
   //处理表情的无用关键帧信息
   List animationClipList = new List(AnimationUtility.GetAnimationClips(g));
   if (animationClipList.Count == 0) {
      AnimationClip[] objectList = UnityEngine.Object.FindObjectsOfType (typeof(AnimationClip)) as AnimationClip[];
      animationClipList.AddRange(objectList);
   }
   //遍历动画片段处理关键帧
   foreach (AnimationClip theAnimation in animationClipList) {
      bool change = SpecialFaceAnim(theAnimation);
      if (change) {
         hasChanged = true;
      }
   }

   if (hasChanged) {
      EditorUtility.SetDirty(g);
      AssetDatabase.SaveAssets();
   }
}

/// 
/// 表情动画,需要在后处理中删掉
/// 
/// 
private bool SpecialFaceAnim(AnimationClip clip) {
   bool change = false;
   EditorCurveBinding[] bindings = AnimationUtility.GetCurveBindings(clip);
   foreach (var item in bindings) {
      if (item.path.StartsWith("Bip01")) {
         AnimationUtility.SetEditorCurve(clip, item, null);
         change = true;
      }
   }

   return change;
}

优化后的效果,可以看到已经没有多余的骨骼动画信息了

Unity通过导入器优化动画关键帧数据_第2张图片

 

发布于 2019-08-01

 

 

 

 

 

你可能感兴趣的:(Unity)