Ejemplo n.º 1
0
        /// <summary>
        /// Close Message
        /// </summary>
        /// <param name="message"></param>
        public void CloseMessage(Message message = null, string buttonText = null)
        {
            if (message == null)
            {
                return;
            }

            //remove from the current list (if it s still in it)
            RemoveMessageFromCurrentList(message);

            //if no messagepanel, impossible already removed
            if (message.MessagePanel == null)
            {
                return;
            }



            //tell it's finish when the transiiton is finish
            DOVirtual.DelayedCall(message.MessagePanel.TransitionTime, () => DisappearFinish(message));

            //remove all listener on button
            message.MessagePanel.GetComponent <CanvasGroup>().interactable = false;

            if (message.AllButtonsObject != null)
            {
                message.AllButtonsObject.ForEach(p => p.onClick.RemoveAllListeners());
            }

            switch (message.MessagePanel.MessageStyle.Type)
            {
            case MessageType.Popup:

                //removing listener (not sure useful in unity)
                if (message.MessagePanel.CloseButton && message.ShowClose)
                {
                    message.MessagePanel.CloseButton.onClick.RemoveAllListeners();
                }


                //remove blur if no more message
                if (currentMessages.Where(p => p.MessagePanel != null && p.MessagePanel.MessageStyle != null && (p.MessagePanel.MessageStyle.Type == MessageType.Popup || p.BlurCamera)).ToList().Count == 0)
                {
                    BlurCamera(false, message.MessagePanel.TransitionTime);
                }


                //invoke close
                OnMessageClose.Invoke(message, buttonText);

                IsPaused = false;
                ResumeTicker();



                //ok removing the animation make it work
                if (message.MessagePanel.GetComponent <Animator>() != null)
                {
                    Destroy(message.MessagePanel.GetComponent <Animator>());
                }

                //destroy with a fade
                message.MessagePanel.GetComponent <CanvasGroup>().DOFade(0f, message.MessagePanel.TransitionTime).OnComplete(() => DestroyMessage(message)).SetUpdate(true);

                //fade 3d object too
                Shaders.ShaderUtils.FadeObject(message.MessagePanel, 0f, message.MessagePanel.TransitionTime);

                MessageLayer useLayer = AllLayers.Where(p => p.Name == message.LayerName).Single();

                //remove back
                DOTween.Kill(useLayer.Back, true);
                useLayer.Back.DOFade(0f, message.MessagePanel.TransitionTime).OnComplete(() => useLayer.Back.gameObject.SetActive(false)).SetUpdate(true);

                if (message.IconGameObject != null)
                {
                    GameObject.Destroy(message.IconGameObject);
                }

                break;



            case MessageType.Ticker:

                //ticker removed
                OnTickerClose.Invoke(message.MessagePanel, message);

                //already removed from array because of animation


                Destroy(message.MessagePanel.gameObject);
                Destroy(message.MessagePanel);


                break;

            case MessageType.Tooltip:

                Message duplicate = message;

                message.MessagePanel.GetComponent <RectTransform>().DOKill();
                message.MessagePanel.GetComponent <CanvasGroup>().DOKill();

                message.MessagePanel.GetComponent <RectTransform>().DOAnchorPos(message.MessagePanel.MessageStyle.StartPos, message.MessagePanel.TransitionTime).OnComplete(() => DestroyMessage(duplicate));
                message.MessagePanel.GetComponent <CanvasGroup>().DOFade(0f, message.MessagePanel.TransitionTime).SetUpdate(true);

                //Destroy(message.MessagePanel.gameObject);
                //Destroy(message.MessagePanel);

                //not perfect but hey....
                OnTooltipClose.Invoke(message, "");


                break;
            }


            CheckCamera();
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Show message without passing by the queue
        /// </summary>
        public void ShowMessage(Message message)
        {
            //get the default Panel prefabs
            MessagePanel defaultPanelForStyle = Styles.Where(p => p.MessageStyle.StyleName == message.StyleName).Single();


            //check if max message, we return
            if (currentMessages.Where(p => p.MessagePanel.MessageStyle.GroupName == defaultPanelForStyle.MessageStyle.GroupName).Count() >= defaultPanelForStyle.MessageStyle.MaxPanel && !message.ImmediateDispatch)
            {
                return;
            }

            //put in currentMessage
            waitingMessages.Remove(message);
            currentMessages.Add(message);

            if (!defaultPanelForStyle)
            {
                Debug.Log("Impossible to find style of the message in MessageManager");
                return;
            }

            //if mesage got  panel, we kill everything on it (for tooltips)
            if (message.MessagePanel)
            {
                if (message.MessagePanel.GetComponent <RectTransform>() != null)
                {
                    message.MessagePanel.GetComponent <RectTransform>().DOKill(true);
                }
            }

            //if message with same contnet is currently getting destroyed (esc fast) we need to kill it faster)
            Message disaparingMessageWithSameContent = disappearMessages.Where(p => p.MessageContent != null && p.MessageContent == message.MessageContent).LastOrDefault();

            if (disaparingMessageWithSameContent != null)
            {
                disaparingMessageWithSameContent.MessagePanel.GetComponent <CanvasGroup>().DOKill(true);
            }


            //create panel gameobject
            GameObject   messageGameObject    = (GameObject)Instantiate(defaultPanelForStyle.gameObject);
            MessagePanel messagePanelForStyle = messageGameObject.GetComponent <MessagePanel>();

            message.MessagePanel = messagePanelForStyle;

            messageGameObject.SetActive(true);


            //kill tween on complete
            MessagecameraTween.Kill(false);
            MessagecameraTween = null;

            //maybe different animaiton ?

            //animate alpha
            //if no canvas group, add it
            CanvasGroup canvasGroup = messagePanelForStyle.GetComponent <CanvasGroup>();

            if (canvasGroup == null)
            {
                canvasGroup = messagePanelForStyle.gameObject.AddComponent <CanvasGroup>();
            }
            canvasGroup.interactable = true;
            canvasGroup.alpha        = 0f;

            canvasGroup.DOKill();
            canvasGroup.DOFade(1f, messagePanelForStyle.TransitionTime).SetUpdate(true);

            //keep when it appeared
            message.AppearTime = DateTime.Now;



            //get next available order for style
            List <Message> allMessageSameType = currentMessages.Where(p => p.MessagePanel.MessageStyle.GroupName == message.MessagePanel.MessageStyle.GroupName).ToList();

            //get first available order
            int messageOrder = 0;

            while (allMessageSameType.Where(p => p.Order == messageOrder).Count() != 0)
            {
                messageOrder++;
            }
            message.Order = messageOrder;

            //get layer
            MessageLayer useLayer = AllLayers.Where(p => p.Name == message.LayerName).SingleOrDefault();

            //adding it to correct parent
            //set popup on the canvas of MessageManager
            if (defaultPanelForStyle.MessageStyle.ParentCanvas != null)
            {
                if (defaultPanelForStyle.MessageStyle.ParentRectTransform != null)
                {
                    messageGameObject.transform.SetParent(defaultPanelForStyle.MessageStyle.ParentRectTransform, false);
                }
                else
                {
                    messageGameObject.transform.SetParent(defaultPanelForStyle.MessageStyle.ParentCanvas.transform, false);
                }
            }
            else
            {
                messageGameObject.transform.SetParent(useLayer.Layer.transform, false);
            }


            //test
            if (useLayer != null)
            {
                //PROBLEM WITH THAT
                if (useLayer.OverwriteCanvas)
                {
                    messagePanelForStyle.gameObject.AddComponent <GraphicRaycaster>();

                    if (messagePanelForStyle.gameObject.GetComponent <Canvas>() == null)
                    {
                        messagePanelForStyle.gameObject.AddComponent <Canvas>();
                    }


                    Canvas newCanvas = messagePanelForStyle.gameObject.GetComponent <Canvas>();
                    newCanvas.overrideSorting          = true;
                    newCanvas.additionalShaderChannels = AdditionalCanvasShaderChannels.Normal | AdditionalCanvasShaderChannels.Tangent | AdditionalCanvasShaderChannels.TexCoord1;
                    newCanvas.sortingLayerName         = useLayer.OverwriteCanvasSortingLayer;

                    newCanvas.sortingOrder = 1;
                }
            }

            //testing out better fill
            //set information
            if (messagePanelForStyle.Title != null)
            {
                if (message.Description != null && message.Title.StartsWith("%") && message.Title.EndsWith("%"))
                {
                    message.Title = ResourceManager.GetValue(message.Title.Substring(1, message.Title.Length - 2));
                    message.Title = message.Title.Replace(@"\n", Environment.NewLine);
                }

                if (message.Title == "")
                {
                    messagePanelForStyle.Title.gameObject.SetActive(false);
                }
                else
                {
                    messagePanelForStyle.Title.gameObject.SetActive(true);
                    messagePanelForStyle.Title.text = message.Title;
                }
            }

            //description
            if (messagePanelForStyle.Description != null)
            {
                if (message.Description != null && message.Description.StartsWith("%") && message.Description.EndsWith("%"))
                {
                    message.Description = ResourceManager.GetValue(message.Description.Substring(1, message.Description.Length - 2));
                    message.Description = message.Description.Replace(@"\n", Environment.NewLine);
                }

                if (message.Description == null || message.Description == "")
                {
                    messagePanelForStyle.Description.gameObject.SetActive(false);
                }
                else
                {
                    messagePanelForStyle.Description.gameObject.SetActive(true);
                    messagePanelForStyle.Description.text = message.Description;
                }
            }


            //add all button////////////////////////////
            if (message.AllButtons.Count > 0)
            {
                for (int i = 0; i < message.AllButtons.Count; i++)
                {
                    Button myButton;

                    if (message.AllButtonsPrefabs.Count > i && message.AllButtonsPrefabs[i] != null)
                    {
                        myButton = message.AllButtonsPrefabs[i].GetComponent <Button>();
                        message.AllButtonsPrefabs[i].SetActive(true);
                        myButton.transform.SetParent(messagePanelForStyle.Button.transform.parent, false);

                        //if hide original button if it s the first button
                        if (i == 0)
                        {
                            messagePanelForStyle.Button.gameObject.SetActive(false);
                        }
                    }
                    else if (i == 0)
                    {
                        myButton = messagePanelForStyle.Button;
                    }
                    else
                    {
                        myButton = (Button)Instantiate(messagePanelForStyle.Button, new Vector3(0, 0, 0), new Quaternion(0, 0, 0, 0));
                        myButton.transform.SetParent(messagePanelForStyle.Button.transform.parent, false);
                    }

                    //set text on button
                    myButton.GetComponentInChildren <TextMeshProUGUI>().text = message.AllButtons[i].ToUpper();

                    //set
                    myButton.onClick.AddListener(() => MessageButtonClicked(message, myButton.GetComponentInChildren <TextMeshProUGUI>().text));

                    message.AllButtonsObject.Add(myButton);
                }
            }
            else
            {
                if (messagePanelForStyle.Button)
                {
                    messagePanelForStyle.Button.transform.parent.gameObject.SetActive(false);
                }
                //Destroy(messagePanelForStyle.Button.transform.parent.gameObject);
            }
            //////////////////////////////////////////////



            switch (defaultPanelForStyle.MessageStyle.Type)
            {
            case MessageType.Popup:

                //show back
                DOTween.Kill(useLayer.Back, true);
                useLayer.Back.gameObject.SetActive(true);
                useLayer.Back.DOFade(useLayer.BackAlpha, messagePanelForStyle.TransitionTime).SetUpdate(true);

                //resize innerBack if no button
                if (message.AllButtons.Count == 0)
                {
                    //TODO : check if needed
                    //messagePanelForStyle.InnerBack.offsetMin = new Vector2(messagePanelForStyle.InnerBack.offsetMin.x, messagePanelForStyle.InnerBack.offsetMin.x);
                }

                //check if there is a inner message object
                SetContentInMessage(message, messagePanelForStyle);



                //problem with textureatlas here
                if (messagePanelForStyle.Icon && message.Icon)
                {
                    messagePanelForStyle.Icon.sprite = message.Icon;
                }
                else
                {
                    if (messagePanelForStyle.Icon)
                    {
                        GameObject.Destroy(messagePanelForStyle.Icon);
                    }

                    //hide image if no icon
                    messagePanelForStyle.HideIfNoIcon.ToList().ForEach(p => p.enabled = false);
                }

                if (message.IconGameObject != null)
                {
                    //message.IconGameObject = GameObject.Instantiate(message.IconGameObject);
                    message.IconGameObject.transform.SetParent(messagePanelForStyle.Icon.transform.parent, false);
                    //message.IconGameObject.transform.SetParent(messagePanelForStyle.Icon.transform.parent);
                }



                BlurCamera(true);

                //add close behaviour if there is a close button (auto-close)
                if (messagePanelForStyle.CloseButton && message.ShowClose)
                {
                    messagePanelForStyle.CloseButton.onClick.AddListener(() => MessageButtonClicked(message, ""));
                }
                else if (messagePanelForStyle.CloseButton && !message.ShowClose)
                {
                    messagePanelForStyle.CloseButton.gameObject.SetActive(false);
                }

                //invoke open of the message
                OnMessageOpen.Invoke(message, null);

                //pause
                IsPaused = true;

                //we stop ticker
                StopTicker();

                break;



            case MessageType.Ticker:


                //problem with textureatlas here
                if (messagePanelForStyle.Icon && message.Icon)
                {
                    messagePanelForStyle.Icon.sprite = message.Icon;
                }
                else
                {
                    //maybe remove icon auto??
                    messagePanelForStyle.Icon.DOFade(0, 0).SetUpdate(true);
                }

                //animate it
                // DOVirtual.DelayedCall(0.1f, () => AnimateTicker(message));
                AnimateTicker(message, messagePanelForStyle);

                //invoke
                OnTickerOpen.Invoke(messagePanelForStyle, message);

                //invoke onOpen too
                message.MessagePanel.OnOpen.Invoke(message.MessagePanel, message);

                break;


            case MessageType.Tooltip:

                Debug.Log("APPEAR TOOLTIP " + message.StyleName);

                //be sure to kill everything on the tooltip
                message.MessagePanel.GetComponent <RectTransform>().DOKill();

                //show the tooltip at correct position

                //((MessageTooltip)message).MessagePanel.gameObject.SetActive(false);

                SetContentInMessage(message, messagePanelForStyle);

                ((MessageTooltip)message).Place(MessageCamera);

                // DOVirtual.DelayedCall(0.25f, () => ((MessageTooltip)message).Place(MessageCamera));


                break;
            }


            message.MessageAppear.Invoke(message, string.Empty);



            CheckCamera();
        }