Unity3D自学笔记——UGUI前台架构

这里写图片描述
UISingleton
UI组件单例模式

public class UISingleton<T> : MonoBehaviour where T : UISingleton<T>
{
    private static T instance = null;
    public static T Instance
    {
        get
        {
            if (instance == null)
            {
                instance = FindObjectOfType(typeof(T)) as T;
                if (instance == null)
                {
                    instance = new GameObject("_" + typeof(T).Name).AddComponent<T>();
                    DontDestroyOnLoad(instance);
                }
                if (instance == null)
                    Debug.LogError("Failed to create instance of " + typeof(T).FullName + ".");
            }
            return instance;
        }
    }

    void OnApplicationQuit() { if (instance != null) instance = null; }

    public static T CreateInstance()
    {
        if (Instance != null) Instance.OnCreate();
        return Instance;
    }

    protected virtual void OnCreate()
    {

    }
}

UIInfo
置于UGUI顶级节点,即Cavans的组件,其作用是初始化UIManager和PotonManger及调用UIManagr初始化UIScene的显示

public class UIInfo : UISingleton<UIInfo> {
    private UIManager uiManager;
    private PhotonManager photonManager;
    void Awake()
    {
        InitUIManager();
        InitPhotonManger();
    }

    void InitUIManager()
    {
        Object obj = FindObjectOfType(typeof(UIManager));
        if (obj != null)
            uiManager = obj as UIManager;
        if (uiManager == null)
        {
            GameObject manger = new GameObject("UIManager");
            uiManager = manger.AddComponent<UIManager>();
        }
        uiManager.InitializeUIs();  //初始化UIManager
        uiManager.SetTitleVisible(true);//显示开始游戏一级界面
    }

    void InitPhotonManger()
    {
        Object obj = FindObjectOfType(typeof(PhotonManager));
        if (obj != null)
            photonManager = obj as PhotonManager;
        if (photonManager == null)
        {
            GameObject manger = new GameObject("PhotonManager");
            photonManager = manger.AddComponent<PhotonManager>();
        }
    }

}

UIManager
UIScene管理类,首先将所有UIScene加入缓存,再动态的负责加载,显示或隐藏UIScene

public class UIManager : UISingleton<UIManager>
{
    private Dictionary<string, UIScene> mUIScene = new Dictionary<string, UIScene>();

    public void InitializeUIs()
    {
        mUIScene.Clear();
        Object[] uis = FindObjectsOfType(typeof(UIScene));
        if (uis != null)
        {
            foreach (Object obj in uis)
            {
                UIScene ui = obj as UIScene;
                ui.SetVisible(false);
                mUIScene.Add(ui.gameObject.name, ui);
            }
        }
    }

    public UIScene SetVisible(string name, bool visible)
    {
        if (visible && !IsVisible(name))
        {
            return OpenScene(name);
        }
        else if (!visible && IsVisible(name))
        {
            return CloseScene(name);
        }

        return mUIScene[name]; ;
    }

    public bool IsVisible(string name)
    {
        UIScene ui = GetUI(name);
        if (ui != null)
            return ui.IsVisible();
        return false;
    }
    private UIScene GetUI(string name)
    {
        UIScene ui;
        return mUIScene.TryGetValue(name, out ui) ? ui : null;
    }

    public T GetUI<T>(string name) where T : UIScene
    {
        return GetUI(name) as T;
    }

    private bool isLoaded(string name)
    {
        if (mUIScene.ContainsKey(name))
        {
            return true;
        }
        return false;
    }

    private UIScene OpenScene(string name)
    {
        if (isLoaded(name))
        {
            mUIScene[name].SetVisible(true);
        }

        return mUIScene[name];
    }
    private UIScene CloseScene(string name)
    {
        if (isLoaded(name))
        {
            mUIScene[name].SetVisible(false);
        }

        return mUIScene[name];
    }

    //显示一级界面
    public UIScene SetTitleVisible(bool visible)
    {
        return SetVisible(UIName.UILogin, visible);
    }

}

UIScene
管理UIScene下的所有UISceneWidget, 同样先缓存,在动态管理

public class UIScene : MonoBehaviour
{
    protected string mUIName = "";

    private Dictionary<string, UISceneWidget> mUIWidgets = new Dictionary<string, UISceneWidget>();

    public ESceneType type = ESceneType.Nomal;

    protected virtual void Start()
    {
        this.FindChildWidgets(gameObject.transform);
    }

    protected virtual void Update()
    {

    }

