unity弹出对话框的方式汇总

在做unity开发的过程中,我们经常会遇到使用提示框的情况,很多时候提示框是很好用的工具,我们习惯于使用window的messageBox显示提示信息,但是来到unity中我们发现unity并没有该弹框的API,当然有人会说UnityEditor.EditorUtility.DisplayDialog()方法不是吗,我不否认这是一个方法,但是这个只能在编辑器下显示,不能发布有什么用。其实要实现弹框,还有其他几种方式,,比如调用System.Windows.Forms.dll,,调用win32的系统方法,以及使用UGUI自己封装一个。但是前两种有局限性,只能在window平台下使用,第三种可以在任何平台下使用。
一:System.Windows.Forms.dll的使用:
System.Windows.Forms.dll要想在unity下使用,要先把System.Windows.Forms.dll放到unity的plugin文件下,这里存放了unity工程需要的DLL,注意System.Windows.Forms.dll需要是.net3.5以下的框架。该DLL可以在unity的安装目录下的Editor\Data\Mono\lib\mono\2.0\文件夹下找到。使用的方式也很简单,例如

using UnityEngine;
using System;
using System.Windows.Forms;
using winforms = System.Windows.Forms;
public class test : MonoBehaviour
{
 void Start()
{
MessageBox.Show("此设备故障!请及时检查!", this.GetType().Name, winforms.MessageBoxButtons.OK, winforms.MessageBoxIcon.Error);
}
}

