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

Unity使用ExecuteInEditMode修改TextMeshPro字号运行时回退问题

问题原因

  • 核心是通过脚本修改TextMeshPro属性后,没有通知Unity将修改的内容序列化持久化。Unity仅在你通过Inspector面板手动修改属性时,才会自动为对应对象标记「脏状态」,自动将改动写入场景/预制体的序列化数据中。
  • 你在OnValidate中直接修改fontSize的操作仅生效于编辑器内存缓存,改动没有写入磁盘的序列化文件。当你进入运行模式时,Unity会重新从磁盘加载场景的序列化数据,自然就回到了修改前的0.06数值。

修复方案

你只需要在修改属性后,给对应TextMeshPro对象标记脏状态即可,代码修改如下:

[ExecuteInEditMode]
public class ChangeAllFonts : MonoBehaviour
{
    void OnValidate()
    {
        TextMeshPro[] textMeshPro_Objects = Object.FindObjectsOfType<TextMeshPro>();
        foreach (TextMeshPro textMeshPro_Object in textMeshPro_Objects)
        {
            // 先记录对象状态,支持撤销操作,同时会自动标记脏
            #if UNITY_EDITOR
            UnityEditor.Undo.RecordObject(textMeshPro_Object, "修改字体大小");
            #endif
            textMeshPro_Object.fontSize = 0.04f;
            
            // 如果不需要撤销功能,也可以直接调用SetDirty标记
            // #if UNITY_EDITOR
            // UnityEditor.EditorUtility.SetDirty(textMeshPro_Object);
            // #endif
        }
    }
}

注意:UNITY_EDITOR宏是为了避免打包时引用编辑器命名空间报错,相关编辑器API只能在编辑器环境下调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 02:57:06