Unity之MessageBox

本文介绍了如何使用Unity的UGUI实现消息框界面,包括不同类型的按钮配置和响应事件的处理方式,并提供了完整的脚本代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

博客迁移

个人博客站点,欢迎访问,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

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值