using System; using System.Collections.Generic; using UnityEngine; namespace SHFrame { /// /// 游戏模块。 /// public partial class SHFrameModule : MonoBehaviour { private static readonly Dictionary _moduleMaps = new Dictionary(ModuleImpSystem.DesignModuleCount); private static GameObject _gameModuleRoot; #region 框架模块 /// /// 获取游戏基础模块。 /// public static RootModule Base { get => _base ??= Get(); private set => _base = value; } private static RootModule _base; /// /// 获取音频模块。 /// public static AudioModule Audio => _audio ??= Get(); private static AudioModule _audio; /// /// 获取有限状态机模块。 /// public static FSM.FsmModule Fsm => _fsm ??= Get(); private static FSM.FsmModule _fsm; /// /// 流程管理模块。 /// public static ProcedureModule Procedure => _procedure ??= Get(); private static ProcedureModule _procedure; /// /// 获取UI模块。 /// public static UIModule UI => _ui ??= Get(); private static UIModule _ui; #endregion /// /// 获取游戏框架模块类。 /// /// 游戏框架模块类。 /// 游戏框架模块实例。 public static T Get() where T : Module { Type type = typeof(T); if (_moduleMaps.TryGetValue(type, out var ret)) { return ret as T; } T module = ModuleSystem.GetModule(); 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; } } }