/// <summary> /// 关闭一个模块 /// </summary> /// <param name="moduleType">模块类型</typeparam> /// <param name="shutdownAllDependentModule">是否卸载其依赖的模块(当没有其它模块也依赖它时)</param> public static void ShutdownModule(Type moduleType, bool shutdownAllDependentModule = false) { CheckShutdownSafe(moduleType); IGameModule gameModule = null; foreach (var module in m_GameModules) { if (module.GetType() == moduleType) { gameModule = module; gameModule.Shutdown(); break; } } m_GameModules.Remove(gameModule); // 特殊处理 var tempType = moduleType.BaseType; var genericTypeDefinition = typeof(GameModuleBase <>); while (tempType != typeof(object)) { if (tempType.IsGenericType && tempType.GetGenericTypeDefinition() == genericTypeDefinition) { var field = tempType.GetField("m_instance", BindingFlags.Static | BindingFlags.NonPublic); field.SetValue(null, null); break; } tempType = tempType.BaseType; } // 依赖模块处理 if (m_DependenceDic.TryGetValue(moduleType.Name, out List <Type> dependentModules)) { m_DependenceDic.Remove(moduleType.Name); if (shutdownAllDependentModule) { // 卸载依赖模块 foreach (var dependentModule in dependentModules) { if (!HaveModuleDependent(dependentModule)) { ShutdownModule(dependentModule, shutdownAllDependentModule); } } } } }
/// <summary> /// 关闭一个模块 /// </summary> /// <typeparam name="T"></typeparam> public static void ShutdownModule <T>() where T : IGameModule { Type moduleType = typeof(T); IGameModule gameModule = null; foreach (var module in m_GameModules) { if (module.GetType() == moduleType) { gameModule = module; break; } } if (gameModule != null) { gameModule.Shutdown(); } m_GameModules.Remove(gameModule); }