在做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().anchoredPosition = Vector3.zero;
Messagebox.GetComponent().offsetMin = Vector2.zero;
Messagebox.GetComponent().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().anchoredPosition = Vector3.zero;
Messagebox.GetComponent().offsetMin = Vector2.zero;
Messagebox.GetComponent().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");
};
}