这是这个问题的后续
假设我有一个简单的MonoBehavior
public class FooScript : MonoBehaviour {
public int someValue = 0;
public int otherValue = 0;
}
我把它放在一个空的游戏对象上,然后把游戏对象拖到项目中创建一个预制。
如果我选择预制并编辑someValue
,那么如果我转到仍在场景中的实例,我会看到someValue
被更新。
如果我在实例上编辑someValue
,则在预制件上更新someValue
。someValue
在实例上不更新,但如果我在预制件中更新otherValue
,则它在实例上更新。换句话说,每个实例属性都有自己的标志,无论它是否从源预制件中进行了修改。
但是,如果我制作一个编辑器脚本,在预制板上查找FooScript
并设置someValue
,则实例NOT更新,仅预制板。我希望它的行为完全像我在编辑器中手动完成的一样。换句话说,如果实例属性已被用户编辑,则不更新。如果实例属性尚未编辑,请进行更新。
问题是正确的方法是什么?看看PrefabUtilily
,似乎没有ApplyPropertiesFromSourcePrefabOnAllUnmodifiedInstancePropreties
函数。
我能想到的唯一解决方案是声音极其复杂。我得去
- 查找所有实例(遍历整个层次,不确定在卸载的场景中会发生什么(
- 对于每个实例记录,通过调用CCD_ 11并将结果存储在某个CCD_。(大量内存(
- 将我的更改应用于预制件
- 然后,对于每个对字段没有修改的实例,我正在更新并更新实例上的该属性
真的有那么复杂吗?还是有更简单的方法?
从文档浏览中,Unity似乎希望您在修改预制件上的属性之前在代码中使用Undo.RecordObject(Object objectToUndo, string name)
,这也有助于在Unity中创建撤消步骤,以便您可以恢复任何更改。
你可以使用EditorUtility.SetDirty(Object)
,但前提是你不想创建撤销步骤,Unity文档特别建议不要这样做。