Unity中Content Size Fitter生效后获取TextMeshPro正确文本高度
解决TextMeshPro+Content Size Fitter修改文本后无法获取正确高度的问题
核心问题定位
你代码里的致命错误是:Instantiate(dialogItemText, contentScroll); 之后没有保存新生成的实例引用,反而继续操作原始预制体dialogItemText的组件。预制体的文本和布局不会因为实例化后的操作改变,所以你拿到的都是预制体的旧高度值。
修正后的代码实现
void CreateDialogItem() { // 保存实例化后的对象引用,这是关键! GameObject newDialogItem = Instantiate(dialogItemText, contentScroll); TextMeshProUGUI dialogItemTextTMP = newDialogItem.GetComponent<TextMeshProUGUI>(); RectTransform dialogItemTextRectTransform = newDialogItem.GetComponent<RectTransform>(); // 设置新文本 dialogItemTextTMP.text = GetLineAtIndex(currentLineIndex); // 正确的布局刷新顺序 // 1. 强制更新TextMeshPro的网格和布局计算 dialogItemTextTMP.ForceMeshUpdate(true); // 2. 触发Content Size Fitter重新计算布局 LayoutRebuilder.ForceRebuildLayoutImmediate(dialogItemTextRectTransform); // 3. 强制更新所有Canvas布局 Canvas.ForceUpdateCanvases(); // 现在可以正确获取高度 Debug.Log("LayoutUtility GetPreferredHeight: " + LayoutUtility.GetPreferredHeight(dialogItemTextRectTransform)); Debug.Log("TextMeshProUGUI preferredHeight: " + dialogItemTextTMP.preferredHeight); Debug.Log("RectTransform height: " + dialogItemTextRectTransform.rect.height); Debug.Log("RectTransform.sizeDelta: " + dialogItemTextRectTransform.sizeDelta.y); }
额外注意事项
- 确保
contentScroll是带有ScrollRect组件的父物体,且其布局组(如Vertical Layout Group)的设置正确,不会覆盖子物体的尺寸。 - 如果你的TextMeshPro有固定宽度限制,要确保宽度在实例化后是正确的(比如父布局组设置了宽度约束),否则高度计算会因为宽度变化出错。
- 避免在同一帧内多次调用布局刷新方法,按顺序调用一次即可。
内容的提问来源于stack exchange,提问作者KOSOY
相关产品推荐
相关产品推荐

