【UGUI实战】游戏右上角CoinBar的自动调整

发表于2018-04-19
评论0 766浏览
在小游戏中经常需要在右上角显示金币数目,一般最左边是一个金币icon,中间显示金币数,最右边显示增加金币的按钮

我们创建这样一个CoinBar


位于屏幕的右上角,CoinBar上添加如下代码,并赋值

运行游戏得到:

调整金币数目会自动调整布局:

代码如下:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class AutoAdjustCoinBar : MonoBehaviour
{
    [SerializeField]
    private Text m_CoinText;
    [SerializeField]
    private RectTransform m_AddButtonRect;
    [SerializeField]
    private RectTransform m_IconRect;
    private RectTransform m_CoinTextRect;
    private string m_LastCointText = "";
    // Use this for initialization
    void Start()
    {
        //text加上ContentSizeFilter,水平竖直方向均设置为PreferredSize;
        ContentSizeFitter contentSizeFilter = m_CoinText.gameObject.AddComponent<ContentSizeFitter>();
        contentSizeFilter.horizontalFit = ContentSizeFitter.FitMode.PreferredSize;
        contentSizeFilter.verticalFit = ContentSizeFitter.FitMode.PreferredSize;
        m_CoinTextRect = m_CoinText.GetComponent<RectTransform>();
        //anchor全部统一放在父物体右边
        m_CoinTextRect.anchorMin = new Vector2(1, 0.5f);
        m_CoinTextRect.anchorMax = new Vector2(1, 0.5f);
        m_CoinTextRect.pivot = new Vector2(0.5f, 0.5f);
        m_AddButtonRect.anchorMin = new Vector2(1, 0.5f);
        m_AddButtonRect.anchorMax = new Vector2(1, 0.5f);
        m_AddButtonRect.pivot = new Vector2(0.5f, 0.5f);
        m_IconRect.anchorMin = new Vector2(1, 0.5f);
        m_IconRect.anchorMax = new Vector2(1, 0.5f);
        m_AddButtonRect.pivot = new Vector2(0.5f, 0.5f);
        //第一次应该要调整一下位置
        Adjust();
    }
    // Update is called once per frame
    void Update()
    {
        if (m_CoinText.text != m_LastCointText)
        {
            Adjust();
        }
    }
    void Adjust()
    {
        float buttonWidth = m_AddButtonRect.rect.width;
        m_AddButtonRect.anchoredPosition = new Vector2(0 - (buttonWidth / 2 + 10), 0);
        //text文字的长度
        float textWidth = GetTextWidth(m_CoinText.font, m_CoinText.fontSize, m_CoinText.fontStyle, m_CoinText.text);
        m_CoinTextRect.anchoredPosition = new Vector2(0 - (textWidth / 2 + 10 + buttonWidth + 20), 0);
        float iconWith = m_IconRect.rect.width;
        m_IconRect.anchoredPosition = new Vector2(0 - (iconWith / 2 + 10 + textWidth + 10 + buttonWidth + 20), 0);
    }
    /// <summary>
    /// 获取Text宽度
    /// </summary>
    /// <returns>The text width.</returns>
    /// <param name="font">Font.</param>
    /// <param name="fontSize">Font size.</param>
    /// <param name="style">Style.</param>
    /// <param name="text">Text.</param>
    public static float GetTextWidth(Font font, int fontSize, FontStyle style, string text)
    {
        float textWidth = 0f;
        font.RequestCharactersInTexture(text, fontSize, style);
        CharacterInfo characterInfo;
        for (int i = 0; i < text.Length; i++)
        {
            font.GetCharacterInfo(text[i], out characterInfo, fontSize);
            textWidth += characterInfo.advance;
        }
        return textWidth;
    }
}
来自:https://blog.csdn.net/rickshaozhiheng/article/details/51569489

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引