Unity脚本修改prefab
首先,获取prefab对象
1 | GameObject go = AssetDatabase.LoadAssetAtPath(filePath, typeof(GameObject)) as GameObject; |
然后,对GameObject修改属性就可以了。
最后,一定要加上
1 | EditorUtility.SetDirty(go); |
否则修改后的prefab无法保存。
拓展知识
EditorUtility.SetDirty
在Unity5.3之前是标记对象被修改(Dirty)的主要方法。但从5.3开始,随着多场景编辑(Multi-Scene Editing)的引入,此函数不应再用于修改场景中的对象。
相反,您应该在对对象进行更改之前使用Undo.RecordObject
。 这将标记对象的场景被修改了,并在编辑器中提供一个可撤销条目(undo entry)。
如果您正在修改场景中的文件,并且不想为修改添加可撤销条目,则应使用
1 | EditorSceneManager.MarkSceneDirty |
如果使用自定义编辑器修改组件或资产上的序列化属性,则应使用
1 | pSerializedObject.FindProperty] |
这将标记修改的对象为“Dirty”(被修改),并为您创建可撤消状态(Undo states)。
因此,您应该使用此功能的唯一剩余情况是,如果您通过某些其他方式修改非场景对象,并且特别不希望为您的修改创建一个可撤销条目。 这是罕见的,除非你非常确定要求这,你可能不应该使用这个命令!
Unity内部使用“Dirty”标志来确定资产何时更改并需要保存到磁盘。
以上内容翻译自Unity文档:EditorUtility.SetDirty
小结
从上面的文档可以得出一个简单的结论:EditorUtility.SetDirty
可以标记脚本作出的修改,但是不能让你撤销这些修改;Undo.RecordObject
标记的修改可以被撤销,但不能修改非场景对象。
至于到底选择哪个方法去标记修改,就看具体的需求了。