环境:
Unity 5.6.5p1
问题:
切换场景时,遇到一个引擎层的bug会导致闪退。
闪退前会提示:Assertion failed on expression: 'MecanimDataWasBuilt()'
打开Editor的Log,里面记录了断言的位置和闪退时的堆栈 :
(Filename: C:/buildslave/unity/build/Runtime/Animation/AnimationClip.cpp Line: 1733)
Crash!!!
========== OUTPUTING STACK TRACE ==================
0x00000001418D3DBF (Unity) mecanim::statemachine::EvaluateState
0x00000001418D607D (Unity) mecanim::statemachine::SetStateMachineInInitialState
0x000000014089D821 (Unity) AnimatorControllerPlayable::GenerateGraph
0x000000014089E73D (Unity) AnimatorControllerPlayable::SetAnimatorController
0x00000001407CDB27 (Unity) Animator::CreateInternalControllerPlayable
0x0000000140844213 (Unity) Animator::CreateObject
0x00000001408456B1 (Unity) Animator::Prepare
0x000000014084976C (Unity) Animator::UpdateAvatars
0x0000000141495F94 (Unity) DirectorManager::ExecuteProcessCallbacks
0x000000014149756C (Unity) OnWillSaveScene
0x0000000140D8536F (Unity) PlayerLoop
0x000000014174381E (Unity) Application::UpdateScene
0x0000000141744FEF (Unity) Application::UpdateSceneIfNeeded
0x000000014174D87A (Unity) Application::TickTimer
0x000000014181935C (Unity) CrashCallback
0x000000014181AEE4 (Unity) WinMain
0x0000000141B0632C (Unity) strnlen
0x00000000776059CD (kernel32) BaseThreadInitThunk
0x000000007773A561 (ntdll) RtlUserThreadStart
========== END OF STACKTRACE ===========
解决过程:
1.由于这是引擎内部的代码,里面涉及到Animator的Create行为,所以猜测跟Animator的管理有关。
2.尝试过不使用AssetBundle,发现不会闪退,可以判定跟AssetBundle的加载/卸载有关。
3.把代码中所有assetbundle:Unload(true),都改成Unload(false),发现不会闪退了。那可以看出是卸载AssetBundle中的Animator后出问题了。
4.最后定位到A场景和B场景都使用了一个带Animator的Prefab,而A,B各自打包了,讲道理的话,应该是互不影响的。我尝试把Prefab关联Break掉,再重新打包,但是问题仍存在。
5.基于资源管理,不可能不使用Unload(true)。那既然是Animator被卸载后,仍被访问导致的,那么在销毁前先停止访问Animator就好了吧?
最后解决方案:
在切换场景前(Unload(true)前),先把当前的Animator组件禁用掉,就不会闪退了。
local allAnimators = UnityEngine.Object.FindObjectsOfType(UnityEngine.Animator)
for t in Slua.iter(allAnimators) do
t.enabled = false
end
后言:
显然,这个解决方案并不完美,但是目前看到只能等待引擎官方修复,或者调整美术场景制作的方案(Animator不共用?)
只能后面再继续观察,看看怎么完美避免这个问题。
最新:
在Unity 5.6.6的发行说明中,已经修复了这个闪退了。
Fixes
Animation: Fixed a crash when an animator reset was triggered during a StateMachineBehaviour awake. (907324)
Animation: Fixed a crash when Animator instantiated from Script enters a Sub-State Machine with StateMachineBehaviour. (930814)
网友评论