前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >零基础入门 28:MessageBox的制作和使用

零基础入门 28:MessageBox的制作和使用

作者头像
韩东吉
发布2018-10-19 16:59:27
9780
发布2018-10-19 16:59:27
举报

上一篇分享了项目中的菊花loading如何制作和使用,这篇分析依然围绕项目实用功能组件介绍。

这篇分享的主要内容是如何制作一个实用的MessageBox。可能很多同学会问什么是MessageBox,实际上就是我们所说的公用弹窗,比如说下面俩种样式的弹窗都是MessageBox。

上面是很常见的一种提示框,里面有提示的文本内容,以及一个确定按钮,当然,按钮上的文字是“确定”,还是“好的”,这些我们都可以自己定义。

另外一种MessageBox弹窗就是下面的这种啦,也是必不可少的。

这种有两个按钮组成的复合MessageBox通常会处理一些其他功能,所以接下来的这篇内容,我将教会大家如何使用这俩种MessageBox。

正题开始


首先从预设文件的制作上来说,还是比较简单的 ,就是一些基本的Ugui的按钮图片和文本的摆放而已。

这里我发张图大概说下这个预设是怎么做的。

从上图可以大概看的出来,background节点下存放了背景资源图,notifyText就是中间的提示文本,下面的两个TypeOnePanel和TypeTwoPanel分别是存放只有一个按钮的样式和两个按钮的样式父节点。这就是整个UI的组成。

接下来把该UI保存成prefab后,放到Resources目录下即可。

如下图。

预设做好了,就到了代码阶段了,创建一个脚本名为MessageBox,并且增加ShowBox的接口。代码如下

代码如下

using UnityEngine;

using System.Collections;

using UnityEngine.UI;

using System;

using System.Collections.Generic;

using System.Collections;

public class MessageBox : MonoBehaviour

{

#region Public Attributes

public GameObject m_self;

public Text m_notifyText;

public GameObject m_typeOneParent;

public Button m_typeOneBtn;

public Text m_typeOneBtnText;

public GameObject m_typeTwoParent;

public Button m_leftBtn;

public Text m_leftBtnText;

public Button m_rightBtn;

public Text m_rightBtnText;

#endregion

#region Private Attributes

//messagebox使用类型,默认为1样式(只有1个按钮)

private int m_useType = 1;

//按钮点击事件

private Action<bool,object> m_btnClickAction;

//回调使用数据

private object m_actionData;

#endregion

#region Unity Messages

void Start()

{

m_typeOneBtn.onClick.AddListener(()=>

{

m_btnClickAction.Invoke(true,m_actionData);

m_self.SetActive(false);

});

m_leftBtn.onClick.AddListener(()=>

{

m_btnClickAction.Invoke(true,m_actionData);

m_self.SetActive(false);

});

m_rightBtn.onClick.AddListener(()=>

{

m_btnClickAction.Invoke(false,m_actionData);

m_self.SetActive(false);

});

}

#endregion

#region Public Methods

public void ShowBox(int type,string notifyText,string btnOneText,string btnTwoText,Action<bool,object> action,object dataValue)

{

m_notifyText.text = notifyText;

m_typeOneParent.SetActive(false);

m_typeTwoParent.SetActive(false);

m_btnClickAction = action;

m_actionData = dataValue;

//样式1

if(type == 1)

{

m_typeOneBtnText.text = btnOneText;

m_typeOneParent.SetActive(true);

}

//样式2

else

{

m_leftBtnText.text = btnOneText;

m_rightBtnText.text = btnTwoText;

m_typeTwoParent.SetActive(true);

}

m_self.SetActive(true);

}

#endregion

#region Override Methods

#endregion

#region Private Methods

#endregion

#region Inner

#endregion

}

这次的代码量可能会比较大,但是不要担心。 Public Attributes里面增加了对MessageBox这个预设的控制组件。Start函数里完成了对三个不同按钮的点击事件,ShowBox是我们的核心接口,也是调用显示messageBox的主接口。

