国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

程序框架——UI管理模塊

這篇具有很好參考價(jià)值的文章主要介紹了程序框架——UI管理模塊。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

UI基類BasePanel

負(fù)責(zé)幫助我們通過代碼快速的找到所有的子控件,方便我們?cè)谧宇愔刑幚磉壿?,?jié)約找控件的工作量。

public class BasePanel : MonoBehaviour
{
    //通過里式轉(zhuǎn)換原則 來存儲(chǔ)所有的控件
    private Dictionary<string, List<UIBehaviour>> controlDic = new Dictionary<string, List<UIBehaviour>>();

	// Use this for initialization
	protected virtual void Awake () {
        FindChildrenControl<Button>();
        FindChildrenControl<Image>();
        FindChildrenControl<Text>();
        FindChildrenControl<Toggle>();
        FindChildrenControl<Slider>();
        FindChildrenControl<ScrollRect>();
        FindChildrenControl<InputField>();
    }
	
    /// <summary>
    /// 顯示自己
    /// </summary>
    public virtual void ShowMe()
    {
        
    }

    /// <summary>
    /// 隱藏自己
    /// </summary>
    public virtual void HideMe()
    {

    }

    protected virtual void OnClick(string btnName)
    {

    }

    protected virtual void OnValueChanged(string toggleName, bool value)
    {

    }

    /// <summary>
    /// 得到對(duì)應(yīng)名字的對(duì)應(yīng)控件腳本
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="controlName"></param>
    /// <returns></returns>
    protected T GetControl<T>(string controlName) where T : UIBehaviour
    {
        if(controlDic.ContainsKey(controlName))
        {
            for( int i = 0; i <controlDic[controlName].Count; ++i )
            {
                if (controlDic[controlName][i] is T)
                    return controlDic[controlName][i] as T;
            }
        }

        return null;
    }

    /// <summary>
    /// 找到子對(duì)象的對(duì)應(yīng)控件
    /// </summary>
    /// <typeparam name="T"></typeparam>
    private void FindChildrenControl<T>() where T:UIBehaviour
    {
        T[] controls = this.GetComponentsInChildren<T>();
        for (int i = 0; i < controls.Length; ++i)
        {
            string objName = controls[i].gameObject.name;
            if (controlDic.ContainsKey(objName))
                controlDic[objName].Add(controls[i]);
            else
                controlDic.Add(objName, new List<UIBehaviour>() { controls[i] });
            //如果是按鈕控件
            if(controls[i] is Button)
            {
                (controls[i] as Button).onClick.AddListener(()=>
                {
                    OnClick(objName);
                });
            }
            //如果是單選框或者多選框
            else if(controls[i] is Toggle)
            {
                (controls[i] as Toggle).onValueChanged.AddListener((value) =>
                {
                    OnValueChanged(objName, value);
                });
            }
        }
    }
}

UI管理模塊UIManager

管理所有顯示的面板,提供給外部 顯示和隱藏等等方法。文章來源地址http://www.zghlxwxcb.cn/news/detail-636677.html

/// <summary>
/// UI層級(jí)
/// </summary>
public enum E_UI_Layer
{
    Bot,
    Mid,
    Top,
    System,
}

/// <summary>
/// UI管理器
/// 1.管理所有顯示的面板
/// 2.提供給外部 顯示和隱藏等等接口
/// </summary>
public class UIManager : BaseManager<UIManager>
{
    public Dictionary<string, BasePanel> panelDic = new Dictionary<string, BasePanel>();

    private Transform bot;
    private Transform mid;
    private Transform top;
    private Transform system;

    //記錄我們UI的Canvas父對(duì)象 方便以后外部可能會(huì)使用它
    public RectTransform canvas;

    public UIManager()
    {
        //創(chuàng)建Canvas 讓其過場(chǎng)景的時(shí)候 不被移除
        GameObject obj = ResMgr.GetInstance().Load<GameObject>("UI/Canvas");
        canvas = obj.transform as RectTransform;
        GameObject.DontDestroyOnLoad(obj);

        //找到各層
        bot = canvas.Find("Bot");
        mid = canvas.Find("Mid");
        top = canvas.Find("Top");
        system = canvas.Find("System");

        //創(chuàng)建EventSystem 讓其過場(chǎng)景的時(shí)候 不被移除
        obj = ResMgr.GetInstance().Load<GameObject>("UI/EventSystem");
        GameObject.DontDestroyOnLoad(obj);
    }

