// ---------[ UI FUNCTIONALITY ]---------
        public static void QueueMessage(MessageDisplayData.Type messageType,
                                        string messageContent,
                                        float displayDuration = 0f)
        {
            Debug.Assert(!System.String.IsNullOrEmpty(messageContent));

            // early out
            if (instance == null)
            {
                return;
            }

            // check for default duration
            if (displayDuration <= 0f)
            {
                displayDuration = (instance.defaultBaseTime
                                   + messageContent.Length * instance.defaultCharacterTime);
            }

            // queue message
            MessageDisplayData newMessage = new MessageDisplayData()
            {
                type            = messageType,
                content         = messageContent,
                displayDuration = displayDuration,
            };

            instance.queuedMessages.Add(newMessage);

            if (Application.isPlaying &&
                instance.isActiveAndEnabled &&
                instance.m_displayRoutine == null)
            {
                instance.m_displayRoutine = instance.StartCoroutine(instance.DisplayNextMessageRoutine());
            }
        }
        private System.Collections.IEnumerator DisplayNextMessageRoutine()
        {
            MessageDisplayData     message       = queuedMessages[0];
            MessageDisplay         dialog        = m_typeDialogMap[message.type];
            ToastAnimationSettings anim          = dialog.GetComponent <ToastAnimationSettings>();
            RectTransform          rectTransform = dialog.GetComponent <RectTransform>();
            Vector2 origin = rectTransform.anchoredPosition;

            if (dialog != null)
            {
                dialog.content.text = message.content;
                dialog.gameObject.SetActive(true);

                if (anim != null)
                {
                    float animTimer = 0f;

                    while (animTimer < anim.duration)
                    {
                        rectTransform.anchoredPosition = Vector2.Lerp(origin + anim.offset,
                                                                      origin,
                                                                      animTimer / anim.duration);

                        yield return(null);

                        animTimer += Time.unscaledDeltaTime;
                    }

                    rectTransform.anchoredPosition = origin;
                }

                float displayTimer = 0f;
                m_cancelCurrentMessage = false;
                while (displayTimer < message.displayDuration &&
                       !m_cancelCurrentMessage)
                {
                    yield return(null);

                    displayTimer += Time.unscaledDeltaTime;
                }

                if (anim != null)
                {
                    float animTimer = 0f;

                    while (animTimer < anim.duration)
                    {
                        rectTransform.anchoredPosition = Vector2.Lerp(origin,
                                                                      origin + anim.offset,
                                                                      animTimer / anim.duration);

                        yield return(null);

                        animTimer += Time.unscaledDeltaTime;
                    }

                    rectTransform.anchoredPosition = origin;
                }

                dialog.gameObject.SetActive(false);
            }

            queuedMessages.Remove(message);
            m_displayRoutine = null;

            if (Application.isPlaying &&
                this != null &&
                this.isActiveAndEnabled &&
                queuedMessages.Count > 0)
            {
                m_displayRoutine = StartCoroutine(DisplayNextMessageRoutine());
            }
        }