如何让Vertical Layout Group中各TextMesh Pro文本对象均匀缩放并同字号?
嘿,我来帮你搞定这个TMP自动字号统一的问题!结合你用的Unity 5.6.5f1和TMP 1.0.56.0b3版本,下面是几个实用的解决方案:
方案1:运行时同步统一字号
因为每个TMP文本的Auto-Sizing是独立计算的,我们可以先让所有文本完成自动缩放计算,再统一锁定到同一个字号。具体操作如下:
- 给Vertical Layout Group的父物体添加一个管理脚本,代码示例如下:
using UnityEngine; using UnityEngine.UI; using TMPro; public class SyncTMPUniformSize : MonoBehaviour { void Start() { // 强制刷新布局,确保Auto-Sizing完成字号计算 LayoutRebuilder.ForceRebuildLayoutImmediate(GetComponent<RectTransform>()); // 延迟一小段时间执行,避免布局还没完全更新 Invoke(nameof(ApplyUniformFontSize), 0.1f); } void ApplyUniformFontSize() { TextMeshProUGUI[] allTmpTexts = GetComponentsInChildren<TextMeshProUGUI>(); float targetFontSize = 0; // 先找出所有文本中自动计算出的最大字号(也可以选最小的,根据需求调整) foreach (var tmpText in allTmpTexts) { if (tmpText.fontSize > targetFontSize) { targetFontSize = tmpText.fontSize; } } // 统一设置字号并关闭自动缩放 foreach (var tmpText in allTmpTexts) { tmpText.enableAutoSizing = false; tmpText.fontSize = targetFontSize; } } }
- 把这个脚本挂在Vertical Layout Group所在的GameObject上,运行后就能自动把所有文本的字号统一成最大的那个自动计算值。
方案2:优化布局约束减少字号差异
如果不想用脚本,可以先优化布局设置,尽量让Auto-Sizing的计算基准一致:
- 给Vertical Layout Group勾选
Child Force Expand > Width,确保所有子文本的宽度完全相同,这样Auto-Sizing的缩放边界一致,字号更大概率统一 - 创建一个TMP文本预设,统一设置好最大/最小字号范围、字体、行高参数,所有动态生成的文本都从这个预设实例化,避免参数不一致导致的字号差异
方案3:进阶自定义Auto-Sizing逻辑(不推荐新手)
如果你想保留Auto-Sizing的同时强制统一字号,需要修改TMP的布局计算逻辑,但在你用的旧版本里,这个操作比较繁琐,需要修改TMP源码或者写扩展方法。除非有特殊需求,否则前两个方案足够解决问题。
另外注意:在Unity 5.6.x版本中,如果延迟执行的时间不够导致布局没刷新完成,可以把Invoke换成协程等待一帧,或者在Update里只执行一次字号同步操作。
内容的提问来源于stack exchange,提问作者user9474008
相关产品推荐
相关产品推荐

