中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何分析游戲UI框架設計指的模態窗體管理

發布時間:2022-01-10 11:45:20 來源:億速云 閱讀:142 作者:柒染 欄目:開發技術

小編今天帶大家了解如何分析游戲UI框架設計指的模態窗體管理,文中知識點介紹的非常詳細。覺得有幫助的朋友可以跟著小編一起瀏覽文章的內容,希望能夠幫助更多想解決這個問題的朋友找到問題的答案,下面跟著小編一起深入學習“如何分析游戲UI框架設計指的模態窗體管理”的知識吧。

游戲UI框架設計

--模態窗體管理

  我們在開發UI窗體時,對于“彈出窗體”往往因為需要玩家優先處理彈出小窗體,則要求玩家不能(無法)點擊“父窗體”,這種窗體就是典型的“模態窗體”。在此筆者設計了四種模式類型:完全透明、半透明、低透明度、透明且可以穿透。

如何分析游戲UI框架設計指的模態窗體管理

(透明不能穿透)

如何分析游戲UI框架設計指的模態窗體管理

  (半透明不能穿透)

如何分析游戲UI框架設計指的模態窗體管理

     (低透明度,不能穿透)

     對于“模態窗體”的基本實現原理是:

    在彈出窗體的后面增加一層“UI遮罩窗體”,當需要彈出特定模態窗體時,腳本自動控制“UI遮罩窗體”的“層級”,把彈出模特窗體與普通窗體之間進行隔離,起到突出顯示與遮擋用戶點擊其他窗體的作用。原理如下圖所示:

如何分析游戲UI框架設計指的模態窗體管理

    在上圖左邊的層級視圖中,有一個“_UIMaskPanel”的特殊窗體,這就是“UI遮罩窗體”,在不需要彈出顯示的時候,這個窗體是“禁用”狀態。 為了更好適用不同開發需求,對于彈出窗體,我們上面定義了關于彈出窗體的不同性質: 完全透明、半透明、低透明度、透明且可以穿透。 這四種類型功能的實現原理是控制“_UIMaskPanel”的顏色數值以及透明度實現的,見下圖所示:

如何分析游戲UI框架設計指的模態窗體管理

說明: 上圖右邊屬性就是“UI遮罩窗體”的屬性欄,筆者通過腳本控制Image組件的Color 組件,來實現"模態窗體”的不同顯示性質。

   原理講完,貼出控制代碼如下:

/***
 *
 *    Title: "SUIFW" UI框架項目
 *           主題: UI遮罩管理器  
 *    Description:
 *           功能: 負責“彈出窗體”模態顯示實現
 *                  
 *    Date: 2017
 *    Version: 0.1版本
 *    Modify Recoder:
 *    
 *   
 */
using System.Collections;
using System.Collections.Generic;
using System.Net.Mime;
using UnityEngine;
using UnityEngine.UI;

namespace SUIFW
{
    public class UIMaskMgr : MonoBehaviour {
        /*  字段 */
        //本腳本私有單例
        private static UIMaskMgr _Instance = null;  
        //UI根節點對象
        private GameObject _GoCanvasRoot = null;
        //UI腳本節點對象
        private Transform _TraUIScriptsNode = null;
        //頂層面板
        private GameObject _GoTopPanel;
        //遮罩面板
        private GameObject _GoMaskPanel;
        //UI攝像機
        private Camera _UICamera;
        //UI攝像機原始的“層深”
        private float _OriginalUICameralDepth;

        //得到實例
        public static UIMaskMgr GetInstance()
        {
            if (_Instance==null)
            {
                _Instance = new GameObject("_UIMaskMgr").AddComponent<UIMaskMgr>();
            }
            return _Instance;
        }




        void Awake()
        {
            //得到UI根節點對象、腳本節點對象
            _GoCanvasRoot = GameObject.FindGameObjectWithTag(SysDefine.SYS_TAG_CANVAS);
            _TraUIScriptsNode = UnityHelper.FindTheChildNode(_GoCanvasRoot, SysDefine.SYS_SCRIPTMANAGER_NODE);
            //把本腳本實例,作為“腳本節點對象”的子節點。
            UnityHelper.AddChildNodeToParentNode(_TraUIScriptsNode,this.gameObject.transform);
            //得到“頂層面板”、“遮罩面板”
            _GoTopPanel = _GoCanvasRoot;
            _GoMaskPanel = UnityHelper.FindTheChildNode(_GoCanvasRoot, "_UIMaskPanel").gameObject;
            //得到UI攝像機原始的“層深”
            _UICamera = GameObject.FindGameObjectWithTag("_TagUICamera").GetComponent<Camera>();
            if (_UICamera != null)
            {
                //得到UI攝像機原始“層深”
                _OriginalUICameralDepth = _UICamera.depth;
            }
            else
            {
                Debug.Log(GetType()+"/Start()/UI_Camera is Null!,Please Check! ");
            }
        }

