unity 之 自定义弹出框
一、弹出框的搭建:
布局如图:Message为整个父物体,并且添加UiMessage代码。panel为遮罩。
MessageBox为整个提示框,Panel为标题,ok为确定按钮,cancel为取消按钮,retry为重试按钮,Text为提示框的文字。
注意大小写,后面代码会根据名称进行获取对应组建。

效果如下:


二、MessageBox代码:
要说明的都在代码中注释了。仿照Windows的提示框功能,如果功能不足可自行添加。例如关闭按钮、显示图标等。
using System; public enum DialogResult
{
Ok,
OKCancel,
RetryCancel,
YesNo,
YesNoCancel
} public static class MessageBox
{
/// <summary>
/// true表示模态框
/// </summary>
public static bool type;
//三个委托,分别为三个按钮的点击运行事件
public static Action clickOk;
public static Action clickRetry;
public static Action clickCancel;
public static DialogResult dialogResult;
//标题
public static string headText;
//文本
public static string text;
//状态。用于显示或隐藏弹出框
public static bool state; /// <summary>
///重试按钮点击事件
/// </summary>
public static void onClickRetry()
{
state = false;
clickRetry?.Invoke();
clickRetry = null;
}
/// <summary>
/// 取消按钮点击事件
/// </summary>
public static void onClickCancel()
{
state = false;
clickCancel?.Invoke();
clickCancel = null;
}
/// <summary>
/// 确定按钮点击事件
/// </summary>
public static void onClickOk()
{
state = false;
clickOk?.Invoke();
clickOk = null;
} /// <summary>
/// 显示
/// </summary>
/// <param name="_text">内容</param>
/// <param name="_head">标题</param>
/// <param name="dialog">样式</param>
/// <param name="type">模式</param>
public static void Show(string _text,string _head,DialogResult _dialog, bool _type = true)
{
text = _text;
headText = _head;
dialogResult = _dialog;
type = _type;
state = true;
}
public static void Show(string _text,string _head,bool _type = true)
{
text = _text;
headText = _head;
dialogResult = DialogResult.Ok;
type = _type;
state = true;
}
public static void Show(string _text, bool _type = true)
{
text = _text;
headText = "信息";
dialogResult = DialogResult.Ok;
type = _type;
state = true;
} }
三、UiMessage代码:
添加到Message物体上。用于控制弹出框的显示等功能。
using UnityEngine;
using UnityEngine.UI; public class UiMessage : MonoBehaviour
{
public Button ok;
public Button cancel;
public Button retry;
/// <summary>
/// 遮罩
/// </summary>
public GameObject panel;
public Text headText;
public Text text;
/// <summary>
/// 弹出框
/// </summary>
private GameObject messageBox; private void Awake()
{
messageBox = gameObject.transform.GetChild().gameObject;
ok = messageBox.transform.Find("ok").GetComponent<Button>();
cancel = messageBox.transform.Find("cancel").GetComponent<Button>();
retry = messageBox.transform.Find("retry").GetComponent<Button>();
panel = gameObject.transform.Find("panel").gameObject;
text = messageBox.transform.Find("Text").GetComponent<Text>();
headText = messageBox.transform.GetChild().Find("head").GetComponent<Text>(); //将提示框居中显示
messageBox.transform.position = new Vector3(Screen.width / - messageBox.GetComponent<RectTransform>().rect.width / ,
Screen.height / + messageBox.GetComponent<RectTransform>().rect.height / , );
init();
} private void OnEnable()
{
init();
} private void init()
{
ok.onClick.AddListener(MessageBox.onClickOk);
cancel.onClick.AddListener(MessageBox.onClickCancel);
retry.onClick.AddListener(MessageBox.onClickRetry);
text.text = MessageBox.text;
headText.text = MessageBox.headText; //根据传递的参数,进行样式的显示
switch (MessageBox.dialogResult)
{
case DialogResult.Ok:
ok.gameObject.SetActive(true);
cancel.gameObject.SetActive(false);
retry.gameObject.SetActive(false);
break;
case DialogResult.OKCancel:
ok.gameObject.SetActive(true);
cancel.gameObject.SetActive(true);
retry.gameObject.SetActive(false);
break;
case DialogResult.RetryCancel:
ok.gameObject.SetActive(true);
cancel.gameObject.SetActive(true);
retry.gameObject.SetActive(true);
break;
case DialogResult.YesNo:
ok.transform.GetChild().GetComponent<Text>().text = "是";
cancel.transform.GetChild().GetComponent<Text>().text = "否";
ok.gameObject.SetActive(true);
cancel.gameObject.SetActive(true);
retry.gameObject.SetActive(false);
break;
case DialogResult.YesNoCancel:
ok.transform.GetChild().GetComponent<Text>().text = "是";
cancel.transform.GetChild().GetComponent<Text>().text = "否";
ok.gameObject.SetActive(true);
cancel.gameObject.SetActive(true);
retry.gameObject.SetActive(true);
break;
}
} private void Update()
{
panel.SetActive(MessageBox.type);
gameObject.SetActive(MessageBox.state);
}
}
三、显示框的调用:
此处调用可以自行设置一个按钮,在其点击事件中注册调用即可。
笔者使用项目中的方式进行演示。具体不做说明。调用方式已给出。
特别注意:由于UiMessage调用了MessageBox的方法,所以必须先初始化MessageBox的数据。使用什么就初始化什么。笔者使用了ok、cancel按钮(默认不初始化模式,即为模态框,不初始化DialogResult即为只显示ok按钮),所以注册了相应的点击事件(委托)。最后显示弹出框(整个包含遮罩和弹出框)。

