赞
踩
工作中使用软件经常会出现各种提示框?确定XXXXXX吗?选项一般是三个,是,否,取消。今天心血来潮,于是也尝试自己用unity制作一个简单的消息提示框。
准备工作:
首先需要搭建一个最简单的消息框界面。
然后开始编写编写一个单例模式类,专门用来管理各种消息提示框,代码如下:
public class SingleMessageBox : MonoBehaviour { public static GameObject UIMessageBox; private static SingleMessageBox messageBox; public static SingleMessageBox MessageBox { get { if (messageBox == null) { GameObject gameObject = new GameObject("SingleMessageBox"); //获取需要管理消息框的游戏物体 UIMessageBox = GameObject.Find("MessageBox"); messageBox = gameObject.AddComponent<SingleMessageBox>(); //Scene切换不会摧毁 DontDestroyOnLoad(gameObject); } return messageBox; } } public void DisplayMessageBox(string content, Action OK, Action Cancel) { UIMessageBox.SetActive(true); //因为一开始是将界面隐藏在画布外,所以第一次调用只需要将位置调整回来即可。此处不可使用postion,那个是世界坐标。 UIMessageBox.transform.localPosition = new Vector3(0, 0, 0); UIMessageBox.transform.GetChild(1).GetComponent<Text>().text = content; //使用前需要移除所有已绑定的事件,否则会执行多次。 UIMessageBox.transform.GetChild(2).GetComponent<Button>().onClick.RemoveAllListeners(); UIMessageBox.transform.GetChild(3).GetComponent<Button>().onClick.RemoveAllListeners(); UIMessageBox.transform.GetChild(4).GetComponent<Button>().onClick.RemoveAllListeners(); //给不同的按钮分别添加事件 UIMessageBox.transform.GetChild(2).GetComponent<Button>().onClick.AddListener(() => { OK(); UIMessageBox.SetActive(false); }); UIMessageBox.transform.GetChild(3).GetComponent<Button>().onClick.AddListener(() => { Cancel(); UIMessageBox.SetActive(false); }); UIMessageBox.transform.GetChild(4).GetComponent<Button>().onClick.AddListener(() => { UIMessageBox.SetActive(false); }); } }
然后编写一个测试脚本,代码如下:
public class Test : MonoBehaviour {
public Button saveButton;
private void Start()
{
saveButton.onClick.AddListener(Save);
}
private void Save()
{
SingleMessageBox.MessageBox.DisplayMessageBox("确定要保存吗?",()=> { Debug.Log("保存成功"); }, ()=> { Debug.Log("取消保存"); });
}
}
实战效果:
总结:实现方式有多种多样,我这里只是举了个最简单的例子。
先总结这个方法:首先制作一个消息界面,创建一个单例消息管理类管理它,这个类中有一个显示消息框的方法(通过setActive),参数有委托和string,传进来的委托负责每个按钮触发的事件,string负责修改提示文本。
注意点:初始化的时候通过Find的方法添加消息框,因为状态为false的游戏物体无法通过Find找到,所以一开始是将消息框放在了Canvas外,另外每次给按钮添加新的事件之前需要移除已有的事件,否则会多次执行(因为此处是控制setActive),如果是直接简单暴力的摧毁游戏物体,点击的时候再重新创建则不需要移除已有事件。
其他也能实现消息框的方法:
1、制作成预制体,为每个消息框单独的创建脚本,特定的时候调用特定的消息框,复用性较差。
2、在该博文方法中新增一个继承,即只创建一个最基础的消息框模板,具体如何实现,有几个按钮由子类继承的时候实现,工作中曾在FairyGUI的使用中见过。
3…
案例Demo
PS:这里是U3D程序狗一只,日常分享工作中遇到的问题与学习笔记。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。