首先,获取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
2
3
4
pSerializedObject.FindProperty]
SerializedObject.Update
EditorGUILayout.PropertyField
SerializedObject.ApplyModifiedProperties

这将标记修改的对象为“Dirty”(被修改),并为您创建可撤消状态(Undo states)

因此,您应该使用此功能的唯一剩余情况是,如果您通过某些其他方式修改非场景对象,并且特别不希望为您的修改创建一个可撤销条目。 这是罕见的,除非你非常确定要求这,你可能不应该使用这个命令!

Unity内部使用“Dirty”标志来确定资产何时更改并需要保存到磁盘。

以上内容翻译自Unity文档:EditorUtility.SetDirty

小结

从上面的文档可以得出一个简单的结论:EditorUtility.SetDirty可以标记脚本作出的修改,但是不能让你撤销这些修改;Undo.RecordObject标记的修改可以被撤销,但不能修改非场景对象。

至于到底选择哪个方法去标记修改,就看具体的需求了。