如何在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
相关产品推荐
相关产品推荐

