//------------------------------------------------------------ // Game Framework // Copyright © 2013-2021 loyalsoft. All rights reserved. // Homepage: http://www.game7000.com/ // Feedback: http://www.game7000.com/ //------------------------------------------------------------ using GameFramework; using GameFramework.Localization; using GameFramework.Resource; using System; using UnityEngine; namespace UnityGameFramework.Runtime { /// /// 基础组件。 /// [DisallowMultipleComponent] [AddComponentMenu("Game Framework/Base")] public sealed class BaseComponent : GameFrameworkComponent { private const int DefaultDpi = 96; // default windows dpi private float m_GameSpeedBeforePause = 1f; [SerializeField] private bool m_EditorResourceMode = true; [SerializeField] private Language m_EditorLanguage = Language.Unspecified; [SerializeField] private string m_VersionHelperTypeName = "UnityGameFramework.Runtime.DefaultVersionHelper"; [SerializeField] private string m_LogHelperTypeName = "UnityGameFramework.Runtime.DefaultLogHelper"; [SerializeField] private string m_CompressionHelperTypeName = "UnityGameFramework.Runtime.DefaultCompressionHelper"; [SerializeField] private string m_JsonHelperTypeName = "UnityGameFramework.Runtime.DefaultJsonHelper"; [SerializeField] private int m_FrameRate = 30; [SerializeField] private float m_GameSpeed = 1f; [SerializeField] private bool m_RunInBackground = true; [SerializeField] private bool m_NeverSleep = true; /// /// 获取或设置是否使用编辑器资源模式(仅编辑器内有效)。 /// public bool EditorResourceMode { get { return m_EditorResourceMode; } set { m_EditorResourceMode = value; } } /// /// 获取或设置编辑器语言(仅编辑器内有效)。 /// public Language EditorLanguage { get { return m_EditorLanguage; } set { m_EditorLanguage = value; } } /// /// 获取或设置编辑器资源辅助器。 /// public IResourceManager EditorResourceHelper { get; set; } /// /// 获取或设置游戏帧率。 /// public int FrameRate { get { return m_FrameRate; } set { Application.targetFrameRate = m_FrameRate = value; } } /// /// 获取或设置游戏速度。 /// public float GameSpeed { get { return m_GameSpeed; } set { Time.timeScale = m_GameSpeed = value >= 0f ? value : 0f; } } /// /// 获取游戏是否暂停。 /// public bool IsGamePaused { get { return m_GameSpeed <= 0f; } } /// /// 获取是否正常游戏速度。 /// public bool IsNormalGameSpeed { get { return m_GameSpeed == 1f; } } /// /// 获取或设置是否允许后台运行。 /// public bool RunInBackground { get { return m_RunInBackground; } set { Application.runInBackground = m_RunInBackground = value; } } /// /// 获取或设置是否禁止休眠。 /// public bool NeverSleep { get { return m_NeverSleep; } set { m_NeverSleep = value; Screen.sleepTimeout = value ? SleepTimeout.NeverSleep : SleepTimeout.SystemSetting; } } /// /// 游戏框架组件初始化。 /// protected override void Awake() { base.Awake(); InitVersionHelper(); InitLogHelper(); Log.Info("Game Framework Version: {0}", GameFramework.Version.GameFrameworkVersion); Log.Info("Game Version: {0} ({1})", GameFramework.Version.GameVersion, GameFramework.Version.InternalGameVersion.ToString()); Log.Info("Unity Version: {0}", Application.unityVersion); #if UNITY_5_3_OR_NEWER || UNITY_5_3 InitCompressionHelper(); InitJsonHelper(); Utility.Converter.ScreenDpi = Screen.dpi; if (Utility.Converter.ScreenDpi <= 0) { Utility.Converter.ScreenDpi = DefaultDpi; } m_EditorResourceMode &= Application.isEditor; if (m_EditorResourceMode) { Log.Info("During this run, Game Framework will use editor resource files, which you should validate first."); } Application.targetFrameRate = m_FrameRate; Time.timeScale = m_GameSpeed; Application.runInBackground = m_RunInBackground; Screen.sleepTimeout = m_NeverSleep ? SleepTimeout.NeverSleep : SleepTimeout.SystemSetting; #else Log.Error("Game Framework only applies with Unity 5.3 and above, but current Unity version is {0}.", Application.unityVersion); GameEntry.Shutdown(ShutdownType.Quit); #endif #if UNITY_5_6_OR_NEWER Application.lowMemory += OnLowMemory; #endif } private void Start() { } private void Update() { GameFrameworkEntry.Update(Time.deltaTime, Time.unscaledDeltaTime); } private void OnApplicationQuit() { #if UNITY_5_6_OR_NEWER Application.lowMemory -= OnLowMemory; #endif StopAllCoroutines(); } private void OnDestroy() { GameFrameworkEntry.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 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)); } GameFramework.Version.IVersionHelper versionHelper = (GameFramework.Version.IVersionHelper)Activator.CreateInstance(versionHelperType); if (versionHelper == null) { throw new GameFrameworkException(Utility.Text.Format("Can not create version helper instance '{0}'.", m_VersionHelperTypeName)); } GameFramework.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 InitCompressionHelper() { if (string.IsNullOrEmpty(m_CompressionHelperTypeName)) { return; } Type compressionHelperType = Utility.Assembly.GetType(m_CompressionHelperTypeName); if (compressionHelperType == null) { Log.Error("Can not find compression helper type '{0}'.", m_CompressionHelperTypeName); return; } Utility.Compression.ICompressionHelper compressionHelper = (Utility.Compression.ICompressionHelper)Activator.CreateInstance(compressionHelperType); if (compressionHelper == null) { Log.Error("Can not create compression helper instance '{0}'.", m_CompressionHelperTypeName); return; } Utility.Compression.SetCompressionHelper(compressionHelper); } 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.Info("Low memory reported..."); ObjectPoolComponent objectPoolComponent = GameEntry.GetComponent(); if (objectPoolComponent != null) { objectPoolComponent.ReleaseAllUnused(); } ResourceComponent resourceCompoent = GameEntry.GetComponent(); if (resourceCompoent != null) { resourceCompoent.ForceUnloadUnusedAssets(true); } } } }