二:调用win32的系统方法
该方法是调用win32的系统方法,主要实现过程如下:
先创建一个类,

 public class Messagebox
    {
        [DllImport("User32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
        public static extern int MessageBox(IntPtr handle, String message, String title, int type);
    }

然后调用该方法

public class test : MonoBehaviour
{
 void Start()
{
   Messagebox.MessageBox(IntPtr.Zero,"还没有该场景!","xxx",0);
}
}

效果图如下:
这里写图片描述
三:自己封装UGUI控件的方式。
最终的实现效果如下:
这里写图片描述
弹出对话框时会给整个界面覆盖一层半透明遮罩,弹框的标题支持定制,中间的text文本框可以上下滚动以适应多内容输出。
具体的实现如下:
一:在Canvas下创建Image,修改名字为background,修改布局为填充父控件(Canvas),修改background的颜色和透明度以适应要求,当然也可以自己添加半透明图片。
二:在background下创建image,修改大小为200,150,修改名字为MessageBox,在MessageBox下创建Title,长度为填充父物体,高度为25,stretch与父控件上方对齐,然后创建空物体,修改名字为Content,宽度为填充父控件,高度为100,给Content添加Mask遮罩组件。给Content添加Scroll Rect组件,Scroll Rect组件设置如下
这里写图片描述
在Content下创建Text,来显示要显示的内容。给text添加Content Size Fitter组件,修改Vertical Fit为Preferred Size来动态适应Text内容的多少。修改Pivot为(0.5,1),然后布局设置为Top,stretch如下:
这里写图片描述
在MessageBox下创建空物体,重命名为ButtonGroup.布局为与父控件下部对齐,tranform设置如下:
这里写图片描述
最后在ButtonGroup放置两个按钮。
最终目录结构为
这里写图片描述
然后是代码的编写,这个过程分为三步,第一步,基本的控件逻辑,这个脚本挂载到MessageBox上,代码如下:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using Common;

public class UIMessage : MonoBehaviour {
    public Text Title;
    public Text Content;//这个是Content下的text
    public Button Sure;
    public Button Cancle;
    void Start()
    {
        Sure.onClick.AddListener(MessageBox.Sure);
        Cancle.onClick.AddListener(MessageBox.Cancle);
       Title.text =MessageBox.TitleStr;
       Content.text = MessageBox.ContentStr;
    }
}

然后绑定相应控件。
第二步,编写MessageBox的实现类

using UnityEngine;
using System.Collections;
namespace Common
{
    public delegate void Confim();
    public class MessageBox 
    {
       static GameObject Messagebox;
       static int Result = -1;
        public static Confim confim;
        public static string TitleStr;
        public static string ContentStr;
        public static void Show(string content)
        {          
            ContentStr = "    " + content;
            Messagebox = (GameObject)Resources.Load("Prefab/Background");
            Messagebox= GameObject.Instantiate(Messagebox,GameObject.Find("Canvas").transform) as GameObject;
            Messagebox.transform.localScale = new Vector3(1, 1, 1);            
            Messagebox.GetComponent<RectTransform>().anchoredPosition = Vector3.zero;
            Messagebox.GetComponent<RectTransform>().offsetMin = Vector2.zero;
            Messagebox.GetComponent<RectTransform>().offsetMax = Vector2.zero;      
            Time.timeScale = 1;      
        }
        public static void Show(string title,string content)
        {
            TitleStr = title;
            ContentStr ="    "+ content;
            Messagebox = (GameObject)Resources.Load("Prefab/Background");
            Messagebox = GameObject.Instantiate(Messagebox, GameObject.Find("Canvas").transform) as GameObject;
            Messagebox.transform.localScale = new Vector3(1, 1, 1);
            Messagebox.GetComponent<RectTransform>().anchoredPosition = Vector3.zero;
            Messagebox.GetComponent<RectTransform>().offsetMin = Vector2.zero;
            Messagebox.GetComponent<RectTransform>().offsetMax = Vector2.zero;    
            Time.timeScale = 1;     
        }
        public static void Sure()
        {
            if (confim!= null)
            {
                confim();
                GameObject.Destroy(Messagebox);
                TitleStr = "标题";
                ContentStr = null;
                Time.timeScale = 0;
            }
        }     
        public static void Cancle()
        {
            Result = 2;
            GameObject.Destroy(Messagebox);
            TitleStr = "标题";
            ContentStr = null;
            Time.timeScale = 0;
        }
    }
}

第三部:使用该MessageBox实现模态弹框。

public void test()
    {
        MessageBox.Show("XXX窗口","输出了XXXX");
        MessageBox.confim=()=>{
        //这里写你自己点击确定按钮后的操作
            Debug.Log("shabile");
        };
    }

最终效果如下:
这里写图片描述

  • 24
    点赞
  • 107
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
Unity弹出对话框可以使用Unity提供的GUILayout或者Unity UI来实现。下面是使用Unity UI的示例代码: 1. 创建一个空的Canvas对象,并在Canvas下创建一个Button对象。 2. 选中Button对象,点击Inspector面板上的Add Component按钮,添加一个Button组件。 3. 创建一个空的C#脚本,将其附加到Button对象上。 4. 在该脚本中编写以下代码: ```c# using UnityEngine; using UnityEngine.UI; public class DialogBox : MonoBehaviour { public Text messageText; public GameObject dialogBox; public void ShowDialog(string message) { messageText.text = message; dialogBox.SetActive(true); } public void HideDialog() { dialogBox.SetActive(false); } } ``` 5. 在Canvas下创建一个Text对象,用于显示对话框中的文本。 6. 将Text对象拖拽到DialogBox脚本的messageText字段中。 7. 在Canvas下创建一个空的Panel对象,并将其子对象设置为对话框的背景图。 8. 将Panel对象拖拽到DialogBox脚本的dialogBox字段中。 现在,你可以通过调用DialogBox脚本中的ShowDialog方法来显示对话框,并通过调用HideDialog方法来隐藏对话框。例如,在点击Button时显示对话框,可以在Button对象上添加以下代码: ```c# using UnityEngine; public class ButtonClick : MonoBehaviour { public DialogBox dialogBox; public void OnButtonClick() { dialogBox.ShowDialog("Hello, this is a dialog box!"); } } ``` 确保将DialogBox对象拖拽到ButtonClick脚本的dialogBox字段中。这样,当点击Button时,对话框会显示出来,并显示"Hello, this is a dialog box!"的文本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值