博客迁移
个人博客站点,欢迎访问,www.jiingfengji.tech
正文
先上示意图:
从图中可以看出,这是标准的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
以上知识分享,如有错误,欢迎指出,共同学习,共同进步。