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