MessageBox.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. using DG.Tweening;
  2. using System;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using UnityEngine.UI;
  6. using static UnityCommon.MessageBoxParams;
  7. namespace UnityCommon
  8. {
  9. public class MessageBox : MonoBehaviour
  10. {
  11. [SerializeField]
  12. private GameObject goRoot;
  13. [SerializeField]
  14. private Text text_info;
  15. [SerializeField]
  16. private Button btn_confirm;
  17. [SerializeField]
  18. private Button btn_cancel;
  19. [SerializeField]
  20. private Button btn_yes;
  21. [SerializeField]
  22. private Button btn_no;
  23. [SerializeField]
  24. private Button btn_forbid;
  25. public Action<bool> ShowAction;
  26. public void OnClickConfirm() { }
  27. public void OnClickCancel() { }
  28. public void OnClickYes() { }
  29. public void OnClickNo() { }
  30. private void Awake()
  31. {
  32. btn_confirm.onClick.AddListener(OnClick_Confirm);
  33. btn_cancel.onClick.AddListener(OnClick_Cancel);
  34. btn_yes.onClick.AddListener(OnClick_Yes);
  35. btn_no.onClick.AddListener(OnClick_No);
  36. btn_forbid.onClick.AddListener(OnClick_Forbid);
  37. }
  38. private void OnClick_Forbid()
  39. {
  40. goRoot.transform.DOShakePosition(0.3f, 5, 80, 90, true, false);
  41. }
  42. static Stack<MessageInfo> stackMsg = new Stack<MessageInfo>();
  43. private void ShowMessage(MessageBoxParams p)
  44. {
  45. ShowMessage(p.message, p.messageType, p.callback);
  46. }
  47. public void ShowMessage(MessageInfo messageInfo)
  48. {
  49. #if UNITY_SERVER
  50. Debug.Log(messageInfo.info);
  51. #else
  52. stackMsg.Push(messageInfo);
  53. UpdateMsgUI();
  54. #endif
  55. }
  56. public void ShowMessage(string info, MessageType messageType = MessageType.Confirm, Action<ResultType> callback = null)
  57. {
  58. ShowMessage(new MessageInfo() { info = info, messageType = messageType, callback = callback });
  59. }
  60. private void UpdateMsgUI()
  61. {
  62. if (stackMsg.Count > 0)
  63. {
  64. MessageInfo messageInfo = stackMsg.Peek();
  65. text_info.text = messageInfo.info;
  66. btn_cancel.gameObject.SetActive(messageInfo.messageType == MessageType.ConfirmCancel || messageInfo.messageType == MessageType.YesNoCancel);
  67. btn_confirm.gameObject.SetActive(messageInfo.messageType == MessageType.Confirm || messageInfo.messageType == MessageType.ConfirmCancel);
  68. btn_yes.gameObject.SetActive(messageInfo.messageType == MessageType.YesNoCancel);
  69. btn_no.gameObject.SetActive(messageInfo.messageType == MessageType.YesNoCancel);
  70. ShowDlg();
  71. }
  72. else
  73. {
  74. CloseDlg();
  75. }
  76. }
  77. private void OnClick_Confirm()
  78. {
  79. ReturnResult(ResultType.Confirm);
  80. }
  81. private void OnClick_Cancel()
  82. {
  83. ReturnResult(ResultType.Cancel);
  84. }
  85. private void OnClick_Yes()
  86. {
  87. ReturnResult(ResultType.Yes);
  88. }
  89. private void OnClick_No()
  90. {
  91. ReturnResult(ResultType.No);
  92. }
  93. private void ReturnResult(ResultType resultType)
  94. {
  95. var msgInfo = stackMsg?.Pop();
  96. msgInfo?.callback?.Invoke(resultType);
  97. UpdateMsgUI();
  98. }
  99. private void CloseDlg()
  100. {
  101. ShowAction?.Invoke(false);
  102. Visible = false;
  103. }
  104. private void ShowDlg()
  105. {
  106. ShowAction?.Invoke(true);
  107. Visible = true;
  108. }
  109. private bool visible;
  110. public bool Visible
  111. {
  112. get { return visible; }
  113. set
  114. {
  115. gameObject.SetActive(value);
  116. visible = value;
  117. }
  118. }
  119. public class MessageInfo
  120. {
  121. public string info;
  122. public MessageType messageType;
  123. public Action<ResultType> callback;
  124. }
  125. }
  126. }