Unity_C#_中计算字体宽度及Text组件的自适应

Unity中计算字体宽度及Text组件的自适应

主界面调用

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);
	}
}

预设体【核心计算模块】

public class ChatInfo : MonoBehaviour
{

	#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);
	}
}

工具类调用

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

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

单例类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Singleton <T>: MonoBehaviour  where T : MonoBehaviour
{
    private static object m_Lock = new object();

    private static T m_Instance;
    public static T Instance
    {
        get
        {
            if (m_Instance == null)
            {
                lock (m_Lock)
                {
                    if (m_Instance == null)
                    {
                        GameObject go = new GameObject(typeof(T).ToString());
                        m_Instance = go.AddComponent<T>();
                        DontDestroyOnLoad(go);
                    }
                }
            }
            return m_Instance;
        }
    }
}

最终效果图:
工程中的效果图
End…

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值