如何从编辑器脚本中更新预制属性并让实例获得更新



这是这个问题的后续

假设我有一个简单的MonoBehavior

public class FooScript : MonoBehaviour {
  public int someValue = 0;
  public int otherValue = 0;
}

我把它放在一个空的游戏对象上,然后把游戏对象拖到项目中创建一个预制。

如果我选择预制并编辑someValue,那么如果我转到仍在场景中的实例,我会看到someValue被更新。

如果我在实例上编辑someValue,则在预制件上更新someValuesomeValue在实例上不更新,但如果我在预制件中更新otherValue,则它在实例上更新。换句话说,每个实例属性都有自己的标志,无论它是否从源预制件中进行了修改。

但是,如果我制作一个编辑器脚本,在预制板上查找FooScript并设置someValue,则实例NOT更新,仅预制板。我希望它的行为完全像我在编辑器中手动完成的一样。换句话说,如果实例属性已被用户编辑,则不更新。如果实例属性尚未编辑,请进行更新。

问题是正确的方法是什么?看看PrefabUtilily,似乎没有ApplyPropertiesFromSourcePrefabOnAllUnmodifiedInstancePropreties函数。

我能想到的唯一解决方案是声音极其复杂。我得去

  1. 查找所有实例(遍历整个层次,不确定在卸载的场景中会发生什么(
  2. 对于每个实例记录,通过调用CCD_ 11并将结果存储在某个CCD_。(大量内存(
  3. 将我的更改应用于预制件
  4. 然后,对于每个对字段没有修改的实例,我正在更新并更新实例上的该属性

真的有那么复杂吗?还是有更简单的方法?

从文档浏览中,Unity似乎希望您在修改预制件上的属性之前在代码中使用Undo.RecordObject(Object objectToUndo, string name),这也有助于在Unity中创建撤消步骤,以便您可以恢复任何更改。

你可以使用EditorUtility.SetDirty(Object),但前提是你不想创建撤销步骤,Unity文档特别建议不要这样做。

最新更新