計算字體寬度及Text組件的自適應

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;佈局

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;測試

public class ChatView : MonoBehaviour
{字體

#region RectTransform
private RectTransform ChatContent;
#endregion

#region GameObject
private GameObject LeftChatObj;
private GameObject RightChatObj;
#endregion

private void Awake()
{
    InitGetComponent();
}

private void Start()
{
    Test();
}

private void InitGetComponent()
{
    #region RectTransform
    ChatContent = transform.Find("ChatPanel/ScrollView/Viewport/ChatContent").GetComponent<RectTransform>();
    #endregion

    #region GameObject
    LeftChatObj = Resources.Load<GameObject>("Info/LeftChatInfo");
    RightChatObj = Resources.Load<GameObject>("Info/RightChatInfo");
    #endregion
}

//測試方法
private void Test()
{
    ChatInfo info1 = Instantiate(LeftChatObj, ChatContent).GetComponent<ChatInfo>();
    ChatInfo info2 = Instantiate(RightChatObj, ChatContent).GetComponent<ChatInfo>();
    //
    info1.SetChatText("椅子在異鄉,樹葉有翅膀,椅子在異鄉,樹葉有翅膀,椅子在異鄉,樹葉有翅膀");
    info2.SetChatText("斯人如彩虹,趕上方知有,斯人如彩虹,趕上方知有,斯人如彩虹,趕上方知有,斯人如彩虹,趕上方知有,斯人如彩虹,趕上方知有");
    UpdateLayout();
}

private void UpdateLayout()
{
    UITools.Instance.UpdateLayout(ChatContent);
}

}ui

public class ChatInfo : MonoBehaviour
{code

#region RectTransform
private RectTransform RtChatContentText;
private RectTransform RtBgEmpty;
private RectTransform RtContentEmpty;
private RectTransform RtSelf;
#endregion

#region Text
private Text ChatContentText;
#endregion

#region float
//字體總寬高
private float m_FontTotalWidth = 0f;
private float m_FontTotalHeight = 0f;
//Text文本的寬高
private float m_TextWidth = 0f;
private float m_TextHeight = 0f;
//Text背景圖寬高
private float m_TextBgWidth = 0f;
private float m_TextBgHeight = 0f;
#endregion


private void Awake()
{
    InitGetComponent();
}

private void Start()
{
    //SetChatText("椅子在異鄉,樹葉有翅膀。椅子在異鄉,樹葉有翅膀。椅子在異鄉,樹葉有翅膀。椅子在異鄉,樹葉有翅膀。椅子在異鄉,樹葉有翅膀。");
    //SetChatText("椅子在異鄉,樹葉有翅膀。");
}


private void InitGetComponent()
{
    #region RectTransform
    RtChatContentText = transform.Find("ContentEmpty/BgEmpty/ChatContentText").GetComponent<RectTransform>();
    RtBgEmpty = transform.Find("ContentEmpty/BgEmpty").GetComponent<RectTransform>();
    RtContentEmpty = transform.Find("ContentEmpty").GetComponent<RectTransform>();
    RtSelf = transform.GetComponent<RectTransform>();
    #endregion

    #region Text
    ChatContentText = transform.Find("ContentEmpty/BgEmpty/ChatContentText").GetComponent<Text>();
    #endregion
}


/// <summary>
/// 設置聊天內容
/// </summary>
public void SetChatText(string str)
{
    ChatContentText.text = str;
    CalculateSize();
    UpdateLayout();
}

//計算並設置文本大小
private void CalculateSize()
{
    string str = ChatContentText.text;
    TextGenerator generator = ChatContentText.cachedTextGenerator;
    TextGenerationSettings textSetting = ChatContentText.GetGenerationSettings(Vector2.zero);
    //字體的總寬高
    m_FontTotalWidth = generator.GetPreferredWidth(str, textSetting);
    m_FontTotalHeight = generator.GetPreferredHeight(str, textSetting);

    IList<UICharInfo> tempList = generator.characters;
    //計算新行,此方式可有效計算該行最後一個文字的寬度是否須要計算入下一行的寬度統計內
    float tempWidth = 0;
    int newLine = 0;
    for (int i = 0; i < tempList.Count; i++)
    {
        tempWidth += tempList[i].charWidth;
        if (tempWidth > 240f)
        {
            tempWidth = tempList[i].charWidth;
            newLine += 1;
        }
    }
    //獲取Text文本寬高
    m_TextWidth = RtChatContentText.rect.width;
    m_TextHeight = RtChatContentText.rect.height;
    //獲取Text的Bg背景圖(Text父級)寬高
    m_TextBgWidth = RtBgEmpty.rect.width;
    m_TextBgHeight = RtBgEmpty.rect.height;
    //更新文本高度
    m_TextHeight += newLine * 22f;
    RtChatContentText.sizeDelta = new Vector2(m_TextWidth, m_TextHeight);
    //更新文本Bg高度
    m_TextBgHeight += newLine * 22f;
    RtBgEmpty.sizeDelta = new Vector2(m_TextBgWidth, m_TextBgHeight);
}

//刷新佈局
private void UpdateLayout()
{
    UITools.Instance.UpdateLayout(RtContentEmpty, RtSelf);
}

}orm

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;blog

public class UITools : Singleton
{
generator

public void UpdateLayout(params RectTransform[] rects)
{
    for (int i = 0; i < rects.Length; i++)
    {
        LayoutRebuilder.ForceRebuildLayoutImmediate(rects[i]);
    }
}

}string

相關文章
相關標籤/搜索