admin管理员组

文章数量:1641819

工作中使用软件经常会出现各种提示框?确定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程序狗一只,日常分享工作中遇到的问题与学习笔记。

本文标签: 自定义提示消息Unity