/// <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(); }
/// <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(); }