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

Unity 5.6.5f1中如何实现TextMesh Pro UI文本环绕UI Image?

TextMesh Pro UI文本环绕固定UI Image的实现方案

针对你在Unity 5.6.5f1 Personal + TextMesh Pro 1.0.56.0b3环境下遇到的动态文本环绕固定UI Image的需求,我之前帮不少开发者解决过类似的问题,结合你的研究方向,给你几个可行的方案:

方案1:利用TextMesh Pro的排除区域(Exclusion Ranges)

这是最接近HTML/CSS文本环绕逻辑的方案,核心是给TextMesh Pro文本设置一个“禁止文本进入”的矩形区域(也就是你的Image所在位置),让文本自动绕开它。不过你的TMP版本是较早的测试版,需要手动通过API实现:

具体步骤:

  • 给你的TextMesh Pro UI Text组件绑定一个自定义脚本,用来实时计算Image在文本坐标系内的矩形范围,并添加为排除区域
  • 当文本内容更新或者Image位置变化时,重新计算并更新排除区域,强制文本重新布局

示例代码:

using UnityEngine;
using TMPro;

public class TextWrapAroundImage : MonoBehaviour
{
    [SerializeField] private TMP_Text targetText;
    [SerializeField] private RectTransform imageRect;

    private void LateUpdate()
    {
        // 清除旧的排除区域,避免重复叠加
        targetText.textInfo.exclusionRanges.Clear();

        // 将Image的世界坐标转换为Text本地坐标系下的坐标
        Vector3[] imageWorldCorners = new Vector3[4];
        imageRect.GetWorldCorners(imageWorldCorners);
        Vector3[] imageLocalCorners = new Vector3[4];
        for (int i = 0; i < 4; i++)
        {
            imageLocalCorners[i] = targetText.rectTransform.InverseTransformPoint(imageWorldCorners[i]);
        }

        // 计算Image在文本区域内的矩形边界
        float minX = Mathf.Min(imageLocalCorners[0].x, imageLocalCorners[1].x, imageLocalCorners[2].x, imageLocalCorners[3].x);
        float maxX = Mathf.Max(imageLocalCorners[0].x, imageLocalCorners[1].x, imageLocalCorners[2].x, imageLocalCorners[3].x);
        float minY = Mathf.Min(imageLocalCorners[0].y, imageLocalCorners[1].y, imageLocalCorners[2].y, imageLocalCorners[3].y);
        float maxY = Mathf.Max(imageLocalCorners[0].y, imageLocalCorners[1].y, imageLocalCorners[2].y, imageLocalCorners[3].y);

        // 创建并添加排除区域
        TMP_ExclusionRange exclusionRange = new TMP_ExclusionRange();
        exclusionRange.rect = new Rect(minX, minY, maxX - minX, maxY - minY);
        targetText.textInfo.exclusionRanges.Add(exclusionRange);

        // 强制文本重新生成网格,应用排除区域
        targetText.ForceMeshUpdate();
    }
}

注意事项:

  • 确保你的Text组件开启了矩形裁剪(可以通过添加Mask组件或者设置Text的Overflow为Clip),否则文本可能会在Image下方继续渲染
  • 如果你的Image是固定位置的,可以把LateUpdate改成只在文本更新或初始化时执行,避免不必要的性能消耗

方案2:优化多文本片段的流式布局

你之前尝试过用多个Text片段拼接,但遇到了自动调整大小冲突的问题,这里可以优化这个思路:

具体调整:

  • 禁用所有Text片段的自动调整字体大小功能,统一设置为固定字体大小,避免不同片段字体不一致
  • 用TextMesh Pro的TMP_TextUtilities工具类来测量文本长度,自动将动态文本分配到图片上下左右的多个Text容器中:
    1. 先填充图片上方的Text容器,直到文本填满
    2. 再并行填充图片左侧和右侧的Text容器
    3. 最后填充图片下方的Text容器
  • 可以写一个简单的布局管理器脚本,自动计算每个容器能容纳的文本量,实现流畅的文本流动

方案3:升级TextMesh Pro版本(可选)

如果你的项目允许升级,更高版本的TextMesh Pro(比如2.x版本)内置了Exclusion Zone组件,只需要给Image添加这个组件,再关联到Text组件,就能一键实现文本环绕效果,不需要写额外代码。不过要注意Unity 5.6对高版本TMP的兼容性,可能需要做一些适配。


内容的提问来源于stack exchange,提问作者user9474008

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:49:44