该框架实现了对每个窗口的便捷查找,对于窗口父类只实现了显隐,供笔者以后可以根据需求随意添加功能
核心类
UIWindow(UI窗口父类)
[RequireComponent(typeof(CanvasGroup))]
public class UIWindow : MonoBehaviour
{
//据Unity官方文档表示,在控制UI显隐上使用阿尔法通道归零
//比设置物体的stable性能要更好,但是没有说明为什么
private CanvasGroup canvasGroup;
//事件监听器对象池
private Dictionary<string, UIEventListener> uiEventListenerDic;
//设置窗口显现的协程
private IEnumerator setVisibleIEtor = null;
private void Awake()
{
canvasGroup = GetComponent<CanvasGroup>();
uiEventListenerDic = new Dictionary<string, UIEventListener>();
}
public virtual void Init()
{
}
public virtual void Clear()
{
}
/// <summary>
/// 设置窗口的显隐
/// </summary>
/// <param name="state">显隐状态</param>
/// <param name="delay">延长时间</param>
/// <param name="cb">显隐方式</param>
public void SetVisibleWnd(bool state,float delay=0,Action<bool,CanvasGroup> cb=null)
{
setVisibleIEtor = SetVisibleDelay(state, delay, cb);
StartCoroutine(setVisibleIEtor);
}
/// <summary>
/// 停止显现窗口
/// </summary>
public void StopVisibleWnd()
{
if (setVisibleIEtor != null)
{
StopCoroutine(setVisibleIEtor);
setVisibleIEtor = null;
}
}
private IEnumerator SetVisibleDelay(bool state, float delay, Action<bool,CanvasGroup> cb)
{
yield return new WaitForSeconds(delay);
setVisibleIEtor = null;
if (cb != null)
{
cb(state, canvasGroup);
}
else
{
canvasGroup.alpha = state ? 1 : 0;
}
if (state)
{
Init();
}
else
{
Clear();
}
}
}
所有窗口的基类,可以代表所有窗口(概念继承,以层次化方式管理类),提供基础的窗口显隐方法,和显隐时执行的初始化方法和重置方法
UIManager(UI窗口管理器)
public class UIManager : MonoSingleton<UIManager>
{
private Dictionary<string, UIWindow> uiWindowsDic;
public override void Init()
{
uiWindowsDic = new Dictionary<string, UIWindow>();
UIWindow[] uiWindows=FindObjectsOfType<UIWindow>();
foreach (var item in uiWindows)
{
item.SetVisibleWnd(false);
uiWindowsDic.Add(item.GetType().Name, item);
}
}
public T GetUIWindow<T>() where T : UIWindow
{
UIWindow wnd = null;
if (uiWindowsDic.TryGetValue(typeof(T).Name, out wnd))
{
return wnd as T;
}
return null;
}
public bool Add(UIWindow window)
{
if (uiWindowsDic.ContainsKey(window.GetType().Name))
return false;
uiWindowsDic.Add(window.GetType().Name, window);
return true;
}
public bool Clear<T>()
{
if (!uiWindowsDic.ContainsKey(typeof(T).Name))
return false;
uiWindowsDic.Remove(typeof(T).Name);
return true;
}
}
作用 管理窗口(记录,禁用,查找)窗口
定义窗口的共有行为(获取监听器)
UIEventListener(UI事件类)
public class UIEventListener : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerDownHandler, IPointerUpHandler, IPointerClickHandler, IInitializePotentialDragHandler, IBeginDragHandler, IDragHandler, IEndDragHandler, IDropHandler, IScrollHandler, IUpdateSelectedHandler, ISelectHandler, IDeselectHandler, IMoveHandler, ISubmitHandler, ICancelHandler
{
public static UIEventListener GetEventListener(Transform tf)
{
return tf.GetComponent<UIEventListener>() ?? tf.gameObject.AddComponent<UIEventListener>();
}
public delegate void PointerHandler(PointerEventData eventData);
#region 鼠标指针事件
public event PointerHandler PointerEnter;//指针移入控件时
public event PointerHandler PointerExit;//指针移出控件时
public event PointerHandler PointerDown;//鼠标按下控件时
public event PointerHandler PointerUp;//鼠标抬起控件时
public event PointerHandler PointerClick;//鼠标单击控件时
public void OnPointerEnter(PointerEventData eventData)
{
if (PointerEnter != null) PointerEnter(eventData);
}
public void OnPointerExit(PointerEventData eventData)
{
if (PointerExit != null) PointerExit(eventData);
}
public void OnPointerDown(PointerEventData eventData)
{
if (PointerDown != null) PointerDown(eventData);
}
public void OnPointerUp(PointerEventData eventData)
{
if (PointerUp != null) PointerUp(eventData);
}
public void OnPointerClick(PointerEventData eventData)
{
if (PointerClick != null) PointerClick(eventData);
}
#endregion
#region 拖拽事件
public event PointerHandler InitializePotentialDrag;//当找到拖动但在开始拖动有效之前
public event PointerHandler BeginDrag;//开始拖动
public event PointerHandler Drag;//正在拖动
public event PointerHandler EndDrag;//拖动结束
public event PointerHandler Drop;//拖动结束,松手的时候
public void OnInitializePotentialDrag(PointerEventData eventData)
{
if (InitializePotentialDrag != null) InitializePotentialDrag(eventData);
}
public void OnBeginDrag(PointerEventData eventData)
{
if (BeginDrag != null) BeginDrag(eventData);
}
public void OnDrag(PointerEventData eventData)
{
if (Drag != null) Drag(eventData);
}
public void OnEndDrag(PointerEventData eventData)
{
if (EndDrag != null) EndDrag(eventData);
}
public void OnDrop(PointerEventData eventData)
{
if (Drop != null) Drop(eventData);
}
#endregion
#region 鼠标事件
public event PointerHandler Scroll;//鼠标滑轮滑动时
public void OnScroll(PointerEventData eventData)
{
if (Scroll != null) Scroll(eventData);
}
#endregion
#region 点选事件
public delegate void BaseHandler(BaseEventData eventData);
public event BaseHandler UpdateSelected;//焦点选中时每帧执行
public event BaseHandler Select;//焦点选中时那一帧执行
public event BaseHandler Deselect;//焦点离开时那一帧执行
public void OnUpdateSelected(BaseEventData eventData)
{
if (UpdateSelected != null) UpdateSelected(eventData);
}
public void OnSelect(BaseEventData eventData)
{
if (Select != null) Select(eventData);
}
public void OnDeselect(BaseEventData eventData)
{
if (Deselect != null) Deselect(eventData);
}
#endregion
#region 选择事件
public delegate void AxisEvent(AxisEventData eventData);
//物体移动时(与InputManager里的Horizontal和Vertica按键相对应),前提条件是物体被选中
public event AxisEvent MoveAxis;
//提交按钮被按下时(与InputManager里的Submit按键相对应,PC上默认的是Enter键),前提条件是物体被选中
public event BaseHandler Submit;
//取消按钮被按下时(与InputManager里的Cancel按键相对应,PC上默认的是Esc键),前提条件是物体被选中
public event BaseHandler Cancel;
public void OnMove(AxisEventData eventData)
{
if (MoveAxis != null) MoveAxis(eventData);
}
public void OnSubmit(BaseEventData eventData)
{
if (Submit != null) Submit(eventData);
}
public void OnCancel(BaseEventData eventData)
{
if (Cancel != null) Cancel(eventData);
}
#endregion
}
要触发交互的ui元素挂载该脚本,代替Button组件
管理所有UGUI事件,提供事件参数类
附加到需要交互的UI元素上,用于监听用户的操作,类似于EventTrigger
使用方法
1.定义UIXXXWindow类,继承自ulWindow,负责处理该窗口逻辑。。
GetUlEventListener方法获取 需要交互的UI元素。。
2.如何访问面板的成员。
UIManager.Instance.GetWindow<窗口类型>().方法();-