예제 #1
0
    void OnValidate()
    {
        if (atlas == null)
        {
            return;
        }

        int length = _text.Length;

        // Calculate number of characters
        int characterCount = 0;

        for (int i = 0; i < length; i++)
        {
            if (_text[i] != ' ')
            {
                characterCount++;
            }
        }

        // Get number of children
        int childCount = transform.childCount;

        if (characterCount > childCount)
        {
            // Enable all children
            for (int i = 0; i < childCount; i++)
            {
                transform.GetChild(i).gameObject.SetActive(true);
            }

            // Add new children
            for (int i = characterCount - childCount; i > 0; i--)
            {
                GameObject character = new GameObject((characterCount - i + 1).ToString());
                character.transform.SetParent(transform);
                character.transform.localScale    = Vector3.one;
                character.transform.localPosition = Vector3.zero;

                character.AddRectTransform();

                Image image = character.AddComponent <Image>();
                image.color         = _color;
                image.raycastTarget = false;
            }
        }
        else
        {
            for (int i = 0; i < characterCount; i++)
            {
                transform.GetChild(i).gameObject.SetActive(true);
            }

            for (int i = characterCount; i < childCount; i++)
            {
                transform.GetChild(i).gameObject.SetActive(false);
            }
        }

        // Check if empty
        if (length == 0)
        {
            gameObject.GetComponent <RectTransform>().sizeDelta = Vector2.zero;
            return;
        }

        int index = 0;

        float   width  = 0;
        float   height = 0;
        Vector2 size;

        // Set sprite
        for (int i = 0; i < length; i++)
        {
            char c = _text[i];

            if (c != ' ')
            {
                Transform child = transform.GetChild(index++);

                Image image = child.GetComponent <Image>();
                image.sprite = atlas.Get(c);
                image.SetNativeSize();

                size = child.GetComponent <RectTransform>().sizeDelta;

                width += size.x + _gap;

                if (size.y > height)
                {
                    height = size.y;
                }
            }
            else
            {
                width += spaceWidth - _gap;
            }
        }

        if (_text[length - 1] != ' ')
        {
            width -= _gap;
        }

        // Set size
        gameObject.GetComponent <RectTransform>().sizeDelta = new Vector2(width, height);

        // Get bottom-left position
        Vector2 position = _anchor.GetAnchoredPosition(width, height, _offsetX, _offsetY);

        RectTransform rectTransform;
        float         leftExtent;
        float         bottomExtent;

        index = 0;

        // Set position
        for (int i = 0; i < length; i++)
        {
            if (_text[i] != ' ')
            {
                Transform child = transform.GetChild(index++);

                rectTransform = child.GetComponent <RectTransform>();
                size          = rectTransform.sizeDelta;

                leftExtent   = size.x * 0.5f;
                bottomExtent = size.y * 0.5f;

                position.x += leftExtent;
                position.y += bottomExtent;

                rectTransform.anchoredPosition = position;

                position.x += size.x - leftExtent + _gap;
                position.y -= bottomExtent;
            }
            else
            {
                position.x += spaceWidth - _gap;
            }
        }
    }