总体思路就是,得到文本框内单个文字宽高,然后根据文本框的宽度算出一行应该有多少文字,然后根据文本框内总的文本数量除以一行文字数量得到行数,最后通过行数加行间距乘以单个文字高度在设置给文本框就可以了!!!代码附上,自己研究。
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class AdaptScripts : MonoBehaviour { private RectTransform m_DialogueBase; //文本框父物体RectTransform private RectTransform m_DialogueText; // 文本框RectTransform private Text m_Text; //文本框 private TextGenerator m_TextGenerator; //用于生成渲染的文本 private TextGenerationSettings m_TextGenerationSettings; //用于存储TextGenerator的设置 private void Start() { #region 获取组件 m_DialogueBase = transform.GetComponent<RectTransform>(); m_DialogueText = transform.Find("Text").GetComponent<RectTransform>(); m_Text = m_DialogueText.GetComponent<Text>(); m_TextGenerator = m_Text.cachedTextGeneratorForLayout; m_TextGenerationSettings = m_Text.GetGenerationSettings(Vector2.zero); #endregion try { // 获取Text中第一个文字 有可能为空 就是什么都没有 string str = m_Text.text; string s = str[0].ToString(); //获取单个文字高度 float fountHeight = m_TextGenerator.GetPreferredHeight(s.ToString(), m_TextGenerationSettings); //获取单个文字宽度 float fountWidth = m_TextGenerator.GetPreferredWidth(s.ToString(), m_TextGenerationSettings); //每行可以放多少个字 float lineNumber = (m_DialogueText.rect.width / fountWidth) - 1; //总文字数量 / 每行最多放的文字 算出文字行数 加1是为了让他尽量大于文本内容 不加也是没事 自己看效果 float rowNumber = (m_Text.text.Length / lineNumber) + 1; //宽度没啥说的 float width = m_DialogueText.rect.width; //高度就是 行 * (每个文字高度+行间距) float height = rowNumber * (fountHeight + 1.5f); //最终结果 m_DialogueBase.sizeDelta = new Vector2(width, height); m_DialogueText.sizeDelta = new Vector2(width, height); } catch(Exception e) { Debug.Log(e); } } }
