hi,你好!欢迎访问本站!登录
本站由网站地图腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - 教程 - 杂谈 - 正文 君子好学,自强不息!

unity 之 自定义弹出框

2019-11-18杂谈搜奇网17°c
A+ A-
一、弹出框的搭建:

规划如图: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;
    }
}

 

 

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  移步手机端
unity 之 自定义弹出框

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
未定义标签

本文来源:搜奇网

本文地址:https://www.sou7.cn/282123.html

关注我们:微信搜索“搜奇网”添加我为好友

版权声明: 本文仅代表作者个人观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。请记住本站网址https://www.sou7.cn/搜奇网。

发表评论

选填

必填

必填

选填

请拖动滑块解锁
>>