这是后续这个问题 https://stackoverflow.com/questions/38785607/how-to-edit-a-monobehaviours-properties-on-a-prefab-in-the-unityeditor-from-scr
假设我有一个简单的 MonoBehaviour
public class FooScript : MonoBehaviour {
public int someValue = 0;
public int otherValue = 0;
}
我将其放在一个空的游戏对象上,然后将游戏对象拖到项目中以创建预制件。
如果我选择预制件并编辑someValue
然后如果我去场景中仍然存在的实例,我会看到someValue
已更新。
如果我编辑someValue
在实例上然后更新someValue
在预制件上someValue
is NOT在实例上更新,但如果我更新otherValue
在预制件上,它会在实例上更新。换句话说,每个实例属性都有自己的标志,表明它是否已从源预制件修改。
但是,如果我制作一个编辑器脚本并查找FooScript
在预制件上并设置someValue
该实例是NOT更新了,只有预制件。我希望它的行为就像我在编辑器中手动完成的一样。换句话说,如果用户编辑了实例属性,则不会更新。如果实例属性尚未编辑,请进行更新。
问题是正确的方法是什么?看着PrefabUtilily http://docs.unity3d.com/ScriptReference/PrefabUtility.html似乎没有ApplyPropertiesFromSourcePrefabOnAllUnmodifiedInstancePropreties
功能。
我能想到的唯一解决方案是声音极其令人费解。我必须
- 查找所有实例(遍历整个层次结构,不确定卸载场景中会发生什么)
- 对于每个实例记录,通过调用对其进行修改
PrefabUtility.GetPropertyModifications
并将结果存储在一些Dictionary<GameObject, PropertyModifications[]>
。 (大量内存)
- 将我的更改应用于预制件。
- 然后,对于我正在更新的字段没有修改的每个实例,也会更新实例上的该属性。
真的那么复杂还是有更简单的方法?
从文档浏览来看,Unity 似乎希望您使用Undo.RecordObject(Object objectToUndo, string name)
在修改预制件上的属性之前在代码中进行修改,这还有一个好处是可以在 Unity 本身中创建撤消步骤,以便您可以恢复任何更改。
您可以使用EditorUtility.SetDirty(Object)
,但前提是您不想创建撤消步骤,并且 Unity 文档特别建议不要这样做。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)