溫馨提示×

溫馨提示×

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

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

如何分析游戲UI框架設計指的模態(tài)窗體管理

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

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

游戲UI框架設計

--模態(tài)窗體管理

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

如何分析游戲UI框架設計指的模態(tài)窗體管理

(透明不能穿透)

如何分析游戲UI框架設計指的模態(tài)窗體管理

  (半透明不能穿透)

如何分析游戲UI框架設計指的模態(tài)窗體管理

     (低透明度,不能穿透)

     對于“模態(tài)窗體”的基本實現(xiàn)原理是:

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

如何分析游戲UI框架設計指的模態(tài)窗體管理

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

如何分析游戲UI框架設計指的模態(tài)窗體管理

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

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

/***
 *
 *    Title: "SUIFW" UI框架項目
 *           主題: UI遮罩管理器  
 *    Description:
 *           功能: 負責“彈出窗體”模態(tài)顯示實現(xiàn)
 *                  
 *    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根節(jié)點對象
        private GameObject _GoCanvasRoot = null;
        //UI腳本節(jié)點對象
        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根節(jié)點對象、腳本節(jié)點對象
            _GoCanvasRoot = GameObject.FindGameObjectWithTag(SysDefine.SYS_TAG_CANVAS);
            _TraUIScriptsNode = UnityHelper.FindTheChildNode(_GoCanvasRoot, SysDefine.SYS_SCRIPTMANAGER_NODE);
            //把本腳本實例,作為“腳本節(jié)點對象”的子節(jié)點。
            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>
        /// 設置遮罩狀態(tài)
        /// </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>
        /// 取消遮罩狀態(tài)
        /// </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 顯示狀態(tài)。
 *           2:Hiding 隱藏狀態(tài)
 *           3:ReDisplay 再顯示狀態(tài)。
 *           4:Freeze 凍結狀態(tài)。
 *           
 *                  
 *    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  窗體的四種(生命周期)狀態(tài)

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

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

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

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


        #endregion
    }
}

感謝大家的閱讀,以上就是“如何分析游戲UI框架設計指的模態(tài)窗體管理”的全部內(nèi)容了,學會的朋友趕緊操作起來吧。相信億速云小編一定會給大家?guī)砀鼉?yōu)質(zhì)的文章。謝謝大家對億速云網(wǎng)站的支持!

向AI問一下細節(jié)

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

ui
AI