using System; using UnityEngine; namespace SHFrame { /// /// 基础模块。 /// [DisallowMultipleComponent] public sealed class RootModule : Module { private const int DefaultDpi = 96; // default windows dpi private float m_GameSpeedBeforePause = 1f; // [SerializeField] // private Language m_EditorLanguage = Language.Unspecified; [SerializeField] private string m_TextHelperTypeName = "SHFrame.DefaultTextHelper"; [SerializeField] private string m_VersionHelperTypeName = "SHFrame.DefaultVersionHelper"; [SerializeField] private string m_LogHelperTypeName = "SHFrame.DefaultLogHelper"; [SerializeField] private string m_JsonHelperTypeName = "SHFrame.DefaultJsonHelper"; [SerializeField] private int m_FrameRate = 120; [SerializeField] private float m_GameSpeed = 1f; [SerializeField] private bool m_RunInBackground = true; [SerializeField] private bool m_NeverSleep = true; // /// // /// 获取或设置编辑器语言(仅编辑器内有效)。 // /// // public Language EditorLanguage // { // get => m_EditorLanguage; // set => m_EditorLanguage = value; // } /// /// 获取或设置游戏帧率。 /// public int FrameRate { get => m_FrameRate; set => Application.targetFrameRate = m_FrameRate = value; } /// /// 获取或设置游戏速度。 /// public float GameSpeed { get => m_GameSpeed; set => Time.timeScale = m_GameSpeed = value >= 0f ? value : 0f; } /// /// 获取游戏是否暂停。 /// public bool IsGamePaused => m_GameSpeed <= 0f; /// /// 获取是否正常游戏速度。 /// public bool IsNormalGameSpeed => Math.Abs(m_GameSpeed - 1f) < 0.01f; /// /// 获取或设置是否允许后台运行。 /// public bool RunInBackground { get => m_RunInBackground; set => Application.runInBackground = m_RunInBackground = value; } /// /// 获取或设置是否禁止休眠。 /// public bool NeverSleep { get => m_NeverSleep; set { m_NeverSleep = value; Screen.sleepTimeout = value ? SleepTimeout.NeverSleep : SleepTimeout.SystemSetting; } } /// /// 游戏框架模块初始化。 /// protected override void Awake() { base.Awake(); InitTextHelper(); InitVersionHelper(); InitLogHelper(); Log.Info("Version: {0}", Version.GameFrameworkVersion); Log.Info("Game Version: {0} ({1})", Version.GameVersion, Version.InternalGameVersion); Log.Info("Unity Version: {0}", Application.unityVersion); InitJsonHelper(); Utility.Converter.ScreenDpi = Screen.dpi; if (Utility.Converter.ScreenDpi <= 0) { Utility.Converter.ScreenDpi = DefaultDpi; } Time.timeScale = m_GameSpeed; Application.runInBackground = m_RunInBackground; Screen.sleepTimeout = m_NeverSleep ? SleepTimeout.NeverSleep : SleepTimeout.SystemSetting; Application.lowMemory += OnLowMemory; GameTime.StartFrame(); } private void Update() { GameTime.StartFrame(); ModuleImpSystem.Update(GameTime.deltaTime, GameTime.unscaledDeltaTime); } private void FixedUpdate() { GameTime.StartFrame(); } private void LateUpdate() { GameTime.StartFrame(); } private void OnApplicationQuit() { Application.lowMemory -= OnLowMemory; StopAllCoroutines(); } private void OnDestroy() { ModuleImpSystem.Shutdown(); } /// /// 暂停游戏。 /// public void PauseGame() { if (IsGamePaused) { return; } m_GameSpeedBeforePause = GameSpeed; GameSpeed = 0f; } /// /// 恢复游戏。 /// public void ResumeGame() { if (!IsGamePaused) { return; } GameSpeed = m_GameSpeedBeforePause; } /// /// 重置为正常游戏速度。 /// public void ResetNormalGameSpeed() { if (IsNormalGameSpeed) { return; } GameSpeed = 1f; } internal void Shutdown() { Destroy(gameObject); } private void InitTextHelper() { if (string.IsNullOrEmpty(m_TextHelperTypeName)) { return; } Type textHelperType = Utility.Assembly.GetType(m_TextHelperTypeName); if (textHelperType == null) { Log.Error("Can not find text helper type '{0}'.", m_TextHelperTypeName); return; } Utility.Text.ITextHelper textHelper = (Utility.Text.ITextHelper)Activator.CreateInstance(textHelperType); if (textHelper == null) { Log.Error("Can not create text helper instance '{0}'.", m_TextHelperTypeName); return; } Utility.Text.SetTextHelper(textHelper); } private void InitVersionHelper() { if (string.IsNullOrEmpty(m_VersionHelperTypeName)) { return; } Type versionHelperType = Utility.Assembly.GetType(m_VersionHelperTypeName); if (versionHelperType == null) { throw new GameFrameworkException(Utility.Text.Format("Can not find version helper type '{0}'.", m_VersionHelperTypeName)); } Version.IVersionHelper versionHelper = (Version.IVersionHelper)Activator.CreateInstance(versionHelperType); if (versionHelper == null) { throw new GameFrameworkException(Utility.Text.Format("Can not create version helper instance '{0}'.", m_VersionHelperTypeName)); } Version.SetVersionHelper(versionHelper); } private void InitLogHelper() { if (string.IsNullOrEmpty(m_LogHelperTypeName)) { return; } Type logHelperType = Utility.Assembly.GetType(m_LogHelperTypeName); if (logHelperType == null) { throw new GameFrameworkException(Utility.Text.Format("Can not find log helper type '{0}'.", m_LogHelperTypeName)); } GameFrameworkLog.ILogHelper logHelper = (GameFrameworkLog.ILogHelper)Activator.CreateInstance(logHelperType); if (logHelper == null) { throw new GameFrameworkException(Utility.Text.Format("Can not create log helper instance '{0}'.", m_LogHelperTypeName)); } GameFrameworkLog.SetLogHelper(logHelper); } private void InitJsonHelper() { if (string.IsNullOrEmpty(m_JsonHelperTypeName)) { return; } Type jsonHelperType = Utility.Assembly.GetType(m_JsonHelperTypeName); if (jsonHelperType == null) { Log.Error("Can not find JSON helper type '{0}'.", m_JsonHelperTypeName); return; } Utility.Json.IJsonHelper jsonHelper = (Utility.Json.IJsonHelper)Activator.CreateInstance(jsonHelperType); if (jsonHelper == null) { Log.Error("Can not create JSON helper instance '{0}'.", m_JsonHelperTypeName); return; } Utility.Json.SetJsonHelper(jsonHelper); } private void OnLowMemory() { Log.Warning("Low memory reported..."); ObjectPoolModule objectPoolModule = ModuleSystem.GetModule(); if (objectPoolModule != null) { objectPoolModule.ReleaseAllUnused(); } // 卸载所有不在使用的资源 // ResourceModule resourceModule = ModuleSystem.GetModule(); // if (resourceModule != null) // { // resourceModule.ForceUnloadUnusedAssets(true); // } } } }