Unity闪退记录

环境:

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)

你可能感兴趣的:(Unity闪退记录)