//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 loyalsoft. All rights reserved.
// Homepage: http://www.game7000.com/
// Feedback: http://www.game7000.com/
//------------------------------------------------------------
using GameFramework;
using GameFramework.ObjectPool;
using GameFramework.Resource;
using GameFramework.UI;
using System.Collections.Generic;
using UnityEngine;
namespace UnityGameFramework.Runtime
{
///
/// 界面组件。
///
[DisallowMultipleComponent]
[AddComponentMenu("Game Framework/UI")]
public sealed partial class UIComponent : GameFrameworkComponent
{
private const int DefaultPriority = 0;
private IUIManager m_UIManager = null;
private EventComponent m_EventComponent = null;
private readonly List m_InternalUIFormResults = new List();
[SerializeField]
private bool m_EnableOpenUIFormSuccessEvent = true;
[SerializeField]
private bool m_EnableOpenUIFormFailureEvent = true;
[SerializeField]
private bool m_EnableOpenUIFormUpdateEvent = false;
[SerializeField]
private bool m_EnableOpenUIFormDependencyAssetEvent = false;
[SerializeField]
private bool m_EnableCloseUIFormCompleteEvent = true;
[SerializeField]
private float m_InstanceAutoReleaseInterval = 60f;
[SerializeField]
private int m_InstanceCapacity = 16;
[SerializeField]
private float m_InstanceExpireTime = 60f;
[SerializeField]
private int m_InstancePriority = 0;
[SerializeField]
private Transform m_InstanceRoot = null;
[SerializeField]
private string m_UIFormHelperTypeName = "UnityGameFramework.Runtime.DefaultUIFormHelper";
[SerializeField]
private UIFormHelperBase m_CustomUIFormHelper = null;
[SerializeField]
private string m_UIGroupHelperTypeName = "UnityGameFramework.Runtime.DefaultUIGroupHelper";
[SerializeField]
private UIGroupHelperBase m_CustomUIGroupHelper = null;
[SerializeField]
private UIGroup[] m_UIGroups = null;
///
/// 获取界面组数量。
///
public int UIGroupCount
{
get
{
return m_UIManager.UIGroupCount;
}
}
///
/// 获取或设置界面实例对象池自动释放可释放对象的间隔秒数。
///
public float InstanceAutoReleaseInterval
{
get
{
return m_UIManager.InstanceAutoReleaseInterval;
}
set
{
m_UIManager.InstanceAutoReleaseInterval = m_InstanceAutoReleaseInterval = value;
}
}
///
/// 获取或设置界面实例对象池的容量。
///
public int InstanceCapacity
{
get
{
return m_UIManager.InstanceCapacity;
}
set
{
m_UIManager.InstanceCapacity = m_InstanceCapacity = value;
}
}
///
/// 获取或设置界面实例对象池对象过期秒数。
///
public float InstanceExpireTime
{
get
{
return m_UIManager.InstanceExpireTime;
}
set
{
m_UIManager.InstanceExpireTime = m_InstanceExpireTime = value;
}
}
///
/// 获取或设置界面实例对象池的优先级。
///
public int InstancePriority
{
get
{
return m_UIManager.InstancePriority;
}
set
{
m_UIManager.InstancePriority = m_InstancePriority = value;
}
}
///
/// 游戏框架组件初始化。
///
protected override void Awake()
{
base.Awake();
m_UIManager = GameFrameworkEntry.GetModule();
if (m_UIManager == null)
{
Log.Fatal("UI manager is invalid.");
return;
}
if (m_EnableOpenUIFormSuccessEvent)
{
m_UIManager.OpenUIFormSuccess += OnOpenUIFormSuccess;
}
m_UIManager.OpenUIFormFailure += OnOpenUIFormFailure;
if (m_EnableOpenUIFormUpdateEvent)
{
m_UIManager.OpenUIFormUpdate += OnOpenUIFormUpdate;
}
if (m_EnableOpenUIFormDependencyAssetEvent)
{
m_UIManager.OpenUIFormDependencyAsset += OnOpenUIFormDependencyAsset;
}
if (m_EnableCloseUIFormCompleteEvent)
{
m_UIManager.CloseUIFormComplete += OnCloseUIFormComplete;
}
}
private void Start()
{
BaseComponent baseComponent = GameEntry.GetComponent();
if (baseComponent == null)
{
Log.Fatal("Base component is invalid.");
return;
}
m_EventComponent = GameEntry.GetComponent();
if (m_EventComponent == null)
{
Log.Fatal("Event component is invalid.");
return;
}
if (baseComponent.EditorResourceMode)
{
m_UIManager.SetResourceManager(baseComponent.EditorResourceHelper);
}
else
{
m_UIManager.SetResourceManager(GameFrameworkEntry.GetModule());
}
m_UIManager.SetObjectPoolManager(GameFrameworkEntry.GetModule());
m_UIManager.InstanceAutoReleaseInterval = m_InstanceAutoReleaseInterval;
m_UIManager.InstanceCapacity = m_InstanceCapacity;
m_UIManager.InstanceExpireTime = m_InstanceExpireTime;
m_UIManager.InstancePriority = m_InstancePriority;
UIFormHelperBase uiFormHelper = Helper.CreateHelper(m_UIFormHelperTypeName, m_CustomUIFormHelper);
if (uiFormHelper == null)
{
Log.Error("Can not create UI form helper.");
return;
}
uiFormHelper.name = "UI Form Helper";
Transform transform = uiFormHelper.transform;
transform.SetParent(this.transform);
transform.localScale = Vector3.one;
m_UIManager.SetUIFormHelper(uiFormHelper);
if (m_InstanceRoot == null)
{
m_InstanceRoot = new GameObject("UI Form Instances").transform;
m_InstanceRoot.SetParent(gameObject.transform);
m_InstanceRoot.localScale = Vector3.one;
}
m_InstanceRoot.gameObject.layer = LayerMask.NameToLayer("UI");
for (int i = 0; i < m_UIGroups.Length; i++)
{
if (!AddUIGroup(m_UIGroups[i].Name, m_UIGroups[i].Depth))
{
Log.Warning("Add UI group '{0}' failure.", m_UIGroups[i].Name);
continue;
}
}
}
///
/// 是否存在界面组。
///
/// 界面组名称。
/// 是否存在界面组。
public bool HasUIGroup(string uiGroupName)
{
return m_UIManager.HasUIGroup(uiGroupName);
}
///
/// 获取界面组。
///
/// 界面组名称。
/// 要获取的界面组。
public IUIGroup GetUIGroup(string uiGroupName)
{
return m_UIManager.GetUIGroup(uiGroupName);
}
///
/// 获取所有界面组。
///
/// 所有界面组。
public IUIGroup[] GetAllUIGroups()
{
return m_UIManager.GetAllUIGroups();
}
///
/// 获取所有界面组。
///
/// 所有界面组。
public void GetAllUIGroups(List results)
{
m_UIManager.GetAllUIGroups(results);
}
///
/// 增加界面组。
///
/// 界面组名称。
/// 是否增加界面组成功。
public bool AddUIGroup(string uiGroupName)
{
return AddUIGroup(uiGroupName, 0);
}
///
/// 增加界面组。
///
/// 界面组名称。
/// 界面组深度。
/// 是否增加界面组成功。
public bool AddUIGroup(string uiGroupName, int depth)
{
if (m_UIManager.HasUIGroup(uiGroupName))
{
return false;
}
UIGroupHelperBase uiGroupHelper = Helper.CreateHelper(m_UIGroupHelperTypeName, m_CustomUIGroupHelper, UIGroupCount);
if (uiGroupHelper == null)
{
Log.Error("Can not create UI group helper.");
return false;
}
uiGroupHelper.name = Utility.Text.Format("UI Group - {0}", uiGroupName);
uiGroupHelper.gameObject.layer = LayerMask.NameToLayer("UI");
Transform transform = uiGroupHelper.transform;
transform.SetParent(m_InstanceRoot);
transform.localScale = Vector3.one;
return m_UIManager.AddUIGroup(uiGroupName, depth, uiGroupHelper);
}
///
/// 是否存在界面。
///
/// 界面序列编号。
/// 是否存在界面。
public bool HasUIForm(int serialId)
{
return m_UIManager.HasUIForm(serialId);
}
///
/// 是否存在界面。
///
/// 界面资源名称。
/// 是否存在界面。
public bool HasUIForm(string uiFormAssetName)
{
return m_UIManager.HasUIForm(uiFormAssetName);
}
///
/// 获取界面。
///
/// 界面序列编号。
/// 要获取的界面。
public UIForm GetUIForm(int serialId)
{
return (UIForm)m_UIManager.GetUIForm(serialId);
}
///
/// 获取界面。
///
/// 界面资源名称。
/// 要获取的界面。
public UIForm GetUIForm(string uiFormAssetName)
{
return (UIForm)m_UIManager.GetUIForm(uiFormAssetName);
}
///
/// 获取界面。
///
/// 界面资源名称。
/// 要获取的界面。
public UIForm[] GetUIForms(string uiFormAssetName)
{
IUIForm[] uiForms = m_UIManager.GetUIForms(uiFormAssetName);
UIForm[] uiFormImpls = new UIForm[uiForms.Length];
for (int i = 0; i < uiForms.Length; i++)
{
uiFormImpls[i] = (UIForm)uiForms[i];
}
return uiFormImpls;
}
///
/// 获取界面。
///
/// 界面资源名称。
/// 要获取的界面。
public void GetUIForms(string uiFormAssetName, List results)
{
if (results == null)
{
Log.Error("Results is invalid.");
return;
}
results.Clear();
m_UIManager.GetUIForms(uiFormAssetName, m_InternalUIFormResults);
foreach (IUIForm uiForm in m_InternalUIFormResults)
{
results.Add((UIForm)uiForm);
}
}
///
/// 获取所有已加载的界面。
///
/// 所有已加载的界面。
public UIForm[] GetAllLoadedUIForms()
{
IUIForm[] uiForms = m_UIManager.GetAllLoadedUIForms();
UIForm[] uiFormImpls = new UIForm[uiForms.Length];
for (int i = 0; i < uiForms.Length; i++)
{
uiFormImpls[i] = (UIForm)uiForms[i];
}
return uiFormImpls;
}
///
/// 获取所有已加载的界面。
///
/// 所有已加载的界面。
public void GetAllLoadedUIForms(List results)
{
if (results == null)
{
Log.Error("Results is invalid.");
return;
}
results.Clear();
m_UIManager.GetAllLoadedUIForms(m_InternalUIFormResults);
foreach (IUIForm uiForm in m_InternalUIFormResults)
{
results.Add((UIForm)uiForm);
}
}
///
/// 获取所有正在加载界面的序列编号。
///
/// 所有正在加载界面的序列编号。
public int[] GetAllLoadingUIFormSerialIds()
{
return m_UIManager.GetAllLoadingUIFormSerialIds();
}
///
/// 获取所有正在加载界面的序列编号。
///
/// 所有正在加载界面的序列编号。
public void GetAllLoadingUIFormSerialIds(List results)
{
m_UIManager.GetAllLoadingUIFormSerialIds(results);
}
///
/// 是否正在加载界面。
///
/// 界面序列编号。
/// 是否正在加载界面。
public bool IsLoadingUIForm(int serialId)
{
return m_UIManager.IsLoadingUIForm(serialId);
}
///
/// 是否正在加载界面。
///
/// 界面资源名称。
/// 是否正在加载界面。
public bool IsLoadingUIForm(string uiFormAssetName)
{
return m_UIManager.IsLoadingUIForm(uiFormAssetName);
}
///
/// 是否是合法的界面。
///
/// 界面。
/// 界面是否合法。
public bool IsValidUIForm(UIForm uiForm)
{
return m_UIManager.IsValidUIForm(uiForm);
}
///
/// 打开界面。
///
/// 界面资源名称。
/// 界面组名称。
/// 界面的序列编号。
public int OpenUIForm(string uiFormAssetName, string uiGroupName)
{
return OpenUIForm(uiFormAssetName, uiGroupName, DefaultPriority, false, null);
}
///
/// 打开界面。
///
/// 界面资源名称。
/// 界面组名称。
/// 加载界面资源的优先级。
/// 界面的序列编号。
public int OpenUIForm(string uiFormAssetName, string uiGroupName, int priority)
{
return OpenUIForm(uiFormAssetName, uiGroupName, priority, false, null);
}
///
/// 打开界面。
///
/// 界面资源名称。
/// 界面组名称。
/// 是否暂停被覆盖的界面。
/// 界面的序列编号。
public int OpenUIForm(string uiFormAssetName, string uiGroupName, bool pauseCoveredUIForm)
{
return OpenUIForm(uiFormAssetName, uiGroupName, DefaultPriority, pauseCoveredUIForm, null);
}
///
/// 打开界面。
///
/// 界面资源名称。
/// 界面组名称。
/// 用户自定义数据。
/// 界面的序列编号。
public int OpenUIForm(string uiFormAssetName, string uiGroupName, object userData)
{
return OpenUIForm(uiFormAssetName, uiGroupName, DefaultPriority, false, userData);
}
///
/// 打开界面。
///
/// 界面资源名称。
/// 界面组名称。
/// 加载界面资源的优先级。
/// 是否暂停被覆盖的界面。
/// 界面的序列编号。
public int OpenUIForm(string uiFormAssetName, string uiGroupName, int priority, bool pauseCoveredUIForm)
{
return OpenUIForm(uiFormAssetName, uiGroupName, priority, pauseCoveredUIForm, null);
}
///
/// 打开界面。
///
/// 界面资源名称。
/// 界面组名称。
/// 加载界面资源的优先级。
/// 用户自定义数据。
/// 界面的序列编号。
public int OpenUIForm(string uiFormAssetName, string uiGroupName, int priority, object userData)
{
return OpenUIForm(uiFormAssetName, uiGroupName, priority, false, userData);
}
///
/// 打开界面。
///
/// 界面资源名称。
/// 界面组名称。
/// 是否暂停被覆盖的界面。
/// 用户自定义数据。
/// 界面的序列编号。
public int OpenUIForm(string uiFormAssetName, string uiGroupName, bool pauseCoveredUIForm, object userData)
{
return OpenUIForm(uiFormAssetName, uiGroupName, DefaultPriority, pauseCoveredUIForm, userData);
}
///
/// 打开界面。
///
/// 界面资源名称。
/// 界面组名称。
/// 加载界面资源的优先级。
/// 是否暂停被覆盖的界面。
/// 用户自定义数据。
/// 界面的序列编号。
public int OpenUIForm(string uiFormAssetName, string uiGroupName, int priority, bool pauseCoveredUIForm, object userData)
{
return m_UIManager.OpenUIForm(uiFormAssetName, uiGroupName, priority, pauseCoveredUIForm, userData);
}
///
/// 关闭界面。
///
/// 要关闭界面的序列编号。
public void CloseUIForm(int serialId)
{
m_UIManager.CloseUIForm(serialId);
}
///
/// 关闭界面。
///
/// 要关闭界面的序列编号。
/// 用户自定义数据。
public void CloseUIForm(int serialId, object userData)
{
m_UIManager.CloseUIForm(serialId, userData);
}
///
/// 关闭界面。
///
/// 要关闭的界面。
public void CloseUIForm(UIForm uiForm)
{
m_UIManager.CloseUIForm(uiForm);
}
///
/// 关闭界面。
///
/// 要关闭的界面。
/// 用户自定义数据。
public void CloseUIForm(UIForm uiForm, object userData)
{
m_UIManager.CloseUIForm(uiForm, userData);
}
///
/// 关闭所有已加载的界面。
///
public void CloseAllLoadedUIForms()
{
m_UIManager.CloseAllLoadedUIForms();
}
///
/// 关闭所有已加载的界面。
///
/// 用户自定义数据。
public void CloseAllLoadedUIForms(object userData)
{
m_UIManager.CloseAllLoadedUIForms(userData);
}
///
/// 关闭所有正在加载的界面。
///
public void CloseAllLoadingUIForms()
{
m_UIManager.CloseAllLoadingUIForms();
}
///
/// 激活界面。
///
/// 要激活的界面。
public void RefocusUIForm(UIForm uiForm)
{
m_UIManager.RefocusUIForm(uiForm);
}
///
/// 激活界面。
///
/// 要激活的界面。
/// 用户自定义数据。
public void RefocusUIForm(UIForm uiForm, object userData)
{
m_UIManager.RefocusUIForm(uiForm, userData);
}
///
/// 设置界面是否被加锁。
///
/// 要设置是否被加锁的界面。
/// 界面是否被加锁。
public void SetUIFormInstanceLocked(UIForm uiForm, bool locked)
{
if (uiForm == null)
{
Log.Warning("UI form is invalid.");
return;
}
m_UIManager.SetUIFormInstanceLocked(uiForm.gameObject, locked);
}
///
/// 设置界面的优先级。
///
/// 要设置优先级的界面。
/// 界面优先级。
public void SetUIFormInstancePriority(UIForm uiForm, int priority)
{
if (uiForm == null)
{
Log.Warning("UI form is invalid.");
return;
}
m_UIManager.SetUIFormInstancePriority(uiForm.gameObject, priority);
}
private void OnOpenUIFormSuccess(object sender, GameFramework.UI.OpenUIFormSuccessEventArgs e)
{
m_EventComponent.Fire(this, OpenUIFormSuccessEventArgs.Create(e));
}
private void OnOpenUIFormFailure(object sender, GameFramework.UI.OpenUIFormFailureEventArgs e)
{
Log.Warning("Open UI form failure, asset name '{0}', UI group name '{1}', pause covered UI form '{2}', error message '{3}'.", e.UIFormAssetName, e.UIGroupName, e.PauseCoveredUIForm.ToString(), e.ErrorMessage);
if (m_EnableOpenUIFormFailureEvent)
{
m_EventComponent.Fire(this, OpenUIFormFailureEventArgs.Create(e));
}
}
private void OnOpenUIFormUpdate(object sender, GameFramework.UI.OpenUIFormUpdateEventArgs e)
{
m_EventComponent.Fire(this, OpenUIFormUpdateEventArgs.Create(e));
}
private void OnOpenUIFormDependencyAsset(object sender, GameFramework.UI.OpenUIFormDependencyAssetEventArgs e)
{
m_EventComponent.Fire(this, OpenUIFormDependencyAssetEventArgs.Create(e));
}
private void OnCloseUIFormComplete(object sender, GameFramework.UI.CloseUIFormCompleteEventArgs e)
{
m_EventComponent.Fire(this, CloseUIFormCompleteEventArgs.Create(e));
}
}
}