using System.Collections; using System.Collections.Generic; using UnityEngine; using Sirenix.OdinInspector; using KairoEngine.Core; using KairoEngine.UI; namespace KairoEngine.UI.ActivityMessages { //* This is the simplest possible implementation of this controller // Todo: Add icons to activity messages // Todo: Add autohide prorperty to messages // Todo: Cleanup list of activeMessages that have been destroyed /// /// Controller for showing activity messages to the player. /// Use the ActivityMessageEvents.Send() to send a message to this controller. /// public class ActivityMessageController : MonoBehaviour , IUiSystemElement { [Tooltip("The container that will hold all the activity message GameObjects.")] [LabelText("MSG Container")] public Transform activityMessagesContainer; [Tooltip("The GameObject prefab for the ActivityMessage.")] [LabelText("MSG Prefab")] public GameObject activityMessageUiPrefab; public List messages; public List activeMessages; public Canvas canvas; public bool startVisible = false; private bool isVisible = true; private void Start() { if(startVisible) UiManager.ShowElement(this); else UiManager.HideElement(this); } private void OnEnable() { UiManager.RegisterElement("ActivityMessages", this, this.transform, isVisible); ActivityMessageEvents.OnActivityMessage += NewActivityMessage; ActivityMessageEvents.OnTimedActivityMessage += NewTimedActivityMessage; ActivityMessageEvents.OnStickyActivityMessage += NewStickyActivityMessage; ActivityMessageEvents.OnUpdateActivityMessage += UpdateActivityMessage; ActivityMessageEvents.OnRemoveActivityMessage += RemoveActivityMessage; } private void OnDisable() { UiManager.UnregisterElement(this); ActivityMessageEvents.OnActivityMessage -= NewActivityMessage; ActivityMessageEvents.OnTimedActivityMessage -= NewTimedActivityMessage; ActivityMessageEvents.OnStickyActivityMessage -= NewStickyActivityMessage; ActivityMessageEvents.OnUpdateActivityMessage -= UpdateActivityMessage; ActivityMessageEvents.OnRemoveActivityMessage -= RemoveActivityMessage; } public void Hide() { isVisible = false; canvas.gameObject.SetActive(false); } public void Show() { isVisible = true; canvas.gameObject.SetActive(true); } public bool IsVisible() => isVisible; private void NewActivityMessage(string msg) { ActivityMessage message = new ActivityMessage(msg); CreateMessage(message).Setup(this, message); } private void NewTimedActivityMessage(string msg, float time) { ActivityMessage message = new ActivityMessage(msg); CreateMessage(message).Setup(this, message, time); } private void NewStickyActivityMessage(string msg, bool sticky) { ActivityMessage message = new ActivityMessage(msg); CreateMessage(message).Setup(this, message, sticky); } private void UpdateActivityMessage(string oldText, string newText, float time, bool sticky) { for (int i = 0; i < activeMessages.Count; i++) { if(activeMessages[i].message.text == oldText) { activeMessages[i].message.text = newText; activeMessages[i].Setup(this, activeMessages[i].message, time, sticky); return; } } } private void RemoveActivityMessage(string text) { for (int i = 0; i < activeMessages.Count; i++) { if(activeMessages[i].message.text == text) { activeMessages[i].Remove(this); return; } } } private ActivityMessageUi CreateMessage(ActivityMessage message) { messages.Add(message); GameObject obj = Instantiate(activityMessageUiPrefab, activityMessagesContainer); ActivityMessageUi msgUi = obj.GetComponent(); activeMessages.Add(msgUi); return msgUi; } } }