/* ------------------- Code Monkey ------------------- Thank you for downloading the Code Monkey Utilities I hope you find them useful in your projects If you have any questions use the contact form Cheers! unitycodemonkey.com -------------------------------------------------- */ using UnityEngine; using UnityEngine.UI; namespace CodeMonkey.Utils { /* * Displays text with icons in between the text * */ public class UI_TextComplex { private static Transform GetCanvasTransform() { return UtilsClass.GetCanvasTransform(); } public struct Icon { public Sprite sprite; public Vector2 size; public Color color; public Icon(Sprite sprite, Vector2 size, Color? color = null) { this.sprite = sprite; this.size = size; if (color == null) { this.color = Color.white; } else { this.color = (Color) color; } } } public GameObject gameObject; private Transform transform; private RectTransform rectTransform; // iconChar prepends the iconArr index; // Example using iconChar '#': // test #0 asdf // Displays "test [iconArr[0]] asdf" public UI_TextComplex(Transform parent, Vector2 anchoredPosition, int fontSize, char iconChar, string text, Icon[] iconArr, Font font) { SetupParent(parent, anchoredPosition); string tmp = text; float textPosition = 0f; while (tmp.IndexOf(iconChar) != -1) { string untilTmp = tmp.Substring(0, tmp.IndexOf(iconChar)); string iconNumber = tmp.Substring(tmp.IndexOf(iconChar)+1); int indexOfSpaceAfterIconNumber = iconNumber.IndexOf(" "); if (indexOfSpaceAfterIconNumber != -1) { // Still has more space after iconNumber iconNumber = iconNumber.Substring(0, indexOfSpaceAfterIconNumber); } else { // No more space after iconNumber } tmp = tmp.Substring(tmp.IndexOf(iconChar+iconNumber) + (iconChar+iconNumber).Length); if (untilTmp.Trim() != "") { Text uiText = UtilsClass.DrawTextUI(untilTmp, transform, new Vector2(textPosition,0), fontSize, font); textPosition += uiText.preferredWidth; } // Draw Icon int iconIndex = UtilsClass.Parse_Int(iconNumber, 0); Icon icon = iconArr[iconIndex]; UtilsClass.DrawSprite(icon.sprite, transform, new Vector2(textPosition + icon.size.x / 2f, 0), icon.size); textPosition += icon.size.x; } if (tmp.Trim() != "") { UtilsClass.DrawTextUI(tmp, transform, new Vector2(textPosition,0), fontSize, font); } } private void SetupParent(Transform parent, Vector2 anchoredPosition) { gameObject = new GameObject("UI_TextComplex", typeof(RectTransform)); transform = gameObject.transform; rectTransform = gameObject.GetComponent(); rectTransform.SetParent(parent, false); rectTransform.sizeDelta = new Vector2(0, 0); rectTransform.anchorMin = new Vector2(0, .5f); rectTransform.anchorMax = new Vector2(0, .5f); rectTransform.pivot = new Vector2(0, .5f); rectTransform.anchoredPosition = anchoredPosition; } public void SetTextColor(Color color) { foreach (Transform trans in transform) { Text text = trans.GetComponent(); if (text != null) { text.color = color; } } } public float GetTotalWidth() { float textPosition = 0f; foreach (Transform trans in transform) { Text text = trans.GetComponent(); if (text != null) { textPosition += text.preferredWidth; } Image image = trans.GetComponent(); if (image != null) { textPosition += image.GetComponent().sizeDelta.x; } } return textPosition; } public float GetTotalHeight() { foreach (Transform trans in transform) { Text text = trans.GetComponent(); if (text != null) { return text.preferredHeight; } } return 0f; } public void AddTextOutline(Color color, float size) { foreach (Transform textComplexTrans in transform) { if (textComplexTrans.GetComponent() != null) { Outline outline = textComplexTrans.gameObject.AddComponent(); outline.effectColor = color; outline.effectDistance = new Vector2(size, size); } } } public void SetAnchorMiddle() { rectTransform.anchorMin = new Vector2(.5f, .5f); rectTransform.anchorMax = new Vector2(.5f, .5f); } public void CenterOnPosition(Vector2 position) { rectTransform.anchoredPosition = position + new Vector2(-GetTotalWidth() / 2f, 0); } public void DestroySelf() { Object.Destroy(gameObject); } } }