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