    public virtual bool IsVisible()
    {
        return gameObject.activeSelf;
    }
    public virtual void SetVisible(bool visible)
    {
        gameObject.SetActive(visible);
    }
    protected UISceneWidget GetWidget(string name)
    {
        // If allready find out, return 
        if (mUIWidgets.ContainsKey(name))
            return mUIWidgets[name];

        // Find out widget with name and add to dictionary
        Transform t = gameObject.transform.FindChild(name);
        if (t == null) return null;

        UISceneWidget widget = t.gameObject.GetComponent<UISceneWidget>();
        if (widget != null)
        {
            mUIWidgets.Add(widget.gameObject.name, widget);
        }

        return t.gameObject.GetComponent<UISceneWidget>();
    }
    protected T GetWidget<T>(string name) where T : Component
    {
        // Find out widget with name and add to dictionary
        GameObject go = GameObject.Find(name);
        if (go == null) return null;

        T widget = go.GetComponent<T>();

        return widget;
    }
    private void FindChildWidgets(Transform t)
    {
        UISceneWidget widget = t.gameObject.GetComponent<UISceneWidget>();
        if (widget != null)
        {
            string name = t.gameObject.name;
            if (!mUIWidgets.ContainsKey(name))
            {
                mUIWidgets.Add(name, widget);
            }
        }
        for (int i = 0; i < t.childCount; ++i)
        {
            Transform child = t.GetChild(i);
            FindChildWidgets(child);
        }
    }
}

UISceneWidget
界面控件类,用户捕获触发事件

public class UISceneWidget : EventTrigger
{
    public event Action<PointerEventData> BeginDrag;
    public event Action<BaseEventData> Cancel;
    public event Action<BaseEventData> Deselect;
    public event Action<PointerEventData> Drag;
    public event Action<PointerEventData> Drop;
    public event Action<PointerEventData> EndDrag;
    public event Action<PointerEventData> InitializePotentialDrag;
    public event Action<AxisEventData> Move;
    public event Action<PointerEventData> PointerClick;
    public event Action<PointerEventData> PointerDown;
    public event Action<PointerEventData> PointerEnter;
    public event Action<PointerEventData> PointerExit;
    public event Action<PointerEventData> PointerUp;
    public event Action<PointerEventData> Scroll;
    public event Action<BaseEventData> Select;
    public event Action<BaseEventData> Submit;
    public event Action<BaseEventData> UpdateSelected;
    /// <summary>
    /// 获取指定UGUI游戏物体的事件监听器
    /// </summary>
    /// <param name="go"></param>
    /// <returns></returns>
    public static UISceneWidget Get(GameObject go)
    {
        UISceneWidget widget = go.GetComponent<UISceneWidget>();
        if (!widget) widget = go.AddComponent<UISceneWidget>();
        return widget;
    }
    public override void OnBeginDrag(PointerEventData eventData)
    {
        if (BeginDrag != null) BeginDrag(eventData);
    }
    public override void OnCancel(BaseEventData eventData)
    {
        if (Cancel != null) Cancel(eventData);
    }
    public override void OnDeselect(BaseEventData eventData)
    {
        if (Deselect != null) Deselect(eventData);
    }
    public override void OnDrag(PointerEventData eventData)
    {
        if (Drag != null) Drag(eventData);
    }
    public override void OnDrop(PointerEventData eventData)
    {
        if (Drop != null) Drop(eventData);
    }
    public override void OnEndDrag(PointerEventData eventData)
    {
        if (EndDrag != null) EndDrag(eventData);
    }
    public override void OnInitializePotentialDrag(PointerEventData eventData)
    {
        if (InitializePotentialDrag != null) InitializePotentialDrag(eventData);
    }
    public override void OnMove(AxisEventData eventData)
    {
        if (Move != null) Move(eventData);
    }
    public override void OnPointerClick(PointerEventData eventData)
    {
        if (PointerClick != null) PointerClick(eventData);
    }
    public override void OnPointerDown(PointerEventData eventData)
    {
        if (PointerDown != null) PointerDown(eventData);
    }
    public override void OnPointerEnter(PointerEventData eventData)
    {
        if (PointerEnter != null) PointerEnter(eventData);
    }
    public override void OnPointerExit(PointerEventData eventData)
    {
        if (PointerExit != null) PointerExit(eventData);
    }
    public override void OnPointerUp(PointerEventData eventData)
    {
        if (PointerUp != null) PointerUp(eventData);
    }
    public override void OnScroll(PointerEventData eventData)
    {
        if (Scroll != null) Scroll(eventData);
    }
    public override void OnSelect(BaseEventData eventData)
    {
        if (Select != null) Select(eventData);
    }
    public override void OnSubmit(BaseEventData eventData)
    {
        if (Submit != null) Submit(eventData);
    }
    public override void OnUpdateSelected(BaseEventData eventData)
    {
        if (UpdateSelected != null) UpdateSelected(eventData);
    }
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值