    /// <summary>
    /// 通過層級(jí)枚舉 得到對(duì)應(yīng)層級(jí)的父對(duì)象
    /// </summary>
    /// <param name="layer"></param>
    /// <returns></returns>
    public Transform GetLayerFather(E_UI_Layer layer)
    {
        switch(layer)
        {
            case E_UI_Layer.Bot:
                return this.bot;
            case E_UI_Layer.Mid:
                return this.mid;
            case E_UI_Layer.Top:
                return this.top;
            case E_UI_Layer.System:
                return this.system;
        }
        return null;
    }

    /// <summary>
    /// 顯示面板
    /// </summary>
    /// <typeparam name="T">面板腳本類型</typeparam>
    /// <param name="panelName">面板名</param>
    /// <param name="layer">顯示在哪一層</param>
    /// <param name="callBack">當(dāng)面板預(yù)設(shè)體創(chuàng)建成功后 你想做的事</param>
    public void ShowPanel<T>(string panelName, E_UI_Layer layer = E_UI_Layer.Mid, UnityAction<T> callBack = null) where T:BasePanel
    {
        if (panelDic.ContainsKey(panelName))
        {
            panelDic[panelName].ShowMe();
            // 處理面板創(chuàng)建完成后的邏輯
            if (callBack != null)
                callBack(panelDic[panelName] as T);
            //避免面板重復(fù)加載 如果存在該面板 即直接顯示 調(diào)用回調(diào)函數(shù)后  直接return 不再處理后面的異步加載邏輯
            return;
        }

        ResMgr.GetInstance().LoadAsync<GameObject>("UI/" + panelName, (obj) =>
        {
            //把他作為 Canvas的子對(duì)象
            //并且 要設(shè)置它的相對(duì)位置
            //找到父對(duì)象 你到底顯示在哪一層
            Transform father = bot;
            switch(layer)
            {
                case E_UI_Layer.Mid:
                    father = mid;
                    break;
                case E_UI_Layer.Top:
                    father = top;
                    break;
                case E_UI_Layer.System:
                    father = system;
                    break;
            }
            //設(shè)置父對(duì)象  設(shè)置相對(duì)位置和大小
            obj.transform.SetParent(father);

            obj.transform.localPosition = Vector3.zero;
            obj.transform.localScale = Vector3.one;

            (obj.transform as RectTransform).offsetMax = Vector2.zero;
            (obj.transform as RectTransform).offsetMin = Vector2.zero;

            //得到預(yù)設(shè)體身上的面板腳本
            T panel = obj.GetComponent<T>();
            // 處理面板創(chuàng)建完成后的邏輯
            if (callBack != null)
                callBack(panel);

            panel.ShowMe();

            //把面板存起來
            panelDic.Add(panelName, panel);
        });
    }

    /// <summary>
    /// 隱藏面板
    /// </summary>
    /// <param name="panelName"></param>
    public void HidePanel(string panelName)
    {
        if(panelDic.ContainsKey(panelName))
        {
            panelDic[panelName].HideMe();
            GameObject.Destroy(panelDic[panelName].gameObject);
            panelDic.Remove(panelName);
        }
    }

    /// <summary>
    /// 得到某一個(gè)已經(jīng)顯示的面板 方便外部使用
    /// </summary>
    public T GetPanel<T>(string name) where T:BasePanel
    {
        if (panelDic.ContainsKey(name))
            return panelDic[name] as T;
        return null;
    }

    /// <summary>
    /// 給控件添加自定義事件監(jiān)聽
    /// </summary>
    /// <param name="control">控件對(duì)象</param>
    /// <param name="type">事件類型</param>
    /// <param name="callBack">事件的響應(yīng)函數(shù)</param>
    public static void AddCustomEventListener(UIBehaviour control, EventTriggerType type, UnityAction<BaseEventData> callBack)
    {
        EventTrigger trigger = control.GetComponent<EventTrigger>();
        if (trigger == null)
            trigger = control.gameObject.AddComponent<EventTrigger>();

        EventTrigger.Entry entry = new EventTrigger.Entry();
        entry.eventID = type;
        entry.callback.AddListener(callBack);

        trigger.triggers.Add(entry);
    }

}
  • 測(cè)試代碼