三、运行结果:

三、弹出框可拖拽移动:
将DragManage添加到MessageBox物体上面。(如果你想让ui物体可拖拽,对其添加DragManage即可实现)
笔者就不做演示了
using UnityEngine;
using UnityEngine.EventSystems; /// <summary>
/// 只是用来处理拖拽
/// </summary>
public class DragManage : MonoBehaviour, IDragHandler, IBeginDragHandler, IEndDragHandler
{
private Vector3 offect; public void OnBeginDrag(PointerEventData eventData)
{
offect = Input.mousePosition - transform.position;
} public void OnDrag(PointerEventData eventData)
{
transform.position = Input.mousePosition - offect;
} public void OnEndDrag(PointerEventData eventData)
{
transform.position = Input.mousePosition - offect;
}
}
unity 之 自定义弹出框的更多相关文章
- js自定义弹出框
js自定义弹出框: 代码如下 <html> <head><title>自定义弹出对话框</title> <style type ="te ...
- android自定义弹出框样式实现
前言: 做项目时,感觉Android自带的弹出框样式比较丑,很多应用都是自己做的弹出框,这里也试着自己做了一个. 废话不说先上图片: 实现机制 1.先自定义一个弹出框的样式 2.自己实现CustomD ...
- react native仿微信性别选择-自定义弹出框
简述 要实现微信性别选择需要使用两部分的技术: 第一.是自定义弹出框: 第二.单选框控件使用: 效果 实现 一.配置弹出框 弹出框用的是:react-native-popup-dialog(Git地址 ...
- .NET MVC 学习笔记(四)— 基于Bootstarp自定义弹出框
.NET MVC 学习笔记(四)—— 基于Bootstarp自定义弹出框 转载自:https://www.cnblogs.com/nele/p/5327380.html (function ($) { ...
- jquery实现自定义弹出框
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- bootstrap插件bootbox参数和自定义弹出框宽度设置
插件官方地址:http://bootboxjs.com/ alert: 1 bootbox.alert("Hello world!", function() {}); dialog ...
- 自定义弹出框基于zepto 记得引入zepto
html <!DOCTYPE html> <html> <meta charset="utf-8"> <title></tit ...
- android 自定义弹出框AlertDialog ,很炫的哦
于是就小小的模仿了下自己写了这个这样的效果,主要代码如下:dlg = new AlertDialog.Builder(context).create();dlg.show();dlg.getWin ...
- 微信小程序组件 自定义弹出框
<!-- 点击立即抢拼弹出框 --> <view class='add-rob' bindtap="setModalStatus" data-status=&qu ...
随机推荐
- Centos7 快速安装Docker
写在前面 Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以轻松批量地在生产环境中部署. 网上的安装教程也很多这里我推 ...
- TensorFlow基本计算单元与基本操作
在学习深度学习等知识之前,首先得了解著名的框架TensorFlow里面的一些基础知识,下面首先看一下这个框架的一些基本用法. import tensorflow as tf a = 3 # Pytho ...
- 初识TDD
什么是 TDD ? TDD 有广义和狭义的区分. 广义角度指的是 ATDD(Acceptance Test Driven Development),包括 BDD(Behavior Driven Tes ...
- Tomcat源码分析一:编译Tomcat源码
Tomcat源码分析一:编译Tomcat源码 1 内容介绍 在之前的<Servlet与Tomcat运行示例>一文中,给大家带来如何在Tomcat中部署Servlet应用的相关步骤,本文将就 ...
- spring源码分析系列4:ApplicationContext研究
ApplicationContext接口 首先看一下一个最基本的上下文应该是什么样子 ApplicationContext接口的注释里写的很清楚: 一个基本applicationContext应该提供 ...
- 通过搭建MySQL掌握k8s(Kubernetes)重要概念(下):参数配置
本文通过搭建MySQL环境来了解k8s的重要概念,包括持久卷,网络和参数配置.这是下篇,专门讲解参数配置.如果你有些地方不能完全看明白,请先看上篇"通过搭建MySQL掌握k8s(Kubern ...
- WebSocket协议与抓包
WebSocket协议 WebSocket并不是全新的协议,而是利用了HTTP协议来建立连接,它的目的是在浏览器和服务器之间建立一个不受限的双向通信的通道,比如说,服务器可以在任意时刻发送消息给浏览器 ...
- vue自定义指令,比onerror更优雅的方式实现当图片加载失败时使用默认图,提供三种方法
首先,来看下效果图(演示一下图片正常加载与加载失败时的效果) 在线体验地址:https://hxkj.vip/demo/vueImgOnerror/ 一.常规方法解决 我们都知道,img标签支持one ...
- 索引的底层实现(B 树)
一.B 树 1.B-Tree介绍 B-树的搜索,从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的儿子结点:重复,直到所对应的儿子指针为空,或已经是叶 ...
- BS结构的一个注册用户的功能
注册用户功能 学了Java一段时间,就想折腾折腾,就做了一个注册的功能,用HTML写了一个网页上的比较简陋的界面,用Java做了一个后台简陋的服务器处理数据,最后将数据存储到数据库中. 注册界面 ...