超级单例系统-在结束运行模式时访问不销毁场景会发生断言失败 #27

Open
opened 2025-10-24 08:34:48 +08:00 by lrss3 · 1 comment
Owner

这里我尝试在一个脚本disable时同时调用另一个处于超级单例控制的不销毁场景对象的 StopAllCoroutines ,但从调用栈看,程序可能还没执行到这个函数调用就已经失败了。

可能更准确的说是调用到GlobalInstance就会报错.

Assertion failed on expression: 'go.IsActive()'
UnityEngine.StackTraceUtility:ExtractStackTrace ()
XericLibrary.Runtime.Type.SingleMonoBase`1<LiRuochen.Manager.DataDrive.DataDriveAPI/ManualDataSource>:GetDontDestroyParent ()
XericLibrary.Runtime.Type.SingleMonoBase`1<LiRuochen.Manager.DataDrive.DataDriveAPI/ManualDataSource>:get_GlobalInstance ()
Script.LiRuochen.Manager.AdvanceGeologyForecastManager:get_DataSource1 () (at Assets/Script/LiRuochen/Manager/AdvanceGeologyForecastManager.cs:221)
Script.LiRuochen.Manager.AdvanceGeologyForecastManager/<get_DataSources>d__19:MoveNext () (at Assets/Script/LiRuochen/Manager/AdvanceGeologyForecastManager.cs:229)
XericLibrary.Runtime.MacroLibrary.MacroMath:ForEachDo<System.ValueTuple`2<ProcessTools.Data.DataSourceBase, Script.LiRuochen.Manager.SceneParamsManager/SiteInfo>> (System.Collections.Generic.IEnumerable`1<System.ValueTuple`2<ProcessTools.Data.DataSourceBase, Script.LiRuochen.Manager.SceneParamsManager/SiteInfo>>,System.Action`1<System.ValueTuple`2<ProcessTools.Data.DataSourceBase, Script.LiRuochen.Manager.SceneParamsManager/SiteInfo>>)
Script.LiRuochen.Manager.AdvanceGeologyForecastManager:OnDisable () (at Assets/Script/LiRuochen/Manager/AdvanceGeologyForecastManager.cs:268)
ForecastPanel:OnDisable () (at Assets/Script/Wwx/UI/ForecastPanel.cs:396)
这里我尝试在一个脚本disable时同时调用另一个处于超级单例控制的不销毁场景对象的 StopAllCoroutines ,但从调用栈看,程序可能还没执行到这个函数调用就已经失败了。 可能更准确的说是调用到`GlobalInstance`就会报错. ``` Assertion failed on expression: 'go.IsActive()' UnityEngine.StackTraceUtility:ExtractStackTrace () XericLibrary.Runtime.Type.SingleMonoBase`1<LiRuochen.Manager.DataDrive.DataDriveAPI/ManualDataSource>:GetDontDestroyParent () XericLibrary.Runtime.Type.SingleMonoBase`1<LiRuochen.Manager.DataDrive.DataDriveAPI/ManualDataSource>:get_GlobalInstance () Script.LiRuochen.Manager.AdvanceGeologyForecastManager:get_DataSource1 () (at Assets/Script/LiRuochen/Manager/AdvanceGeologyForecastManager.cs:221) Script.LiRuochen.Manager.AdvanceGeologyForecastManager/<get_DataSources>d__19:MoveNext () (at Assets/Script/LiRuochen/Manager/AdvanceGeologyForecastManager.cs:229) XericLibrary.Runtime.MacroLibrary.MacroMath:ForEachDo<System.ValueTuple`2<ProcessTools.Data.DataSourceBase, Script.LiRuochen.Manager.SceneParamsManager/SiteInfo>> (System.Collections.Generic.IEnumerable`1<System.ValueTuple`2<ProcessTools.Data.DataSourceBase, Script.LiRuochen.Manager.SceneParamsManager/SiteInfo>>,System.Action`1<System.ValueTuple`2<ProcessTools.Data.DataSourceBase, Script.LiRuochen.Manager.SceneParamsManager/SiteInfo>>) Script.LiRuochen.Manager.AdvanceGeologyForecastManager:OnDisable () (at Assets/Script/LiRuochen/Manager/AdvanceGeologyForecastManager.cs:268) ForecastPanel:OnDisable () (at Assets/Script/Wwx/UI/ForecastPanel.cs:396) ```
lrss3 added the bug label 2025-10-24 08:34:48 +08:00
Member

您好喵~让我来帮您分析这个断言失败的问题呢!

从错误堆栈来看,主要问题是当访问GlobalInstance时,断言go.IsActive()失败了。这通常发生在Unity对象生命周期管理出现问题时喵~

具体分析:

  1. 错误发生在AdvanceGeologyForecastManagerOnDisable方法中
  2. 尝试访问一个不销毁场景中的单例对象时
  3. 对象可能已经被Unity标记为销毁但还没完全销毁

建议解决方案:

  1. 添加空检查:在访问GlobalInstance前先检查对象是否有效
if(!SingleMonoBase<ManualDataSource>.IsValid)
{
    return;
}
  1. 修改执行顺序:确保在对象完全销毁前完成所有操作
void OnDisable()
{
    base.OnDisable();
    
    // 确保单例对象仍然有效
    if(SingleMonoBase<ManualDataSource>.IsValid)
    {
        // 执行StopAllCoroutines等操作
    }
}
  1. 考虑使用OnDestroy:如果需要在对象销毁时执行某些操作,可以考虑使用OnDestroy而不是OnDisable

  2. 检查DontDestroyOnLoad场景:确保单例对象正确地标记为DontDestroyOnLoad

需要我帮您查看具体的AdvanceGeologyForecastManager.cs文件内容吗?或者您想讨论其他可能的解决方案喵?

您好喵~让我来帮您分析这个断言失败的问题呢! 从错误堆栈来看,主要问题是当访问`GlobalInstance`时,断言`go.IsActive()`失败了。这通常发生在Unity对象生命周期管理出现问题时喵~ 具体分析: 1. 错误发生在`AdvanceGeologyForecastManager`的`OnDisable`方法中 2. 尝试访问一个不销毁场景中的单例对象时 3. 对象可能已经被Unity标记为销毁但还没完全销毁 建议解决方案: 1. **添加空检查**:在访问`GlobalInstance`前先检查对象是否有效 ```csharp if(!SingleMonoBase<ManualDataSource>.IsValid) { return; } ``` 2. **修改执行顺序**:确保在对象完全销毁前完成所有操作 ```csharp void OnDisable() { base.OnDisable(); // 确保单例对象仍然有效 if(SingleMonoBase<ManualDataSource>.IsValid) { // 执行StopAllCoroutines等操作 } } ``` 3. **考虑使用`OnDestroy`**:如果需要在对象销毁时执行某些操作,可以考虑使用`OnDestroy`而不是`OnDisable` 4. **检查DontDestroyOnLoad场景**:确保单例对象正确地标记为DontDestroyOnLoad 需要我帮您查看具体的`AdvanceGeologyForecastManager.cs`文件内容吗?或者您想讨论其他可能的解决方案喵?
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: LiRuochen_WorkFlow/XericLibrary-Publish#27