public class LoginPanel : BasePanel
{
    public void InitData() {
        Debug.Log("初始化信息!");
    }
    // Start is called before the first frame update
    void Start()
    {
        //GetControl<Button>("btnLogin").onClick.AddListener(()=> {
        //    Debug.Log("我被點(diǎn)擊了");
        //});

        //  GetControl<Button>("btnExit").onClick.AddListener(()=> {
        //      Debug.Log("我要退出了");
        //      this.gameObject.SetActive(false);
        //  });

        UIManager.AddCustomEventListener(GetControl<Button>("btnExit"), EventTriggerType.PointerEnter, (data) =>
        {
            Debug.Log("我要進(jìn)入了");
        });
        UIManager.AddCustomEventListener(GetControl<Button>("btnExit"), EventTriggerType.PointerExit, (data) =>
        {
            Debug.Log("我要退出了");
        });
    }
    protected override void OnClick(string btnName)
    {
        switch (btnName)
        {
            case "btnLogin":
                Debug.Log("我被點(diǎn)擊了");
                break;
            case "btnExit":
                Debug.Log("我要退出了");
                break;
            default:
                break;
        }
    }

    public override void ShowMe()
    {
       
        Debug.Log("我顯示出來了!");
    }
    public override void HideMe()
    {
        Debug.Log("我要隱藏了!");
    }
    // Update is called once per frame
    void Update()
    {
        
    }
}
public class UITest : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        UIManager.GetInstance().ShowPanel<LoginPanel>("LoginPanel", E_UI_Layer.Mid, showPanel);
    }
    void showPanel(LoginPanel loginPanel)
    {
        loginPanel.InitData();

     
    }
    
    // Update is called once per frame
    void Update()
    {

    }
}

