关注

使用AnimatorControllerOverride覆盖AnimationClips时,Animator的状态被重置

问题

  • 在运行时修改Animator控制器的动画剪辑时,Animator状态被重置。
  • 第二次修改动画剪辑时出现问题。
原因

当您修改剪辑时动画会被重置。Unity需要在替换动画剪辑之前保存Animator的状态,然后在剪辑被替换之后恢复之前的状态。但是在Unity的某些版本中是没有这个特性的。(详细请参阅下文)

解决方案

有一种解决办法是,修改动画剪辑时您可以用脚本来保存和恢复Animator的状态。

void ChangeClip(AnimationClip clip ){
Animator anim = GetComponent(); 
AnimatorOverrideController overrideController =
new AnimatorOverrideController();
AnimatorStateInfo[] layerInfo = new AnimatorStateInfo[anim.layerCount];
for (int i = 0; i < anim.layerCount; i++)
{
layerInfo[i] = anim.GetCurrentAnimatorStateInfo(i);
}

overrideController.runtimeAnimatorController = anim.runtimeAnimatorController;
overrideController[currentClipName] = clip;
anim.runtimeAnimatorController = overrideController;

// Force an update强制更新
anim.Update(0.0f);

// Push back state 恢复之前的状态
for (int i = 0; i < anim.layerCount; i++)
{
anim.Play(layerInfo[i].nameHash, i, layerInfo[i].normalizedTime);
}
currentClipName = clip.name;
} 

更多信息

请查看:http://forum.unity3d.com/threads/swapping-override-clips-at-runtime.298557/

本文适用于Unity 5.1.1f1

这篇文章有帮助吗?
0 人中有 0 人觉得有帮助
还有其它问题?提交请求

0 评论

登录写评论。