Unity中Canvas Group无法修改子对象TextMeshPro alpha值如何解决
问题成因
- TextMeshPro(简称TMP)UGUI版本未跟随父级Canvas Group透明的核心原因是渲染传递链路被阻断:当TMP所在层级存在开启
Override Sorting的独立Canvas、TMP挂载的字体材质开启了Alpha Clipping、TMP对象缺失Canvas Renderer组件时,Canvas Group的全局alpha值不会传递到对应TMP对象上。 - 动态实例化生成的TMP大概率会在实例化过程中自动生成带独立排序配置的子Canvas节点,直接脱离父级Canvas Group的渲染管控范围,这也是静态TMP正常、动态生成TMP不透明的最常见原因。
- 2.1及更早版本的TMP存在原生已知Bug,本身就不支持跨子Canvas继承父级Canvas Group的alpha值,即使配置全部正确也会出现透明失效的问题。
可行解决方案
根据项目实际场景选对应方案即可,不需要逐个手动修改TMP的alpha值:
方案1:静态配置修复
适合全静态UI布局的场景,不需要写代码:
- 从挂载Canvas Group的根节点开始遍历所有子层级,找到所有挂载Canvas组件的节点,关闭其
Override Sorting选项,消除渲染层级隔离。 - 选中项目中所有TMP字体使用的材质,将材质的
Rendering Mode改为Transparent,关闭Alpha Clipping选项,避免材质自身截断透明度通道。 - 确认所有TMP对象都挂载了
Canvas Renderer组件,缺失该组件的UGUI元素会直接忽略父级Canvas Group的透明度设置。 - 如果项目使用的是2.x版本的TMP,直接升级TMP包到3.0以上正式版本即可修复原生传递Bug。
方案2:运行时脚本适配
适合存在大量动态生成TMP的场景,一次挂载即可自动适配所有动态实例化的文本:
在挂载Canvas Group的根节点上添加如下辅助脚本,会自动同步alpha值到所有子层级TMP:
using UnityEngine; using TMPro; [RequireComponent(typeof(CanvasGroup))] public class CanvasGroupTmpAlphaSync : MonoBehaviour { private CanvasGroup _group; private TMP_Text[] _tmpTexts; private float _lastAlpha; private void Awake() { _group = GetComponent<CanvasGroup>(); _lastAlpha = _group.alpha; // 初始获取所有子级TMP,包含未激活对象 _tmpTexts = GetComponentsInChildren<TMP_Text>(true); } private void LateUpdate() { // alpha无变化时跳过计算,降低性能开销 if (Mathf.Approximately(_lastAlpha, _group.alpha)) return; _lastAlpha = _group.alpha; foreach (var tmp in _tmpTexts) { if (tmp == null) continue; var originColor = tmp.color; tmp.color = new Color(originColor.r, originColor.g, originColor.b, _lastAlpha); } } /// <summary> /// 动态实例化新的TMP对象后,调用该方法刷新TMP缓存即可 /// </summary> public void RefreshTmpCache() { _tmpTexts = GetComponentsInChildren<TMP_Text>(true); } }
如果使用DOTween等补间插件做淡入淡出动画,可以把alpha同步逻辑放到补间的
OnUpdate回调中,不需要每帧检测,性能表现更好。
方案3:Shader层全局修复
适合项目中大规模出现该问题、不想给每个UI加辅助脚本的场景:
修改TMP默认使用的UI字体Shader,添加对父级Canvas Group alpha值的读取逻辑,让TMP在渲染时直接继承父级Canvas的透明度属性,从渲染底层解决传递问题,配置完成后所有TMP会和普通Image、Text组件一样正常响应Canvas Group的alpha修改,不需要额外加脚本或改配置。
Canvas Group alpha设为0时TMP仍可见的编辑器截图
内容的提问来源于stack exchange,提问作者danielenapo
相关产品推荐
相关产品推荐

