功能:
显示,再显示,冻结,隐藏,拖拽,单击显示到最前面
模式:
正常窗口,模态窗口
using UnityEngine;
public class BaseWindow :MonoBehaviour {
public virtual void InitWindow()
{
}
}
public interface IUIAnimation
{
void EnterAnimation();
void PauseAnimation();
void ExitAnimation();
}
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum UIWindowType
{
Normal,
/// <summary>
/// 模态窗口
/// </summary>
PopUp
}
public enum UIWindowShowMode
{
DoNothing,
/// <summary>
/// 关闭其他窗口,不破坏导航,当关闭时会显示上一个窗口
/// </summary>
HideOther,
/// <summary>
/// 关闭其他窗口,并破坏导航
/// </summary>
NoNeedBack
}
public class UIBaseWindow : BaseWindow
{
#region field
[HideInInspector]
public GameObject m_Panel;
public bool m_IsClickPanelClose;
[Range(0, 1)] public float m_Alpha;
public float m_CloseTimer;
public IUIAnimation m_UIAnimation;
public UIWindowType m_UIWindowType;
public UIWindowShowMode m_UIWindowShowMode;
public GameObject m_DragGameObject;
public GameObject[] m_ShowButton;
public GameObject[] m_CloseButton;
public List<GameObject> m_FrontGameObject;
public Action<UIBaseWindow> ShowEvent;
public Action<UIBaseWindow> CloseEvent;
private Vector3 m_MouseOffset;
private Transform m_Transform;
#region encapsulation
private Transform MyTransform
{
get
{
if (m_Transform == null)
m_Transform = transform;
return m_Transform;
}
}
#endregion
#endregion
#region public function
public override void InitWindow() { }
public void OnShow()
{
if (null != ShowEvent)
ShowEvent(this);
if (m_UIWindowType == UIWindowType.PopUp)
m_Panel.transform.SetAsLastSibling();
else
MyTransform.SetAsLastSibling();
gameObject.SetActive(true);
if (null != m_UIAnimation)
m_UIAnimation.EnterAnimation();
if (m_IsClickPanelClose)
EventListener.Get(m_Panel).onClick += OnClose;
}
public void OnClose()
{
if (null != m_UIAnimation)
m_UIAnimation.ExitAnimation();
if (CloseEvent != null)
CloseEvent(this);
if (m_IsClickPanelClose)
EventListener.Get(m_Panel).onClick -= OnClose;
StartCoroutine(CloseAnimation(m_CloseTimer));
}
public void OnSelect()
{
MyTransform.SetAsLastSibling();
m_MouseOffset = MyTransform.position - Input.mousePosition;
}
public void OnDrag(Vector3 pos)
{
MyTransform.position = Input.mousePosition + m_MouseOffset;
}
public void OnFront()
{
MyTransform.SetAsLastSibling();
}
#endregion
#region private function
private IEnumerator CloseAnimation(float timer)
{
yield return new WaitForSeconds(timer);
gameObject.SetActive(false);
if (m_UIWindowType == UIWindowType.PopUp)
gameObject.transform.parent.gameObject.SetActive(false);
}
#endregion
}
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UIBaseManager : MonoBehaviour
{
#region field
public Image m_Panel;
public UIBaseWindow[] m_UIBaseWindow;
private UIBaseWindow m_CurrentWindow;
private Stack<UIBaseWindow> m_Navigation;
#endregion
#region public function
#endregion
#region private function
private void Awake()
{
m_Panel.transform.SetAsLastSibling();
m_Panel.gameObject.SetActive(false);
//加载数据类
BaseWindow[] baseWindow = transform.GetComponentsInChildren<BaseWindow>();
foreach (BaseWindow window in baseWindow)
{
window.InitWindow();
}
SetWindowEvent();
}
private void SetWindowEvent()
{
foreach (UIBaseWindow window in m_UIBaseWindow)
{
if (null == window) continue;
window.InitWindow();
window.ShowEvent += PushWindow;
window.CloseEvent += PopWindow;
if (window.m_IsClickPanelClose)
window.m_Panel = m_Panel.gameObject;
if (window.m_UIWindowType == UIWindowType.PopUp)
window.transform.parent = m_Panel.transform;
if (null != window.m_ShowButton)
{
foreach (GameObject button in window.m_ShowButton)
{
if (null == button) continue;
EventListener.Get(button).onClick += window.OnShow;
}
window.m_ShowButton = null;
}
if (null != window.m_CloseButton)
{
foreach (GameObject button in window.m_CloseButton)
{
if (null == button) continue;
EventListener.Get(button).onClick += window.OnClose;
}
window.m_CloseButton = null;
}
if (null != window.m_FrontGameObject)
{
foreach (GameObject go in window.m_FrontGameObject)
{
if (null == go) continue;
EventListener.Get(go).onLeftDown += window.OnFront;
}
window.m_FrontGameObject = null;
}
if (null != window.m_DragGameObject)
{
EventListener.Get(window.m_DragGameObject).onInitializePotentialDrag += window.OnSelect;
EventListener.Get(window.m_DragGameObject).onDrag += window.OnDrag;
window.m_DragGameObject = null;
}
window.gameObject.SetActive(false);
}
}
private void PushWindow(UIBaseWindow window)
{
if (null == m_Navigation)
m_Navigation = new Stack<UIBaseWindow>();
if (window.m_UIWindowType == UIWindowType.PopUp)
{
m_Panel.color = new Color(1, 1, 1, window.m_Alpha);
m_Panel.gameObject.SetActive(true);
}
if (window.m_UIWindowShowMode == UIWindowShowMode.NoNeedBack)
{
int count = m_Navigation.Count;
for (int i = 0; i < count; i++)
{
UIBaseWindow w = m_Navigation.Pop();
w.gameObject.SetActive(false);
}
}
else if (window.m_UIWindowShowMode == UIWindowShowMode.HideOther)
{
foreach (UIBaseWindow w in m_UIBaseWindow)
{
if (w == window) continue;
w.gameObject.SetActive(false);
}
m_CurrentWindow = window;
}
m_Navigation.Push(window);
}
private void PopWindow(UIBaseWindow window)
{
if (null == m_Navigation) return;
if (m_Navigation.Count < 1) return;
m_Navigation.Pop();
if (window.m_UIWindowShowMode == UIWindowShowMode.HideOther)
{
if (m_Navigation.Count < 1) return;
UIBaseWindow w = m_Navigation.Peek();
w.gameObject.SetActive(true);
}
}
#endregion
}