示例:对话框
工程截图
代码
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// 对话框UI
/// </summary>
public class UIDialogBox : GameEventBehaviour
{
public static UIDialogBox Instance { get; private set; }
[SerializeField]
private GameObject mask;
[SerializeField]
private GameObject okButton;
[SerializeField]
private GameObject cancelButton;
[SerializeField]
private Text m_Text;
[SerializeField]
private Text m_TextOk;
[SerializeField]
private Text m_TextCancel;
private Action okCallback = null;
private Action cancelCallback = null;
private float freezeClickTime = -1f;
public enum ButtonLayout
{
None, //不显示操作按钮
OK, //只显示确认按钮
OK_Cancel //同时显示确认和取消按钮
}
protected override void OnAwake()
{
Instance = this;
}
protected override void OnUpdate()
{
if (freezeClickTime <= 0)
return;
freezeClickTime -= Time.deltaTime;
if (freezeClickTime <= 0)
{
m_TextOk.text = Config.LAN_BUTTON_SURE;
}
else
{
int cd = Mathf.CeilToInt(freezeClickTime);
m_TextOk.text = string.Format("{0}({1})", Config.LAN_BUTTON_SURE, cd);
}
}
public void Close()
{
m_TextOk.text = string.Empty;
m_TextCancel.text = string.Empty;
mask.SetActive(false);
}
public void OnClickOK()
{
if (freezeClickTime > 0)
return;
Close();
okCallback?.Invoke();
okCallback = null;
cancelCallback = null;
}
public void OnClickCancel()
{
Close();
cancelCallback?.Invoke();
cancelCallback = null;
okCallback = null;
freezeClickTime = -1;
}
public void SetCancelText(string text)
{
m_TextCancel.text = text;
}
public void SetOkText(string text)
{
m_TextOk.text = text;
}
public void Show(string text, ButtonLayout layout=ButtonLayout.OK, Action okCallback=null, float freezeClickTime = -1)
{
if (string.IsNullOrEmpty(m_TextOk.text))
m_TextOk.text = "确定";
if (string.IsNullOrEmpty(m_TextCancel.text))
m_TextCancel.text = "取消";
m_Text.text = text + "\n";
m_TextOk.text = Config.LAN_BUTTON_SURE;
mask.SetActive(true);
okButton.SetActive(layout == ButtonLayout.OK || layout == ButtonLayout.OK_Cancel);
cancelButton.SetActive(layout == ButtonLayout.OK_Cancel);
RectTransform okRectTransform = okButton.GetComponent<RectTransform>();
if (layout == ButtonLayout.OK_Cancel)
SetAnchoredPositionX(okRectTransform, -121f);
else
SetAnchoredPositionX(okRectTransform, 0f);
this.okCallback = okCallback;
this.freezeClickTime = freezeClickTime;
}
private void SetAnchoredPositionX(RectTransform rectTransform, float x)
{
Vector2 anchoredPosition = rectTransform.anchoredPosition;
anchoredPosition.x = x;
rectTransform.anchoredPosition = anchoredPosition;
}
}
效果