You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 22:13:18