記錄環(huán)境
- Unity 2021.3.4f1
- Timeline 1.6.4
問題描述
??首先說明下爆价,這個報錯不是Unity直接拋出的符匾,它就是我們寫的軌道代碼里它褪,訪問了一個已經(jīng)被Destroy的對象健无。但是苛让,導(dǎo)致這個報錯出現(xiàn)弄贿,不是因為我們用法不合理4悍妗!挎春!
??我們項目在切換情景的時候看疙,會將當(dāng)前情景的資源“全部卸載”,其中就包含TML及其控制的角色直奋。
??我們在主城切換到副本的時候能庆,爆出來這個MissingReferenceException
的問題。檢查后發(fā)現(xiàn)項目中資源釋放的邏輯沒有問題脚线,軌道里的代碼也符合制作規(guī)范搁胆。
統(tǒng)一資源釋放流程(部分):
1.先停止所有正在播放的TML
2.釋放/銷毀資源,這里包含TML、角色等(這一步的順序不重要)
軌道實現(xiàn)的規(guī)范(部分):
【軌道還原】在離開Clip渠旁、退出或銷毀Track等時機時攀例,要盡量還原被控角色的狀態(tài)
??軌道還原是因為我們TML主要用在戰(zhàn)斗中做技能表演,每個技能釋放完畢后顾腊,需要角色還原到自己的出場站位粤铭,所以大部分軌道都需要做還原這個處理。
??基于TML的設(shè)定杂靶,我們在做資源釋放時梆惯,就要保證上面的順序。因為TML結(jié)束的時候吗垮,仍然會訪問角色的對象垛吗,故TML需要先停止。
原因說明
??經(jīng)過進一步打Log測試烁登,我發(fā)現(xiàn)TML的停止跟Playable資源的停止并不是同步進行的怯屉。
測試得到一個結(jié)論:
PlayableDirector.Stop()與PlayerBehaviour.OnPlayableDestroy()是在同一幀執(zhí)行,但不是同步執(zhí)行饵沧,OnPlayableDestroy會晚一些锨络。
測試的Log流程(下面這些全部在同一個Update幀輸出):
-
PlayableDirector.Stop()
【主動停止TML】 -
TimelineCtrl.OnDestroy()
【停止TML后,銷毀角色跟TML】 -
Update()
開始【停止TML時狼牺,做了個標記讓某個腳本的Update在第一行輸出Log】 -
Update()
結(jié)束【同上足删,在最后一行輸出Log】 -
PlayerBehaviour.OnPlayableDestroy()
【Unity內(nèi)部在UpdateDirectorUpdateRegistrator::Forward
調(diào)過來】 - Frame End【停止TML時,開了個協(xié)程在
WaitForEndOfFrame
之后輸出Log】
// OnPlayableDestroy的執(zhí)行堆棧
MoleTimeline.MoleStateMixer:OnPlayableDestroy (UnityEngine.Playables.Playable)
...
0x00007ff7ae5e01d4 (Unity) ScriptingInvocation::Invoke
0x00007ff7ae56f5c0 (Unity) PlayableMethods::InvokePlayableDestroy
0x00007ff7ae562112 (Unity) Playable::DeallocateResources
0x00007ff7ae568862 (Unity) PlayableGraph::DestroyPendingPlayables
0x00007ff7ae568387 (Unity) PlayableGraph::Destroy
0x00007ff7ae56c876 (Unity) DirectorManager::ProcessPlayStateChanges
0x00007ff7ae56a657 (Unity) `DirectorManager::InitializeClass'::`2'::UpdateDirectorUpdateRegistrator::Forward
0x00007ff7ae2a437c (Unity) ExecutePlayerLoop
0x00007ff7ae2a4453 (Unity) ExecutePlayerLoop
0x00007ff7ae2aa099 (Unity) PlayerLoop
推測: Unity內(nèi)部維護了一個Playable的列表锁右,并在Update里每幀去做清理失受,PlayableDirector.Stop只做了一個可銷毀的標記。
解決方案
??暫時沒找到比較好的解決方案咏瑟,只是在每個Track的代碼里拂到,自己判斷要用的資源是否合法。