UI窗口框架

该框架实现了对每个窗口的便捷查找,对于窗口父类只实现了显隐,供笔者以后可以根据需求随意添加功能

核心类

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<窗口类型>().方法();-

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值