ActivityMessageController.cs 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using Sirenix.OdinInspector;
  6. using KairoEngine.Core;
  7. using KairoEngine.UI;
  8. namespace KairoEngine.UI.ActivityMessages
  9. {
  10. //* This is the simplest possible implementation of this controller
  11. // Todo: Add icons to activity messages
  12. // Todo: Add autohide prorperty to messages
  13. // Todo: Cleanup list of activeMessages that have been destroyed
  14. /// <summary>
  15. /// Controller for showing activity messages to the player.
  16. /// Use the ActivityMessageEvents.Send() to send a message to this controller.
  17. /// </summary>
  18. [HideMonoScript]
  19. public class ActivityMessageController : MonoBehaviour , IUiSystemElement
  20. {
  21. [BoxGroup("Settings")] public string elementTitle = "ActivityMessages";
  22. [BoxGroup("Settings")] public Canvas canvas;
  23. [BoxGroup("Settings")] public bool startVisible = false;
  24. [BoxGroup("Settings")] public int defaultGroupIndex = 0;
  25. [BoxGroup("Settings")] public int defaultPrefabIndex = 0;
  26. [PropertySpace(4,4)]
  27. public List<ActivityMessageGroup> groups = new List<ActivityMessageGroup>();
  28. [PropertySpace(4,4), Tooltip("The GameObject prefab for the ActivityMessage.")]
  29. public List<ActivityMessagePrefabData> prefabs;
  30. [ReadOnly, PropertySpace(4,0)] public List<ActivityMessageUi> activeMessages;
  31. private bool isVisible = true;
  32. private void Start()
  33. {
  34. if(startVisible) UiManager.ShowElement(this);
  35. else UiManager.HideElement(this);
  36. }
  37. private void OnEnable()
  38. {
  39. UiManager.RegisterElement(elementTitle, this, this.transform, isVisible);
  40. ActivityMessageEvents.OnActivityMessage += NewActivityMessage;
  41. ActivityMessageEvents.OnTimedActivityMessage += NewTimedActivityMessage;
  42. ActivityMessageEvents.OnStickyActivityMessage += NewStickyActivityMessage;
  43. ActivityMessageEvents.OnFullMessage += NewFullMessage;
  44. ActivityMessageEvents.OnUpdateActivityMessage += UpdateActivityMessage;
  45. ActivityMessageEvents.OnRemoveActivityMessage += RemoveActivityMessage;
  46. }
  47. private void OnDisable()
  48. {
  49. UiManager.UnregisterElement(this);
  50. ActivityMessageEvents.OnActivityMessage -= NewActivityMessage;
  51. ActivityMessageEvents.OnTimedActivityMessage -= NewTimedActivityMessage;
  52. ActivityMessageEvents.OnStickyActivityMessage -= NewStickyActivityMessage;
  53. ActivityMessageEvents.OnFullMessage -= NewFullMessage;
  54. ActivityMessageEvents.OnUpdateActivityMessage -= UpdateActivityMessage;
  55. ActivityMessageEvents.OnRemoveActivityMessage -= RemoveActivityMessage;
  56. }
  57. public void Hide()
  58. {
  59. isVisible = false;
  60. canvas.gameObject.SetActive(false);
  61. }
  62. public void Show()
  63. {
  64. isVisible = true;
  65. canvas.gameObject.SetActive(true);
  66. }
  67. public bool IsVisible() => isVisible;
  68. private void NewActivityMessage(string msg)
  69. {
  70. ActivityMessage message = new ActivityMessage(msg);
  71. CreateMessage(message, defaultGroupIndex, defaultPrefabIndex).Setup(this, message);
  72. }
  73. private void NewTimedActivityMessage(string msg, float time)
  74. {
  75. ActivityMessage message = new ActivityMessage(msg, "", "", "", null, time, false, true, null);
  76. CreateMessage(message, defaultGroupIndex, defaultPrefabIndex).Setup(this, message);
  77. }
  78. private void NewStickyActivityMessage(string msg, bool sticky)
  79. {
  80. ActivityMessage message = new ActivityMessage(msg, "", "", "", null, 0f, true, true, null);
  81. CreateMessage(message, defaultGroupIndex, defaultPrefabIndex).Setup(this, message);
  82. }
  83. private void NewFullMessage(string text, string id, string group, string prefab, Sprite icon, float time, bool sticky, bool hideOnClick, Action action)
  84. {
  85. ActivityMessage message = new ActivityMessage(text, id, group, prefab, icon, time, sticky, hideOnClick,action);
  86. int groupIndex = GetGroupIndexByTitle(group);
  87. int prefabIndex = GetPrefabIndexByTitle(prefab);
  88. CreateMessage(message, groupIndex, prefabIndex).Setup(this, message);
  89. }
  90. private void UpdateActivityMessage(string id, string newText, Sprite newSprite, float time, bool sticky, bool hideOnClick, Action action)
  91. {
  92. for (int i = 0; i < activeMessages.Count; i++)
  93. {
  94. if(activeMessages[i].message.text == id || activeMessages[i].message.id == id)
  95. {
  96. activeMessages[i].message.text = newText;
  97. if(newSprite != null) activeMessages[i].message.icon = newSprite;
  98. activeMessages[i].message.time = time;
  99. activeMessages[i].message.sticky = sticky;
  100. activeMessages[i].message.hideOnClick = hideOnClick;
  101. if(action != null) activeMessages[i].message.action = action;
  102. activeMessages[i].Setup(this, activeMessages[i].message);
  103. return;
  104. }
  105. }
  106. }
  107. private void RemoveActivityMessage(string text)
  108. {
  109. for (int i = 0; i < activeMessages.Count; i++)
  110. {
  111. if(activeMessages[i].message.text == text || activeMessages[i].message.id == text)
  112. {
  113. activeMessages[i].Remove(this);
  114. return;
  115. }
  116. }
  117. }
  118. private ActivityMessageUi CreateMessage(ActivityMessage message, int groupIndex, int prefabIndex)
  119. {
  120. groups[groupIndex].messages.Add(message);
  121. GameObject obj = Instantiate(prefabs[prefabIndex].prefab, groups[groupIndex].container);
  122. ActivityMessageUi msgUi = obj.GetComponent<ActivityMessageUi>();
  123. activeMessages.Add(msgUi);
  124. return msgUi;
  125. }
  126. public bool GroupExits(string title)
  127. {
  128. for (int i = 0; i < groups.Count; i++)
  129. {
  130. if(groups[i].title == title) return true;
  131. }
  132. return false;
  133. }
  134. public int GetGroupIndexByTitle(string title)
  135. {
  136. for (int i = 0; i < groups.Count; i++)
  137. {
  138. if(groups[i].title == title) return i;
  139. }
  140. return defaultGroupIndex;
  141. }
  142. public bool PrefabExits(string title)
  143. {
  144. for (int i = 0; i < prefabs.Count; i++)
  145. {
  146. if(prefabs[i].title == title) return true;
  147. }
  148. return false;
  149. }
  150. public int GetPrefabIndexByTitle(string title)
  151. {
  152. for (int i = 0; i < prefabs.Count; i++)
  153. {
  154. if(prefabs[i].title == title) return i;
  155. }
  156. return defaultPrefabIndex;
  157. }
  158. }
  159. }