using DG.Tweening; using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using static UnityCommon.MessageBoxParams; namespace UnityCommon { public class MessageBox : MonoBehaviour { [SerializeField] private GameObject goRoot; [SerializeField] private Text text_info; [SerializeField] private Button btn_confirm; [SerializeField] private Button btn_cancel; [SerializeField] private Button btn_yes; [SerializeField] private Button btn_no; [SerializeField] private Button btn_forbid; public Action ShowAction; public void OnClickConfirm() { } public void OnClickCancel() { } public void OnClickYes() { } public void OnClickNo() { } private void Awake() { btn_confirm.onClick.AddListener(OnClick_Confirm); btn_cancel.onClick.AddListener(OnClick_Cancel); btn_yes.onClick.AddListener(OnClick_Yes); btn_no.onClick.AddListener(OnClick_No); btn_forbid.onClick.AddListener(OnClick_Forbid); } private void OnClick_Forbid() { goRoot.transform.DOShakePosition(0.3f, 5, 80, 90, true, false); } static Stack stackMsg = new Stack(); private void ShowMessage(MessageBoxParams p) { ShowMessage(p.message, p.messageType, p.callback); } public void ShowMessage(MessageInfo messageInfo) { #if UNITY_SERVER Debug.Log(messageInfo.info); #else stackMsg.Push(messageInfo); UpdateMsgUI(); #endif } public void ShowMessage(string info, MessageType messageType = MessageType.Confirm, Action callback = null) { ShowMessage(new MessageInfo() { info = info, messageType = messageType, callback = callback }); } private void UpdateMsgUI() { if (stackMsg.Count > 0) { MessageInfo messageInfo = stackMsg.Peek(); text_info.text = messageInfo.info; btn_cancel.gameObject.SetActive(messageInfo.messageType == MessageType.ConfirmCancel || messageInfo.messageType == MessageType.YesNoCancel); btn_confirm.gameObject.SetActive(messageInfo.messageType == MessageType.Confirm || messageInfo.messageType == MessageType.ConfirmCancel); btn_yes.gameObject.SetActive(messageInfo.messageType == MessageType.YesNoCancel); btn_no.gameObject.SetActive(messageInfo.messageType == MessageType.YesNoCancel); ShowDlg(); } else { CloseDlg(); } } private void OnClick_Confirm() { ReturnResult(ResultType.Confirm); } private void OnClick_Cancel() { ReturnResult(ResultType.Cancel); } private void OnClick_Yes() { ReturnResult(ResultType.Yes); } private void OnClick_No() { ReturnResult(ResultType.No); } private void ReturnResult(ResultType resultType) { var msgInfo = stackMsg?.Pop(); msgInfo?.callback?.Invoke(resultType); UpdateMsgUI(); } private void CloseDlg() { ShowAction?.Invoke(false); Visible = false; } private void ShowDlg() { ShowAction?.Invoke(true); Visible = true; } private bool visible; public bool Visible { get { return visible; } set { gameObject.SetActive(value); visible = value; } } public class MessageInfo { public string info; public MessageType messageType; public Action callback; } } }