Unity之MessageBox

来源:互联网 发布:js display:none 编辑:程序博客网 时间:2024/05/17 09:34

先上示意图:
这里写图片描述

从图中可以看出,这是标准的MessageBox样式。我采用的是UGUI,中间是文字内容,下面包括确定取消两个按钮,右上角一个关闭按钮。

那么模仿MFC呢,我写了一个枚举如下:

public enum MessageType{    Confirm,            //确定    Cancel,             //取消    ConfirmCancel,      //确定取消    Yes,                //是    No,                 //否    YesNO,              //是否}

从上可以看出,这是在定义按钮的样式,举例:Confirm指仅包括确定按钮。

接下来,直接上挂在该UI上的脚本代码:

using System;using UnityEngine;using UnityEngine.EventSystems;using UnityEngine.UI;public class MessageBoxDialog : MonoBehaviour{    public GameObject CancelButton = null;          //取消按钮    public GameObject ConfirmButton = null;         //确定按钮    public GameObject CloseButton = null;           //关闭按钮    public Text MessageText = null;                 //提示文字    public Text ConfirmText = null;                 //确定文字    public Text CancelText = null;                  //取消文字    public Action OnCloseEvent = null;    public Action OnConfirmEvent = null;    // Use this for initialization    void Start()    {        AddListener();    }    // Update is called once per frame    void Update()    {    }    private void AddListener()    {        if (CancelButton != null)        {            EventTriggerListener.Get(CancelButton).onClick = OnCancelButtonClicked;        }        if (ConfirmButton != null)        {            EventTriggerListener.Get(ConfirmButton).onClick = OnConfirmButtonClicked;        }    }    private void OnConfirmButtonClicked(GameObject go, BaseEventData eventData)    {        if (OnConfirmEvent != null)        {            OnConfirmEvent();        }        else        {            OnCloseButtonClicked(null, null);        }    }    private void OnCancelButtonClicked(GameObject go, BaseEventData eventData)    {        if (OnCloseEvent != null)        {            OnCloseEvent();        }        else        {            OnCloseButtonClicked(null, null);        }    }    private void OnCloseButtonClicked(GameObject go, BaseEventData eventData)    {        GameObject.DestroyImmediate(gameObject);    }    public void UpdateButton(MessageType type)    {        switch (type)        {            case MessageType.ConfirmCancel:                break;            case MessageType.Cancel:                ConfirmButton.SetActive(false);                break;            case MessageType.Confirm:                CancelButton.SetActive(false);                break;            case MessageType.No:                ConfirmButton.SetActive(false);                CancelText.text = "否";                break;            case MessageType.Yes:                CancelButton.SetActive(false);                ConfirmText.text = "是";                break;            case MessageType.YesNO:                ConfirmText.text = "是";                CancelText.text = "否";                break;        }    }}

接下来是该篇文章的重点代码了,

using System;using UnityEngine;public class MessageBox{    private static GameObject _messageBoxPrefab = null;    private static GameObject _messageBox = null;    private static string _messageBoxPrefabPath = "UI/MessageBox";    public static void Show(string info, MessageType type = MessageType.ConfirmCancel, Action cancelCallback = null,        Action confirmCallback = null)    {        if (_messageBoxPrefab == null)        {            _messageBoxPrefab = Resources.Load(_messageBoxPrefabPath) as GameObject;        }        _messageBox = GameObject.Instantiate(_messageBoxPrefab) as GameObject;        MessageBoxDialog msgbox = _messageBox.GetComponent<MessageBoxDialog>();        msgbox.UpdateButton(type);        msgbox.OnConfirmEvent += confirmCallback;        msgbox.OnCloseEvent += cancelCallback;        msgbox.MessageText.text = info;        //以下是在自己的场景管理的基础上写的,既然这里还没讲到我的场景管理,就暂时用比较low的方法了        //GameObject uiRoot = ScenesManager.Instance.CurScene.UiRoot.gameObject;        //_messageBox.transform.SetParent(uiRoot.transform, false);        GameObject canvas = GameObject.Find("Canvas");        if(canvas != null)        {            _messageBox.transform.SetParent(canvas.transform, false);        }    }}

该段代码中,大家应该注意到三点:
1、MessageBox的预制件路径,修改为自己的路径;
2、加载该预制件的方法,我用的是Resources.Load,这里并没有将我的资源管理介绍出来,所以就用的这个;
3、实例化该UI,给该UI赋父物体的时候,用的是比较low的方法,注释已经解释了。

接下来,就直接上工程了,大家 如有疑问,请留言。
链接:http://pan.baidu.com/s/1kVibxQJ 密码:45ql

以上知识分享,如有错误,欢迎指出,共同学习,共同进步。

1 0