“我的统一场景”有多个对象,其中包含一个TextMeshPro组件,我希望使用下面的代码以编程方式更改编辑器中的组件。当我将脚本附加到场景中的一个对象时,脚本将成功运行,尽管在Play模式中启动场景后,这些更改的字体大小都会恢复回(脚本执行前的值)。
初始字体大小= 0.06 ->附加脚本到对象,自动运行OnValidate ->新字体大小= 0.04 ->从对象中删除脚本,字体大小保持0.04 ->开始播放模式->字体大小恢复到0.06 ->退出播放模式->字体大小= 0.06
手动更改字体大小会维护新值,即使在播放模式下也是如此(因此不进行反转)。在使用脚本时,什么会导致字体大小持久性问题?
[ExecuteInEditMode]
public class ChangeAllFonts : MonoBehaviour
{
void OnValidate()
{
TextMeshPro[] textMeshPro_Objects = Object.FindObjectsOfType<TextMeshPro>();
foreach (TextMeshPro textMeshPro_Object in textMeshPro_Objects)
{
textMeshPro_Object.fontSize = 0.04f;
}
}
}发布于 2021-10-28 03:21:09
不确定,但我怀疑这个问题与序列化有关。您更改的是值,但不是单元存储的序列化值,而是在会话之间持续存在的值。因此,当您点击play时,编辑器会话就会结束,并且统一将搜索序列化的值。
我建议从序列化对象访问字体属性并以这种方式更改它。因此,您需要将TMP对象转换为序列化对象,找到正确的属性,然后修改它。
每次调用OnValidate时,为所有TMP对象运行此脚本可能是性能密集型的。最好是将其作为按钮或菜单项,仅在您决定运行时才运行。
发布于 2022-11-29 12:15:36
您可以尝试将fontSize值保存并加载到playerPrefs中或使用JSON。
https://stackoverflow.com/questions/69438057
复制相似问题