unity自定义弹出框功能

本文实例为大家分享了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(1).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(0).Find("head").GetComponent<Text>();

    //将提示框居中显示
    messageBox.transform.position = new Vector3(Screen.width / 2 - messageBox.GetComponent<RectTransform>().rect.width / 2,
        Screen.height / 2 + messageBox.GetComponent<RectTransform>().rect.height / 2, 0);
    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(0).GetComponent<Text>().text = "是";
        cancel.transform.GetChild(0).GetComponent<Text>().text = "否";
        ok.gameObject.SetActive(true);
        cancel.gameObject.SetActive(true);
        retry.gameObject.SetActive(false);
        break;
      case DialogResult.YesNoCancel:
        ok.transform.GetChild(0).GetComponent<Text>().text = "是";
        cancel.transform.GetChild(0).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;
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C# winform实现右下角弹出窗口结果的方法

    本文实例讲述了C# winform实现右下角弹出窗口结果的方法.分享给大家供大家参考,具体如下: using System.Runtime.InteropServices; [DllImport("user32")] private static extern bool AnimateWindow(IntPtr hwnd, int dwTime, int dwFlags); //下面是可用的常量,按照不合的动画结果声明本身须要的 private const int AW_HOR_POS

  • C#实现客户端弹出消息框封装类实例

    本文实例讲述了C#实现客户端弹出消息框封装类.分享给大家供大家参考.具体如下: asp.net在服务器端运行,是不能在服务器端弹出对话框的,但是C#可以通过在页面输出JS代码实现弹出消息框的效果,这个C#类封装了常用的消息框弹出JS代码,可以在服务器端调用,在客户端显示对话框.不但可以显示JS的警告框,还可以显示模式窗口,非常方便. using System; using System.Web; using System.Web.UI; using System.Web.UI.WebContro

  • unity自定义弹出框功能

    本文实例为大家分享了unity自定义弹出框的具体方法,供大家参考,具体内容如下 一.弹出框的搭建 布局如图:Message为整个父物体,并且添加UiMessage代码.panel为遮罩. MessageBox为整个提示框,Panel为标题,ok为确定按钮,cancel为取消按钮,retry为重试按钮,Text为提示框的文字. 注意大小写,后面代码会根据名称进行获取对应组建. 效果如下: 二.MessageBox代码 要说明的都在代码中注释了.仿照Windows的提示框功能,如果功能不足可自行添加

  • Android 仿微信朋友圈点赞和评论弹出框功能

    贡献/下载源码:https://github.com/mmlovesyy/PopupWindowDemo 本文简单模仿微信朋友圈的点赞和评论弹出框,布局等细节请忽略,着重实现弹出框.发评论,及弹出位置的控制. 1. 微信弹出框 微信朋友圈的点赞和评论功能,有2个组成部分: 点击左下角的"更多"按钮,弹出对话框: 点击评论,弹出输入框,添加评论并在页面中实时显示: 微信朋友圈点赞和评论功能 2. 实际效果 本文将建一个 ListView,在其 Item 中简单模仿微信的布局,然后着重实现

  • Yii框架弹出框功能示例

    本文实例讲述了Yii框架弹出框功能.分享给大家供大家参考,具体如下: <?php $this->beginWidget('zii.widgets.jui.CJuiDialog', array( 'id'=>'userinfo_edit',//弹窗ID // additional javascript options for the dialog plugin 'options'=>array(//传递给JUI插件的参数 'title'=>'修改个人信息', 'autoOpen

  • Android仿QQ长按删除弹出框功能示例

    废话不说,先看一下效果图,如果大家感觉不错,请参考实现代码: 对于列表来说,如果想操作某个列表项,一般会采用长按弹出菜单的形式,默认的上下文菜单比较难看,而QQ的上下文菜单就人性化多了,整个菜单给用户一种气泡弹出的感觉,而且会显示在手指按下的位置,而技术实现我之前是使用popupWindow和RecyclerView实现的,上面一个RecyclerView,下面一个小箭头ImageView,但后来发现没有必要,而且可定制化也不高,还是使用多个TextView更好一点. 我封装了一下,只需要一个P

  • Android 自定义弹出框实现代码

    废话不多说了,直接给大家上关键代码了. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. [self showAlertView:@"11111"]; } //自定义弹出框 -(void)showAlertView:(NSString *)strTipText { UIView *showView=[[UIView alloc]init]; [sho

  • Android仿淘口令复制弹出框功能(简答版)

    上篇文章给大家介绍了Android实现打开手机淘宝并自动识别淘宝口令弹出商品信息功能,接下来通过本文给大家分享android简单版仿淘口令复制弹出框功能,希望对大家有所帮助! 使用Android系统的粘贴板管理服务及ClipboardManager通过addPrimaryClipChangedListener添加Listener来监听粘贴板的状态,很很简单的一个小功能~ 1.首先创建一个Service在后台运行: Intent intent = new Intent(this,MainServi

  • android自定义弹出框样式的实现方法

    前言: 做项目时,感觉android自带的弹出框样式比较丑,很多应用都是自己做的弹出框,这里也试着自己做了一个. 废话不说先上图片: 实现机制 1.先自定义一个弹出框的样式 2.自己实现CustomDialog类,继承自Dialog,实现里面方法,在里面加载自定义样式的弹出框: 3.使用时,与使用Dialog一样 具体代码 dialog_normal_layout.xml样式文件 <?xml version="1.0" encoding="utf-8"?>

  • Android自定义弹出框的方法

    在开发Android项目的过程中,弹出框真的是我们的常见的一种互动式窗体,但是Android系统自带的弹出框往往都不能满足我们的需要,大多数的时候需要我们自定义一种更漂亮的窗体来来展示给用户. 接下来是我很久之前用的一个自定义弹出框,记录一下,以便自己日后使用. 0.先来一张效果图 1.先定义个一个继承自Dialog的自定义弹框CustomDialog import android.app.Dialog; import android.content.Context; import androi

  • 小程序自定义弹出框效果

    本文实例为大家分享了小程序自定义弹出框效果的具体代码,供大家参考,具体内容如下 my-pop----api: title ------字符串---------自定义弹窗标题context ------字符串---------自定义弹窗内容cancelTxt ------字符串---------取消按钮文本cancelCor ------字符串---------取消按钮颜色inp ------布尔值---------true文本弹出框---------fasle默认弹出框okTxt ------字

  • 微信小程序自定义底部弹出框功能

    本文实例为大家分享了微信小程序自定义底部弹出框的具体代码,供大家参考,具体内容如下 实现这么一个功能,点击选项进行选择,效果是从底部弹出选项框(带滑出动画),选择了某项或者点击其他地方,隐藏(带滑出动画).效果图如下: 可适用于任何场景,如普通选项(如图)或者类似商城小程序选择商品属性的弹出框.只需要把内容替换自己需要的即可. 1. wxml代码 <view class="wrap"> <view bindtap="showModal"> &

随机推荐