unity自定義彈出框功能
本文實例為大家分享了unity自定義彈出框的具體方法,供大家參考,具體內(nèi)容如下
一、彈出框的搭建
布局如圖:Message為整個父物體,并且添加UiMessage代碼。panel為遮罩。
MessageBox為整個提示框,Panel為標(biāo)題,ok為確定按鈕,cancel為取消按鈕,retry為重試按鈕,Text為提示框的文字。
注意大小寫,后面代碼會根據(jù)名稱進(jìn)行獲取對應(yīng)組建。

效果如下:


二、MessageBox代碼
要說明的都在代碼中注釋了。仿照Windows的提示框功能,如果功能不足可自行添加。例如關(guān)閉按鈕、顯示圖標(biāo)等。
using System;
public enum DialogResult
{
Ok,
OKCancel,
RetryCancel,
YesNo,
YesNoCancel
}
public static class MessageBox
{
/// <summary>
/// true表示模態(tài)框
/// </summary>
public static bool type;
//三個委托,分別為三個按鈕的點擊運行事件
public static Action clickOk;
public static Action clickRetry;
public static Action clickCancel;
public static DialogResult dialogResult;
//標(biāo)題
public static string headText;
//文本
public static string text;
//狀態(tài)。用于顯示或隱藏彈出框
public static bool state;
/// <summary>
///重試按鈕點擊事件
/// </summary>
public static void onClickRetry()
{
state = false;
clickRetry?.Invoke();
clickRetry = null;
}
/// <summary>
/// 取消按鈕點擊事件
/// </summary>
public static void onClickCancel()
{
state = false;
clickCancel?.Invoke();
clickCancel = null;
}
/// <summary>
/// 確定按鈕點擊事件
/// </summary>
public static void onClickOk()
{
state = false;
clickOk?.Invoke();
clickOk = null;
}
/// <summary>
/// 顯示
/// </summary>
/// <param name="_text">內(nèi)容</param>
/// <param name="_head">標(biāo)題</param>
/// <param name="dialog">樣式</param>
/// <param name="type">模式</param>
public static void Show(string _text,string _head,DialogResult _dialog, bool _type = true)
{
text = _text;
headText = _head;
dialogResult = _dialog;
type = _type;
state = true;
}
public static void Show(string _text,string _head,bool _type = true)
{
text = _text;
headText = _head;
dialogResult = DialogResult.Ok;
type = _type;
state = true;
}
public static void Show(string _text, bool _type = true)
{
text = _text;
headText = "信息";
dialogResult = DialogResult.Ok;
type = _type;
state = true;
}
}
三、UiMessage代碼
添加到Message物體上。用于控制彈出框的顯示等功能。
using UnityEngine;
using UnityEngine.UI;
public class UiMessage : MonoBehaviour
{
public Button ok;
public Button cancel;
public Button retry;
/// <summary>
/// 遮罩
/// </summary>
public GameObject panel;
public Text headText;
public Text text;
/// <summary>
/// 彈出框
/// </summary>
private GameObject messageBox;
private void Awake()
{
messageBox = gameObject.transform.GetChild(1).gameObject;
ok = messageBox.transform.Find("ok").GetComponent<Button>();
cancel = messageBox.transform.Find("cancel").GetComponent<Button>();
retry = messageBox.transform.Find("retry").GetComponent<Button>();
panel = gameObject.transform.Find("panel").gameObject;
text = messageBox.transform.Find("Text").GetComponent<Text>();
headText = messageBox.transform.GetChild(0).Find("head").GetComponent<Text>();
//將提示框居中顯示
messageBox.transform.position = new Vector3(Screen.width / 2 - messageBox.GetComponent<RectTransform>().rect.width / 2,
Screen.height / 2 + messageBox.GetComponent<RectTransform>().rect.height / 2, 0);
init();
}
private void OnEnable()
{
init();
}
private void init()
{
ok.onClick.AddListener(MessageBox.onClickOk);
cancel.onClick.AddListener(MessageBox.onClickCancel);
retry.onClick.AddListener(MessageBox.onClickRetry);
text.text = MessageBox.text;
headText.text = MessageBox.headText;
//根據(jù)傳遞的參數(shù),進(jìn)行樣式的顯示
switch (MessageBox.dialogResult)
{
case DialogResult.Ok:
ok.gameObject.SetActive(true);
cancel.gameObject.SetActive(false);
retry.gameObject.SetActive(false);
break;
case DialogResult.OKCancel:
ok.gameObject.SetActive(true);
cancel.gameObject.SetActive(true);
retry.gameObject.SetActive(false);
break;
case DialogResult.RetryCancel:
ok.gameObject.SetActive(true);
cancel.gameObject.SetActive(true);
retry.gameObject.SetActive(true);
break;
case DialogResult.YesNo:
ok.transform.GetChild(0).GetComponent<Text>().text = "是";
cancel.transform.GetChild(0).GetComponent<Text>().text = "否";
ok.gameObject.SetActive(true);
cancel.gameObject.SetActive(true);
retry.gameObject.SetActive(false);
break;
case DialogResult.YesNoCancel:
ok.transform.GetChild(0).GetComponent<Text>().text = "是";
cancel.transform.GetChild(0).GetComponent<Text>().text = "否";
ok.gameObject.SetActive(true);
cancel.gameObject.SetActive(true);
retry.gameObject.SetActive(true);
break;
}
}
private void Update()
{
panel.SetActive(MessageBox.type);
gameObject.SetActive(MessageBox.state);
}
}
四、顯示框的調(diào)用
此處調(diào)用可以自行設(shè)置一個按鈕,在其點擊事件中注冊調(diào)用即可。
筆者使用項目中的方式進(jìn)行演示。具體不做說明。調(diào)用方式已給出。
特別注意:由于UiMessage調(diào)用了MessageBox的方法,所以必須先初始化MessageBox的數(shù)據(jù)。使用什么就初始化什么。筆者使用了ok、cancel按鈕(默認(rèn)不初始化模式,即為模態(tài)框,不初始化DialogResult即為只顯示ok按鈕),所以注冊了相應(yīng)的點擊事件(委托)。最后顯示彈出框(整個包含遮罩和彈出框)。

