//------------------------------------------------------------
// 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);
}
}
}
}