private void RefreshSize(Message message, MessagePanel messagePanelForStyle) { if (message == null || message.MessageContent == null) { return; } if (disappearMessages.IndexOf(message, 0) != -1) { return; } RectTransform messageContentRect = message.MessageContent.GetComponent <RectTransform>(); //we need to add a layoutelement the size of the panel LayoutElement messageContentLayout = message.MessageContent.GetComponent <LayoutElement>(); if (messageContentLayout == null) { messageContentLayout = message.MessageContent.AddComponent <LayoutElement>(); } messageContentLayout.preferredWidth = messageContentRect.rect.width; messageContentLayout.preferredHeight = messageContentRect.rect.height; //force real size height on the innerback (because of scale) if (messagePanelForStyle.InnerBack != null && messagePanelForStyle.InnerBack.GetComponent <LayoutElement>() != null && messagePanelForStyle.InnerBack.GetComponent <LayoutElement>().enabled) { messagePanelForStyle.InnerBack.GetComponent <LayoutElement>().preferredWidth = message.MessageContent.GetComponent <RectTransform>().rect.width *messagePanelForStyle.InnerBack.localScale.x; messagePanelForStyle.InnerBack.GetComponent <LayoutElement>().preferredHeight = message.MessageContent.GetComponent <RectTransform>().rect.height *messagePanelForStyle.InnerBack.localScale.y; } }
private void DestroyMessage(Message message) { // Debug.Log("DESTROYING MESSAGE " + message.StyleName); if (!message.DontDestroyContentOnDismiss) { Destroy(message.MessagePanel); Destroy(message.MessagePanel.gameObject); } else { if (message.MessageContent) { message.MessageContent.transform.SetParent(null, false); //NEW CODE TO FIX RESIZING//////////////////////////////// MessagePanel messagePanelForStyle = message.MessagePanel; //set back correct size if (messagePanelForStyle.InnerBack != null && messagePanelForStyle.InnerBack.GetComponent <LayoutElement>() != null && messagePanelForStyle.InnerBack.GetComponent <LayoutElement>().enabled) { message.MessageContent.GetComponent <RectTransform>().sizeDelta = new Vector2(message.MessageContent.GetComponent <LayoutElement>().preferredWidth, message.MessageContent.GetComponent <LayoutElement>().preferredHeight); } ////////////////////////////////////////////////////////// } // DOVirtual.DelayedCall(1f, () => Destroy(message.MessagePanel.gameObject)); Destroy(message.MessagePanel.gameObject); } OnMessageDestroyed.Invoke(message, null); }
/// <summary> /// Animate the ticker /// </summary> /// <param name="ticker"></param> private void AnimateTicker(Message ticker, MessagePanel messagePanel) { RectTransform tickerRect = ticker.MessagePanel.GetComponent <RectTransform>(); ticker.MessagePanel.MessageStyle.StartPos = tickerRect.anchoredPosition; ticker.MessagePanel.MessageStyle.EndPos = tickerRect.anchoredPosition; //get all same style ticker by group List <Message> allTickerSameStyle = currentMessages.Where(p => p.MessagePanel.MessageStyle.GroupName == messagePanel.MessageStyle.GroupName).ToList(); //get all order under to add ;) Vector2 addSize = new Vector2(0, 0); for (int i = 0; i < ticker.Order; i++) { Message checkTicker = allTickerSameStyle.Where(p => p.Order == i).LastOrDefault(); addSize.x += checkTicker.MessagePanel.GetComponent <RectTransform>().sizeDelta.x; addSize.y += checkTicker.MessagePanel.GetComponent <RectTransform>().sizeDelta.y + checkTicker.MessagePanel.MessageStyle.PaddingHeightBetweenTicker; } //adding to the endpos the width of each other if (ticker.MessagePanel.MessageStyle.MessageAlign == MessageLayout.Vertical) { ticker.MessagePanel.MessageStyle.EndPos.y -= addSize.y; ticker.MessagePanel.MessageStyle.StartPos.y -= addSize.y; } else { ticker.MessagePanel.MessageStyle.EndPos.x += addSize.x; } //x start switch (ticker.MessagePanel.MessageStyle.StartHorizontal) { case MessageHoriziontalLayout.Left: // ticker.MessagePanel.MessageStyle.StartPos.x = -ticker.MessagePanel.GetComponent<RectTransform>().sizeDelta.x; break; case MessageHoriziontalLayout.Center: ticker.MessagePanel.MessageStyle.StartPos.y = ticker.MessagePanel.MessageStyle.EndPos.y + ticker.MessagePanel.AddToStartPosition.y; break; case MessageHoriziontalLayout.Right: ticker.MessagePanel.MessageStyle.StartPos.x = ticker.MessagePanel.GetComponent <RectTransform>().sizeDelta.x + ticker.MessagePanel.AddToStartPosition.x; ticker.MessagePanel.MessageStyle.StartPos.y = ticker.MessagePanel.MessageStyle.EndPos.y + ticker.MessagePanel.AddToStartPosition.y; break; } //set start position tickerRect.anchoredPosition = ticker.MessagePanel.MessageStyle.StartPos; //do the motion, and oncomplete we wait tickerRect.DOAnchorPos(ticker.MessagePanel.MessageStyle.EndPos, ticker.MessagePanel.TransitionTime).OnComplete(() => WaitMessage(ticker)).SetId(ticker.TweenId); }
private void SetContentInMessage(Message message, MessagePanel messagePanelForStyle) { if (message.MessageContent) { RectTransform messageContentRect = message.MessageContent.GetComponent <RectTransform>(); //we need to add a layoutelement the size of the panel LayoutElement messageContentLayout = message.MessageContent.GetComponent <LayoutElement>(); if (messageContentLayout == null) { messageContentLayout = message.MessageContent.AddComponent <LayoutElement>(); } messageContentLayout.preferredWidth = messageContentRect.rect.width; messageContentLayout.preferredHeight = messageContentRect.rect.height; //resize to fit if (message.MessageContentResizeToFit) { Vector2 messageSize = new Vector2(message.MessageContent.GetComponent <RectTransform>().rect.width, message.MessageContent.GetComponent <RectTransform>().rect.height); Vector2 contentSize = new Vector2(messagePanelForStyle.InnerBack.rect.width, messagePanelForStyle.InnerBack.rect.height); RectTransform test = messagePanelForStyle.InnerBack; //correct scale factor float goodScale = Math.Min(contentSize.x / messageSize.x, contentSize.y / messageSize.y); message.MessageContent.GetComponent <RectTransform>().localScale = new Vector3(goodScale, goodScale, 1); } else { message.MessageContent.GetComponent <RectTransform>().localScale = new Vector3(1, 1, 1); } //set parent message.MessageContent.transform.SetParent(messagePanelForStyle.InnerBack.transform, false); //activate it message.MessageContent.SetActive(true); //force real size height on the innerback (because of scale) if (messagePanelForStyle.InnerBack != null && messagePanelForStyle.InnerBack.GetComponent <LayoutElement>() != null && messagePanelForStyle.InnerBack.GetComponent <LayoutElement>().enabled) { messagePanelForStyle.InnerBack.GetComponent <LayoutElement>().preferredWidth = message.MessageContent.GetComponent <RectTransform>().rect.width *messagePanelForStyle.InnerBack.localScale.x; messagePanelForStyle.InnerBack.GetComponent <LayoutElement>().preferredHeight = message.MessageContent.GetComponent <RectTransform>().rect.height *messagePanelForStyle.InnerBack.localScale.y; } //stupid refresh List <LayoutGroup> keepList = new List <LayoutGroup>(); //maybe force a refresh ? List <LayoutGroup> allLayout = messagePanelForStyle.InnerBack.transform.parent.GetComponentsInChildren <LayoutGroup>().ToList(); foreach (LayoutGroup layout in allLayout) { if (layout.enabled) { layout.enabled = false; keepList.Add(layout); } } //refresh layout ? messagePanelForStyle.InnerBack.transform.parent.gameObject.SetActive(false); messagePanelForStyle.InnerBack.transform.parent.gameObject.SetActive(true); messagePanelForStyle.InnerBack.transform.parent.GetComponentsInChildren <LayoutGroup>().ToList().ForEach(p => { if (p.enabled) { p.enabled = false; p.enabled = true; } ; }); keepList.ForEach(p => p.enabled = true); //weird test //message.MessagePanel.GetComponentsInChildren<LayoutGroup>().ToList().ForEach(p => { if (p.enabled) { p.enabled = false; p.enabled = true; }; }); //resize after a certain time because unity is stupid DOVirtual.DelayedCall(0.01f, () => RefreshSize(message, messagePanelForStyle)); } }
/// <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(); }
/// <summary> /// Add message style manually /// </summary> /// <param name="style"></param> public void AddStyles(MessagePanel style) { Styles.Add(style); }