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

如何在Unity中通过脚本访问TextMesh Pro的纹理平铺与偏移属性?

可以通过MonoBehaviour脚本访问并修改这些属性

这些_FaceTex_ST和_OutlineTex_ST是Unity编译Shader时自动生成的纹理缩放/偏移辅助属性,它们不会显式出现在Shader的Properties块中,所以常规通过属性名直接访问的方式会失效,但可以通过以下步骤实现访问:

核心原理

Unity中,只要Shader里定义了纹理属性(比如_FaceTex),编译时就会自动生成对应的[纹理名]_ST float4属性,用于存储该纹理的Tiling(x、y分量)和Offset(z、w分量),这类属性需要通过属性ID来访问,而不是直接用字符串属性名调用常规的GetFloat/SetFloat方法。

实现代码示例

using UnityEngine;
using TMPro;

public class TMPTexSTAdjuster : MonoBehaviour
{
    public TextMeshPro targetText; // 若为UI文本,替换为TextMeshProUGUI

    void Update()
    {
        if (targetText == null)
        {
            targetText = GetComponent<TextMeshPro>();
            if (targetText == null) return;
        }

        // 获取属性的唯一ID(推荐用这种方式,避免字符串哈希冲突且效率更高)
        int faceTexSTId = Shader.PropertyToID("_FaceTex_ST");
        int outlineTexSTId = Shader.PropertyToID("_OutlineTex_ST");

        // 读取并修改Face纹理的偏移值(示例:随时间滚动)
        Vector4 currentFaceST = targetText.material.GetVector(faceTexSTId);
        currentFaceST.z += Time.deltaTime * 0.1f;
        currentFaceST.w += Time.deltaTime * 0.05f;
        targetText.material.SetVector(faceTexSTId, currentFaceST);

        // 直接设置Outline纹理的平铺值(3x3平铺,无偏移)
        Vector4 outlineST = new Vector4(3f, 3f, 0f, 0f);
        targetText.material.SetVector(outlineTexSTId, outlineST);
    }
}

注意事项

  • 必须使用material而非sharedMaterial:前者会创建材质实例,修改仅作用于当前TextMeshPro对象;后者修改会影响所有使用该材质的对象,容易引发意外问题。
  • 若使用UI文本,只需将组件替换为TextMeshProUGUI,逻辑完全一致。
  • 这些属性仅在Shader实际启用了对应纹理时才会生效,如果Shader中关闭了Face/Outline纹理,修改这些值不会有视觉变化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 02:25:44