/// <summary> /// 清除可能会冲突的实例(尽管禁用UIDate后再载入存档一般可以顺利进行,但游戏特殊情况仍会卡读档,在游戏开发稳定之前双保险) /// </summary> /// <returns></returns> private static bool Prefix(DateFile.LegendBook loadDate) { if (LoadFile.OnLoad) { LoadFile.OnLoad = false; #if DEBUG var m_Container = ReflectionMethod.GetValue <SingletonObject, GameObject>(null, "m_Container"); Main.Logger.Log($"DateFile_Loadloadlegend: Is m_Container null? {m_Container == null}"); foreach (string key in m_SingletonMap.Keys) { Main.Logger.Log($"DateFile_Loadloadlegend m_SingletonMap keys {key}"); } #endif // 清除需要清除的实例(仿自 SingletonObject.ClearInstances) foreach (var inst in instancesToRemove) { if (SingletonMap.TryGetValue(inst, out object item) && !DontClearList.Contains(item)) { (item as IDisposable)?.Dispose(); if (item is Component cmp) { UnityEngine.Object.Destroy(cmp); } SingletonMap.Remove(inst); } } // 清除Subsystem中可能存在冲突的实例 SubSystems.OnUnloadGameData(); } return(true); }
private static bool Prefix(DateFile.LegendBook loadDate) { if (Main.onLoad) { Main.onLoad = false; Dictionary <string, object> m_SingletonMap = ReflectionMethod.GetValue <SingletonObject, Dictionary <string, object> >("m_SingletonMap"); List <Type> dontClearList = ReflectionMethod.GetValue <SingletonObject, List <Type> >("dontClearList"); #if DEBUG GameObject m_Container = ReflectionMethod.GetValue <SingletonObject, GameObject>("m_Container"); Main.Logger.Log($"DateFile_Loadloadlegend: Is m_Container null? {m_Container == null}"); foreach (string key in m_SingletonMap.Keys) { Main.Logger.Log($"DateFile_Loadloadlegend m_SingletonMap keys {key}"); } #endif // 清除需要清除的实例 for (int i = 0; i < instancesToRemove.Length; i++) { if (m_SingletonMap.TryGetValue(instancesToRemove[i], out object item) && !dontClearList.Contains(item)) { (item as IDisposable)?.Dispose(); if (item.GetType().IsSubclassOf(typeof(Component))) { UnityEngine.Object.Destroy(item as Component); } m_SingletonMap.Remove(instancesToRemove[i]); } } } return(true); }
/// <summary> /// 获取存档内容 /// </summary> /// <param name="path"></param> /// <param name="rijndeal"></param> /// <returns></returns> private static DateFile.SaveDate ReadSaveDate(string path, bool rijndeal) { if (!File.Exists(path)) { return(null); } return(ReflectionMethod.Invoke <SaveDateFile, DateFile.SaveDate>( SaveDateFile.instance, "GetData", path, typeof(DateFile.SaveDate), rijndeal // 参数 )); }