您好,登錄后才能下訂單哦!
小編今天帶大家了解如何分析游戲UI框架設計指的模態窗體管理,文中知識點介紹的非常詳細。覺得有幫助的朋友可以跟著小編一起瀏覽文章的內容,希望能夠幫助更多想解決這個問題的朋友找到問題的答案,下面跟著小編一起深入學習“如何分析游戲UI框架設計指的模態窗體管理”的知識吧。
游戲UI框架設計
--模態窗體管理
我們在開發UI窗體時,對于“彈出窗體”往往因為需要玩家優先處理彈出小窗體,則要求玩家不能(無法)點擊“父窗體”,這種窗體就是典型的“模態窗體”。在此筆者設計了四種模式類型:完全透明、半透明、低透明度、透明且可以穿透。
(透明不能穿透)
(半透明不能穿透)
(低透明度,不能穿透)
對于“模態窗體”的基本實現原理是:
在彈出窗體的后面增加一層“UI遮罩窗體”,當需要彈出特定模態窗體時,腳本自動控制“UI遮罩窗體”的“層級”,把彈出模特窗體與普通窗體之間進行隔離,起到突出顯示與遮擋用戶點擊其他窗體的作用。原理如下圖所示:
在上圖左邊的層級視圖中,有一個“_UIMaskPanel”的特殊窗體,這就是“UI遮罩窗體”,在不需要彈出顯示的時候,這個窗體是“禁用”狀態。 為了更好適用不同開發需求,對于彈出窗體,我們上面定義了關于彈出窗體的不同性質: 完全透明、半透明、低透明度、透明且可以穿透。 這四種類型功能的實現原理是控制“_UIMaskPanel”的顏色數值以及透明度實現的,見下圖所示:
說明: 上圖右邊屬性就是“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框架設計指的模態窗體管理”的全部內容了,學會的朋友趕緊操作起來吧。相信億速云小編一定會給大家帶來更優質的文章。謝謝大家對億速云網站的支持!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。