Esempio n. 1
0
        /// <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);
                        }
                    }
                }
            }
        }
Esempio n. 2
0
        /// <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);
        }