Exemplo n.º 1
0
        /// <summary>
        /// Shows the notification considering the NotificationData value.
        /// </summary>
        public void ShowNotification(NotificationData ndata, UICanvas targetCanvas)
        {
            foreach (Transform t in transform) //in case we have a child that is not on the proper layer, we set it here so it shows up in the target camera
            {
                t.gameObject.layer = gameObject.layer;
                Canvas c = t.gameObject.GetComponent <Canvas>();
                if (c != null)
                {
                    c.sortingLayerName = targetCanvas.Canvas.sortingLayerName;
                    c.overrideSorting  = true;
                    c.sortingOrder    += 10000;
                }
                Renderer r = t.gameObject.GetComponent <Renderer>();
                if (r != null)
                {
                    r.sortingLayerName = targetCanvas.Canvas.sortingLayerName;
                    r.sortingOrder    += 10000;
                }
            }

            if (notificationContainer != null)
            {
                notificationContainer.startHidden = true;
            }
            if (overlay != null)
            {
                overlay.startHidden = true;
            }

            len = specialElements != null ? specialElements.Length : 0;
            if (len > 0)
            {
                for (int i = 0; i < len; i++)
                {
                    if (specialElements[i] == null)
                    {
                        continue;
                    }
                    specialElements[i].startHidden = true;
                }
            }

            data = ndata;                           //we save this data to use it if we need to unregister from the Notification Queue

            if (icon != null && ndata.icon != null) //if this notification has an icon slot and the show notification passed a new icon, we update it
            {
                icon.sprite = ndata.icon;
            }

            if (ndata.buttonTexts == null || ndata.buttonTexts.Length == 0)
            {
                closeOnClick = true;    //if there are no button texts we let the user close this notification just by ckicking it
            }
            if (ndata.buttonNames == null || ndata.buttonNames.Length == 0)
            {
                closeOnClick = true;                 //if there are no button names we let the user close this notification just by ckicking it
            }
            if (closeButton != null && closeOnClick) //if we linked the closeOnClickButton, we configure it to close the notification window on click
            {
                UIButton b            = closeButton.GetComponent <UIButton>();
                float    onClickDelay = 0f;
                if (b != null)                                   //we check if we have an UIButton attached (we do this so that if the button has an onClick animation, we show it and after that we hide the notification)
                {
                    onClickDelay = b.onClickPunch.TotalDuration; //this creates a more pleasent user experience (UX) by letthing the OnClick animation play before hiding the notification
                }

                closeButton.onClick.AddListener(() =>
                {
                    StartCoroutine(HideNotification(onClickDelay));
                    StartCoroutine(DestroyAfterTime(GetOutAnimationsTimeAndDelay() + onClickDelay));
                });
            }

            if (ndata.lifetime > 0)  //We look for the lifetime (if it's -1 we do not auto hide the notification. We wait for the player to hit a button.
            {
                StartCoroutine(HideNotification(GetInAnimationsTimeAndDelay() + ndata.lifetime));
                StartCoroutine(DestroyAfterTime(GetInAnimationsTimeAndDelay() + ndata.lifetime + GetOutAnimationsTimeAndDelay()));
            }

#if dUI_TextMeshPro
            if (title != null)
            {
                if (title.GetComponent <TMPro.TextMeshProUGUI>() != null)
                {
                    title.GetComponent <TMPro.TextMeshProUGUI>().text = ndata.title;
                }
                else if (title.GetComponent <Text>() != null)
                {
                    title.GetComponent <Text>().text = ndata.title;
                }
            }
            if (message != null)
            {
                if (message.GetComponent <TMPro.TextMeshProUGUI>() != null)
                {
                    message.GetComponent <TMPro.TextMeshProUGUI>().text = ndata.message;
                }
                else if (message.GetComponent <Text>() != null)
                {
                    message.GetComponent <Text>().text = ndata.message;
                }
            }
#else
            if (title != null && title.GetComponent <Text>() != null)
            {
                title.GetComponent <Text>().text = ndata.title;
            }
            if (message != null && message.GetComponent <Text>() != null)
            {
                message.GetComponent <Text>().text = ndata.message;
            }
#endif

            if (buttons != null && ndata.buttonNames != null) //If this notification prefab has buttons and buttonNames is not null (those are the buttonNames we are listening for) we start adding the buttons
            {
                for (int i = 0; i < buttons.Length; i++)
                {
                    var index = i;
                    buttons[i].GetComponent <Button>().onClick.AddListener(() =>
                    {
                        if (ndata.buttonCallback != null && index < ndata.buttonCallback.Length && ndata.buttonCallback[index] != null)
                        {
                            ndata.buttonCallback[index].Invoke();
                        }
                        StartCoroutine(HideNotification(0.2f));
                        StartCoroutine(DestroyAfterTime(GetOutAnimationsTimeAndDelay() + 0.2f));             //We destroy this notification after the Out animation finished
                    });

                    if (ndata.buttonNames.Length > i && string.IsNullOrEmpty(ndata.buttonNames[i]) == false) //If we have a buttonName we make the button active and set the buttonName to the UIButton compoenent
                    {
                        buttons[i].gameObject.SetActive(true);
                        buttons[i].buttonName = ndata.buttonNames[i]; //We set the buttonName

                        if (ndata.buttonTexts != null)                //We might not have a text for the button (it might be an image or an icon) so we check if we wanted a text on it
                        {
                            if (ndata.buttonTexts.Length > i && !string.IsNullOrEmpty(ndata.buttonTexts[i]))
                            {
#if dUI_TextMeshPro
                                if (buttons[i].GetComponentInChildren <TMPro.TextMeshProUGUI>() != null)
                                {
                                    buttons[i].GetComponentInChildren <TMPro.TextMeshProUGUI>().text = ndata.buttonTexts[i];
                                }
#else
                                if (buttons[i].GetComponentInChildren <Text>() != null)
                                {
                                    buttons[i].GetComponentInChildren <Text>().text = ndata.buttonTexts[i];
                                }
#endif
                            }
                        }
                    }
                    else
                    {
                        buttons[i].gameObject.SetActive(false); //if we still have unused buttons on this notification prefab, we hide them
                    }
                }
            }
            StartCoroutine(ShowNotification());
        }