到了這里,關(guān)于程序框架——UI管理模塊的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • JavaScript中的設(shè)計(jì)模式之一--單例模式和模塊

    雖然有一種瘋狂天才的感覺可能很誘人,但重新發(fā)明輪子通常不是設(shè)計(jì)軟件的最佳方法。很有可能有人已經(jīng)遇到了和你一樣的問題,并以一種聰明的方式解決了它。這樣的最佳實(shí)踐在形式化后被稱為 設(shè)計(jì)模式 。今天我們來看看它們的概念,并檢查 單例模式 和 模塊 。 我們可

    2024年02月12日
    瀏覽(14)
  • 設(shè)計(jì)模式_spring框架中常用的8種設(shè)計(jì)模式

    設(shè)計(jì)模式_spring框架中常用的8種設(shè)計(jì)模式

    spring框架中常用到的8種設(shè)計(jì)模式清單如下: 設(shè)計(jì)模式 使用地方 備注 工廠模式 BeanFactory ApplicationContext 單例模式 Spring中的Bean 代理模式 Spring AOP java反射實(shí)現(xiàn)動(dòng)態(tài)代理 模板方法模式 Spring中以Template結(jié)尾的類 使用繼承的方式實(shí)現(xiàn) 觀察者模式 Spring事件驅(qū)動(dòng)模型 適配器模式 Spri

    2023年04月08日
    瀏覽(20)
  • Unity設(shè)計(jì)模式——原型模式

    Unity設(shè)計(jì)模式——原型模式

    ????????原型模式 (Prototype)用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過拷貝這些原型創(chuàng)建新的對(duì)象。原型模式其實(shí)就是 從一個(gè)對(duì)象再創(chuàng)建另外一個(gè)可定制的對(duì)象 ,而且不需知道任何創(chuàng)建的細(xì)節(jié) 。 原型類 Prototype: ?ConcretePrototypel類,具體原型 客戶端: 由于克隆實(shí)在太

    2024年02月07日
    瀏覽(14)
  • Unity設(shè)計(jì)模式之工廠模式

    一、什么是工廠模式 工廠模式是一種創(chuàng)建型設(shè)計(jì)模式,它提供了一種封裝對(duì)象創(chuàng)建的方式,將對(duì)象的創(chuàng)建過程與使用過程分離,使得代碼更加靈活、可擴(kuò)展和可維護(hù)。在Unity中,工廠模式常用于創(chuàng)建和管理游戲?qū)ο蟆?對(duì)啦!這里有個(gè)游戲開發(fā)交流小組里面聚集了一幫熱愛學(xué)習(xí)

    2024年02月14日
    瀏覽(23)
  • Unity實(shí)現(xiàn)設(shè)計(jì)模式——狀態(tài)模式

    Unity實(shí)現(xiàn)設(shè)計(jì)模式——狀態(tài)模式

    狀態(tài)模式最核心的設(shè)計(jì)思路就是將對(duì)象的狀態(tài)抽象出一個(gè)接口,然后根據(jù)它的不同狀態(tài)封裝其行為,這樣就可以實(shí)現(xiàn)狀態(tài)和行為的綁定,最終實(shí)現(xiàn)對(duì)象和狀態(tài)的有效解耦。 在實(shí)際開發(fā)中一般用到FSM有限狀態(tài)機(jī)的實(shí)現(xiàn),GF框架中的FSM和流程控制就是基于這個(gè)原理實(shí)現(xiàn)的。 狀態(tài)

    2024年02月08日
    瀏覽(20)
  • Unity設(shè)計(jì)模式之觀察者模式

    Unity設(shè)計(jì)模式之觀察者模式

    ? 在平常玩游戲的時(shí)候會(huì)遇到這種情況,以簡(jiǎn)單的Rpg舉例。?勇者擊殺了怪物,怪物死了,勇者擺出勝利姿勢(shì),系統(tǒng)提示怪物死亡?。如果按照一般邏輯可能會(huì)在怪物死亡的方法中去獲取Player、Dialog,這樣看上去其實(shí)也不太難。但如果需要去關(guān)聯(lián)的事件很多,就需要在類中去獲

    2024年02月06日
    瀏覽(23)
  • Unity實(shí)現(xiàn)設(shè)計(jì)模式——解釋器模式

    Unity實(shí)現(xiàn)設(shè)計(jì)模式——解釋器模式

    解釋器模式(Interpreter Pattern)是一種按照規(guī)定語法進(jìn)行解析的模式,現(xiàn)實(shí)項(xiàng)目中用得較少。 給定一門語言,定義它的文法的一種表示,并定義一個(gè)解釋器,該解釋器使用該表示來解釋語言中的句子。 下面用一個(gè)例子演示:將羅馬文字轉(zhuǎn)換為十進(jìn)制的格式 解釋器基類 千位數(shù)

    2024年02月07日
    瀏覽(90)
  • Unity設(shè)計(jì)模式之單例模式

    單例模式(Singleton)是設(shè)計(jì)模式中很常見的一種設(shè)計(jì)模式,目的是為了讓一個(gè)類在程序運(yùn)行期間有且僅有一個(gè)實(shí)例,且方便全局訪問。 1、私有的構(gòu)造函數(shù)。 2、含有一個(gè)該類的靜態(tài)私有對(duì)象。 3、靜態(tài)的公有函數(shù)或?qū)傩?,方便用戶?chuàng)建或者獲取它本身的靜態(tài)私有對(duì)象。 當(dāng)項(xiàng)目

    2023年04月09日
    瀏覽(24)
  • UI設(shè)計(jì)模式是什么?有哪些常用的?

    UI設(shè)計(jì)模式是什么?有哪些常用的?

    UI設(shè)計(jì)模式是針對(duì)常見的用戶界面問題提出的解決方案。當(dāng)解決方案得到驗(yàn)證時(shí),它經(jīng)常被使用,最終演變成可重復(fù)使用的設(shè)計(jì)模式。 設(shè)計(jì)師可以根據(jù)不同的網(wǎng)站功能類型選擇使用相應(yīng)的網(wǎng)站UI設(shè)計(jì)模式,從而創(chuàng)建一致高效的網(wǎng)站UI界面。 本文推薦8種常見的網(wǎng)站UI設(shè)計(jì)模式。

    2024年02月09日
    瀏覽(18)
  • Unity設(shè)計(jì)模式之對(duì)象池(緩存池)模式

    對(duì)象池模式是我們?cè)赨nity開發(fā)中會(huì)經(jīng)常用到的幾種設(shè)計(jì)模式之一,最常見的例子就是在FPS游戲中子彈的創(chuàng)建與銷毀或者說在無雙游戲中敵人的創(chuàng)建和銷毀都會(huì)使用到對(duì)象池模式。 首先我們先看一下為什么會(huì)使用到對(duì)象池模式,拿最簡(jiǎn)單的一個(gè)例子,在FPS游戲中,我們按下鼠標(biāo)

    2024年02月12日
    瀏覽(14)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包