说下这个接口的参数,type为1,代表样式1,否则为样式2,notifyText就是messageBox中间显示的提示文本。btnOneText和TwoText分别是左右两侧按钮的为本,当type为1的时候,btnOneText就是样式1的按钮文本。action是我们这个弹窗需要的代理回调事件,而回调可能需要参数传回,所以最后一个参数是我们返回的数据,object类型是任意类型,需要在接收使用的时候做装箱类型转换。

之后就可以在Unity里把这个脚本挂在到MessageBox上,并且关联组件,如下图。

之后呢,我们在场景里创建一个按钮,实现以下功能。

点击按钮后,呼出MessageBox,并且在MessageBox的交互按钮上可以通过LogError来显示回调信息,并且点击messageBox按钮后,关闭MessageBox同时,显示按钮本身。

接下来就创建一个BtnClickScript脚本,代码如下。

代码内容如下

using UnityEngine;

using System.Collections;

using UnityEngine.UI;

using System;

using System.Collections.Generic;

using System.Collections;

public class BtnClickScript : MonoBehaviour

{

#region Public Attributes

public Transform m_parent;

public Button m_btn;

#endregion

#region Private Attributes

#endregion

#region Unity Messages

void Start()

{

m_btn.onClick.AddListener(()=>

{

m_btn.gameObject.SetActive(false);

GameObject messageBox = GameObject.Instantiate(Resources.Load("MessageBox") as GameObject);

messageBox.transform.SetParent(m_parent);

messageBox.gameObject.GetComponent<RectTransform>().anchoredPosition = Vector2.zero;

messageBox.gameObject.GetComponent<RectTransform>().sizeDelta = Vector2.zero;

messageBox.GetComponent<MessageBox>().ShowBox(2,

"Jimin的公众号对你是否有帮助?",

"当然有",

"没卵用",

delegate(bool arg1, object arg2)

{

m_btn.gameObject.SetActive(true);

if(arg1)

{

Debug.LogError("点击了左侧的按钮");

Debug.LogError(arg2.ToString());

}

else

{

Debug.LogError("点击了右侧的按钮");

}

},

"这是回调要使用到的数据,已经传回来了");

});

}

#endregion

#region Public Methods

#endregion

#region Override Methods

#endregion

#region Private Methods

#endregion

#region Inner

#endregion

}

接下来,回到Unity,将该脚本和Canvas进行关联绑定,如下图

然后,我们就可以运行游戏,来测试一下效果了

从上面的代码图可以看的出来,我们调用的MessageBox的ShowBox传入的参数类型是2,

所以当我们运行后,应该是点击后出现类型2的样式,如下图

可以通过上图看的出来,点击右侧按钮时,日志也已经输出如下

点击左侧的按钮,我们在逻辑中写到,如果点击的是左侧的,会输出两句日志,第一句就是点击了左侧按钮,第二局是把我们传参的回调参数进行输出。

点击左侧的按钮日志如下图

上面演示的是第二种样式的,下面来演示一次样式1的效果

修改BtnOnClick代码如下

代码如下

messageBox.GetComponent<MessageBox>().ShowBox(1,

"Jimin:这是样式1的显示方式,点击下面好的按钮即可关闭",

"好的",

"",

delegate(bool arg1, object arg2)

{

m_btn.gameObject.SetActive(true);

if(arg1)

{

Debug.LogError("点击了好的按钮");

Debug.LogError(arg2.ToString());

}

},

"这次回调应该显示什么呢?");

回到项目运行,动图如下

日志图如下

好了 ,MessageBox的作用在项目里很大,今天分享的干货,就是教大家,如何制作一个messageBox并且提供俩种不同的显示样式。

大家是否已经掌握了呢?

今天的分享到这就结束了哈

下篇再见咯~~~

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-08-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 韩东吉的Unity杂货铺 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档