Unity闪退记录

作者: 慢慢来比较快_ | 来源:发表于2018-04-18 10:42 被阅读0次

    环境:

    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闪退记录

        本文链接:https://www.haomeiwen.com/subject/ofwaxftx.html