使用AnimatorControllerOverride的坑

7 篇文章 2 订阅

 设置AnimatorOverrideController占用CPU过高

https://answer.uwa4d.com/question/5a16904135b1f0ea7d4a7a72

这边在真机运行时发现animatorOverride[name]=clip的耗时会受到animatorcotrollor中的clip数目的影响,随数目的增多耗时会明显增加,70个以上的clip耗时确实能达到50ms(红米note2)以上。但换为applyOverrides方法时耗时仍然很高,而且出现了堆内存分配,但并没有达到400ms那么高。
另外,这边尝试了整体替换AnimatorOverrideController,即不在现用的AnimatorOverrideController中替换clip,而是在另一OverrideController中换好clip后,再整体替换到runtimeAnimatorController,,这样耗时就会降到很低了。

 API文档说明https://docs.unity3d.com/ScriptReference/AnimatorOverrideController.html

Interface to control Animator Override Controller.

Animator Override Controller is used to override Animation Clips from a controller to specialize animations for a given Avatar. Swapping Animator.runtimeAnimatorController with an AnimatorOverrideController based on the same AnimatorController at runtime doesn't reset state machine's current state.

There are three ways to use the Animator Override Controller.
1. Create an Animator Override Controller in the Editor.
2. Change one Animation Clip per frame at runtime (Basic use case).
In this case the indexer operator AnimatorOverrideController.this[string] could be used, but be careful as each call will trigger a reallocation of the animator's clip bindings.

在本例中,索引器操作符Animat或控制者。这个[string]可以使用,但是要小心,因为每次调用都会触发动画制作者剪辑绑定的重新分配。

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

http://www.manew.com/thread-112097-1-1.html

大神们,unity animator  使用overrideController替换原有状态机里的动画时 ,状态机会自动返回到初始状态, 这样就好有一帧卡顿,请问有什么解决办法?
例如,第一次给overrideController添加动画A,overrideController["A"]= A,其中A动画长度为5秒,当A播放到3秒时,我给overrideController添加动画B,overrideController["B"]=B,这个时候会发现A会重新播放,不会从第3秒继续播放,中间的融合我有处理了,求如何不让A重新播放,我希望的效果是A继续播放。谢谢大家。

 

问题

  • 在运行时修改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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值