一、弹出框的搭建:

布局如图: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 之 自定义弹出框的更多相关文章

  1. js自定义弹出框

    js自定义弹出框: 代码如下 <html> <head><title>自定义弹出对话框</title> <style type ="te ...

  2. android自定义弹出框样式实现

    前言: 做项目时,感觉Android自带的弹出框样式比较丑,很多应用都是自己做的弹出框,这里也试着自己做了一个. 废话不说先上图片: 实现机制 1.先自定义一个弹出框的样式 2.自己实现CustomD ...

  3. react native仿微信性别选择-自定义弹出框

    简述 要实现微信性别选择需要使用两部分的技术: 第一.是自定义弹出框: 第二.单选框控件使用: 效果 实现 一.配置弹出框 弹出框用的是:react-native-popup-dialog(Git地址 ...

  4. .NET MVC 学习笔记(四)— 基于Bootstarp自定义弹出框

    .NET MVC 学习笔记(四)—— 基于Bootstarp自定义弹出框 转载自:https://www.cnblogs.com/nele/p/5327380.html (function ($) { ...

  5. jquery实现自定义弹出框

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. bootstrap插件bootbox参数和自定义弹出框宽度设置

    插件官方地址:http://bootboxjs.com/ alert: 1 bootbox.alert("Hello world!", function() {}); dialog ...

  7. 自定义弹出框基于zepto 记得引入zepto

    html <!DOCTYPE html> <html> <meta charset="utf-8"> <title></tit ...

  8. android 自定义弹出框AlertDialog ,很炫的哦

      于是就小小的模仿了下自己写了这个这样的效果,主要代码如下:dlg = new AlertDialog.Builder(context).create();dlg.show();dlg.getWin ...

  9. 微信小程序组件 自定义弹出框

    <!-- 点击立即抢拼弹出框 --> <view class='add-rob' bindtap="setModalStatus" data-status=&qu ...

随机推荐

  1. 关于大脑与CPU的简单思考

    今天午休突发奇想的思考了大脑与cpu的差异,发现出了大脑是生物信号驱动的单核cpu而已(并行任务是时间片的调度,要额外的堆栈记忆或者物理如纸张的存储). 大脑永远是线性的逐行执行指令,执行期间无法判断 ...

  2. Kotlin学习系列(二)

    IF表达式 if在kotlin可以当做表达式使用跟java的三元操作符类似: var max = if( a > b ) a else b if分支可以使用代码块,最后一个表达式是返回值: va ...

  3. linux 安装docker

    1.安装环境 此处在Centos7进行安装,可以使用以下命令查看CentOS版本 lsb_release -a 在 CentOS 7安装docker要求系统为64位.系统内核版本为 3.10 以上,可 ...

  4. Enum枚举的使用实现

    业务中涉及到的状态字段或者简单的选择项的使用. 例如: 1.定义enum枚举类. package com.yjl.enums; import java.util.Objects; public enu ...

  5. 虚拟现实中的Motion Sickness晕动症问题 - VIMS

    虚拟现实(VR)中的晕动症 - VIMS 在玩VR的时候,很多玩家都遇到过发晕恶心等症状,这就是晕动症(Motion Sickness,以下或简称MS).MS并不是VR特有的问题.我们在坐船.坐车.坐 ...

  6. MapReduce案例-好友推荐

    用过各种社交平台(如QQ.微博.朋友网等等)的小伙伴应该都知道有一个叫 "可能认识" 或者 "好友推荐" 的功能(如下图).它的算法主要是根据你们之间的共同好友 ...

  7. Python 爬虫(四):Selenium 框架

    Selenium 是一个用于测试 Web 应用程序的框架,该框架测试直接在浏览器中运行,就像真实用户操作一样.它支持多种平台:Windows.Linux.Mac,支持多种语言:Python.Perl. ...

  8. classpath:类路径

    classpath:可以用于web.xml中获取spring springmvc配置文件的位置 用于sprnig配置文件中获取mapper的位置 classpath:可以获取到java目录下的,res ...

  9. 推荐一款可以丰富博文GIF免费录制工具——GifCam

    在网上写博文,看别人添加gif图片很好奇,于是尝试制作并传递了一次,确实挺有意思的,于是分享一下. gifcam是一个绿色的,可以录制GIF动图的小软件,十分适合用来录制电脑的各种操作. 在这里附上工 ...

  10. 【NOIP2003】传染病控制

    Description 问题背景: 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府 决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完全认识这种 ...