using System; using System.Collections.Generic; using UnityEngine; namespace SHFrame { /// <summary> /// 游戏模块。 /// </summary> public partial class SHFrameModule : MonoBehaviour { private static readonly Dictionary<Type, Module> _moduleMaps = new Dictionary<Type, Module>(ModuleImpSystem.DesignModuleCount); private static GameObject _gameModuleRoot; #region 框架模块 /// <summary> /// 获取游戏基础模块。 /// </summary> public static RootModule Base { get => _base ??= Get<RootModule>(); private set => _base = value; } private static RootModule _base; /// <summary> /// 获取音频模块。 /// </summary> public static AudioModule Audio => _audio ??= Get<AudioModule>(); private static AudioModule _audio; /// <summary> /// 获取有限状态机模块。 /// </summary> public static FSM.FsmModule Fsm => _fsm ??= Get<FSM.FsmModule>(); private static FSM.FsmModule _fsm; /// <summary> /// 流程管理模块。 /// </summary> public static ProcedureModule Procedure => _procedure ??= Get<ProcedureModule>(); private static ProcedureModule _procedure; /// <summary> /// 获取UI模块。 /// </summary> public static UIModule UI => _ui ??= Get<UIModule>(); private static UIModule _ui; #endregion /// <summary> /// 获取游戏框架模块类。 /// </summary> /// <typeparam name="T">游戏框架模块类。</typeparam> /// <returns>游戏框架模块实例。</returns> public static T Get<T>() where T : Module { Type type = typeof(T); if (_moduleMaps.TryGetValue(type, out var ret)) { return ret as T; } T module = ModuleSystem.GetModule<T>(); Log.Assert(condition: module != null, $"{typeof(T)} is null"); _moduleMaps.Add(type, module); return module; } private void Start() { Log.Info("GameModule Active"); _gameModuleRoot = gameObject; _gameModuleRoot.name = $"[{nameof(SHFrameModule)}]"; DontDestroyOnLoad(_gameModuleRoot); } public static void Shutdown(ShutdownType shutdownType) { Log.Info("GameModule Shutdown"); if (_gameModuleRoot != null) { Destroy(_gameModuleRoot); _gameModuleRoot = null; } _moduleMaps.Clear(); _base = null; _audio = null; _procedure = null; } } }