五、運行結(jié)果

六、彈出框可拖拽移動
將DragManage添加到MessageBox物體上面。(如果你想讓ui物體可拖拽,對其添加DragManage即可實現(xiàn))
筆者就不做演示了
using UnityEngine;
using UnityEngine.EventSystems;
/// <summary>
/// 只是用來處理拖拽
/// </summary>
public class DragManage : MonoBehaviour, IDragHandler, IBeginDragHandler, IEndDragHandler
{
private Vector3 offect;
public void OnBeginDrag(PointerEventData eventData)
{
offect = Input.mousePosition - transform.position;
}
public void OnDrag(PointerEventData eventData)
{
transform.position = Input.mousePosition - offect;
}
public void OnEndDrag(PointerEventData eventData)
{
transform.position = Input.mousePosition - offect;
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#基于純數(shù)學(xué)方法遞歸實現(xiàn)貨幣數(shù)字轉(zhuǎn)換中文功能詳解
這篇文章主要介紹了C#基于純數(shù)學(xué)方法遞歸實現(xiàn)貨幣數(shù)字轉(zhuǎn)換中文功能,涉及C#針對字符串的遍歷、轉(zhuǎn)換與數(shù)學(xué)運算相關(guān)操作技巧,需要的朋友可以參考下2017-02-02
C#導(dǎo)出數(shù)據(jù)到excel如何提升性能
這篇文章主要介紹了C#導(dǎo)出數(shù)據(jù)到excel如何提升性能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07
C# Winform中實現(xiàn)主窗口打開登錄窗口關(guān)閉的方法
這篇文章主要介紹了C# Winform中實現(xiàn)主窗口打開登錄窗口關(guān)閉的方法,這在需要用戶名密碼的軟件項目中是必用的一個技巧,要的朋友可以參考下2014-08-08
利用C#/VB.NET實現(xiàn)PPT轉(zhuǎn)換為HTML
利用PowerPoint可以很方便的呈現(xiàn)多媒體信息,且信息形式多媒體化,表現(xiàn)力強。但難免在某些情況下我們會需要將PowerPoint轉(zhuǎn)換為HTML格式,本文就為大家整理了轉(zhuǎn)換方法,希望對大家有所幫助2023-05-05