        /// <summary>
        /// 設置遮罩狀態
        /// </summary>
        /// <param name="goDisplayUIForms">需要顯示的UI窗體</param>
        /// <param name="lucenyType">顯示透明度屬性</param>
        public void SetMaskWindow(GameObject goDisplayUIForms,UIFormLucenyType lucenyType=UIFormLucenyType.Lucency)
        {
            //頂層窗體下移
            _GoTopPanel.transform.SetAsLastSibling();
            //啟用遮罩窗體以及設置透明度
            switch (lucenyType)
            {
                    //完全透明,不能穿透
                case UIFormLucenyType.Lucency:
                    print("完全透明");
                    _GoMaskPanel.SetActive(true);
                    Color newColor1=new Color(255/255F,255/255F,255/255F,0F/255F);
                    _GoMaskPanel.GetComponent<Image>().color = newColor1;
                    break;
                    //半透明,不能穿透
                case UIFormLucenyType.Translucence:
                    print("半透明");
                    _GoMaskPanel.SetActive(true);
                    Color newColor2 = new Color(220/255F, 220/255F, 220/255F, 50/255F);
                    _GoMaskPanel.GetComponent<Image>().color = newColor2;
                    break;
                    //低透明,不能穿透
                case UIFormLucenyType.ImPenetrable:
                    print("低透明");
                    _GoMaskPanel.SetActive(true);
                    Color newColor3=new Color(50/255F,50/255F,50/255F,200F/255F);
                    _GoMaskPanel.GetComponent<Image>().color = newColor3;
                    break;
                    //可以穿透
                case UIFormLucenyType.Pentrate:
                    print("允許穿透");
                    if (_GoMaskPanel.activeInHierarchy)
                    {
                        _GoMaskPanel.SetActive(false);
                    }
                    break;

                default:
                    break;
            }



            //遮罩窗體下移
            _GoMaskPanel.transform.SetAsLastSibling();
            //顯示窗體的下移
            goDisplayUIForms.transform.SetAsLastSibling();
            //增加當前UI攝像機的層深(保證當前攝像機為最前顯示)
            if (_UICamera!=null)
            {
                _UICamera.depth = _UICamera.depth + 100;    //增加層深
            }

        }

        /// <summary>
        /// 取消遮罩狀態
        /// </summary>
        public void CancelMaskWindow()
        {
            //頂層窗體上移
            _GoTopPanel.transform.SetAsFirstSibling();
            //禁用遮罩窗體
            if (_GoMaskPanel.activeInHierarchy)
            {
                //隱藏
                _GoMaskPanel.SetActive(false);
            }

            //恢復當前UI攝像機的層深
            if (_UICamera != null)
            {
                _UICamera.depth = _OriginalUICameralDepth;  //恢復層深
            }
        }


    }
}

     關于上述定義的UIMaskMgr.cs 腳本代碼 ,筆者在“BaseUIForm.cs” 中做了封裝,使其可以在框架中自動管理,無需框架外客戶程序的處理。BaseUIForm.cs 代碼如下:

/***
 *
 *    Title: "SUIFW" UI框架項目
 *           主題: UI窗體的父類
 *    Description:
 *           功能:定義所有UI窗體的父類。
 *           定義四個生命周期
 *           
 *           1:Display 顯示狀態。
 *           2:Hiding 隱藏狀態
 *           3:ReDisplay 再顯示狀態。
 *           4:Freeze 凍結狀態。
 *           
 *                  
 *    Date: 2017
 *    Version: 0.1版本
 *    Modify Recoder:
 *    
 *   
 */
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel.Design;
using UnityEngine;

namespace SUIFW
{
    public class BaseUIForm : MonoBehaviour {
        /*字段*/
        private UIType _CurrentUIType=new UIType();

        /* 屬性*/
        //當前UI窗體類型
        public UIType CurrentUIType
        {
            get { return _CurrentUIType; }
            set { _CurrentUIType = value; }
        }


        #region  窗體的四種(生命周期)狀態

        /// <summary>
        /// 顯示狀態
        /// </summary>
        public virtual void Display()
        {
            this.gameObject.SetActive(true);
            //設置模態窗體調用(必須是彈出窗體)
            if (_CurrentUIType.UIForms_Type==UIFormType.PopUp)
            {
                UIMaskMgr.GetInstance().SetMaskWindow(this.gameObject,_CurrentUIType.UIForm_LucencyType);
            }
        }

        /// <summary>
        /// 隱藏狀態
        /// </summary>
        public virtual void Hiding()
        {
            this.gameObject.SetActive(false);
            //取消模態窗體調用
            if (_CurrentUIType.UIForms_Type == UIFormType.PopUp)
            {
                UIMaskMgr.GetInstance().CancelMaskWindow();
            }
        }

        /// <summary>
        /// 重新顯示狀態
        /// </summary>
        public virtual void Redisplay()
        {
            this.gameObject.SetActive(true);
            //設置模態窗體調用(必須是彈出窗體)
            if (_CurrentUIType.UIForms_Type == UIFormType.PopUp)
            {
                UIMaskMgr.GetInstance().SetMaskWindow(this.gameObject, _CurrentUIType.UIForm_LucencyType);
            }
        }

        /// <summary>
        /// 凍結狀態
        /// </summary>
        public virtual void Freeze()
        {
            this.gameObject.SetActive(true);
        }


        #endregion
    }
}

感謝大家的閱讀,以上就是“如何分析游戲UI框架設計指的模態窗體管理”的全部內容了,學會的朋友趕緊操作起來吧。相信億速云小編一定會給大家帶來更優質的文章。謝謝大家對億速云網站的支持!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

ui
AI

大姚县| 集贤县| 丰原市| 紫金县| 诸城市| 休宁县| 砀山县| 迁西县| 公安县| 小金县| 那坡县| 石林| 沙坪坝区| 江口县| 黑水县| 黄骅市| 安多县| 驻马店市| 江陵县| 庆阳市| 鄂尔多斯市| 南平市| 浦县| 徐州市| 清苑县| 刚察县| 营口市| 江津市| 章丘市| 如东县| 乐东| 高要市| 衡阳市| 新乡县| 乌拉特后旗| 淅川县| 巴林左旗| 榆林市| 浦东新区| 苏尼特右旗| 珠海市|