【UGUI实战】游戏右上角CoinBar的自动调整
发表于2018-04-19
在小游戏中经常需要在右上角显示金币数目,一般最左边是一个金币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