扩展编辑器修改数据保存方法

unity 里面默认的组件和脚本发送修改后,场景上都会显示星号,表明有数据修改,需要保存。但是自己写的扩展编辑器修改数据后不显示星号,下次打开场景后数据会丢失。

Inspector 面板修改

需要在扩展面板方法里加上:

//当Inspector 面板发生变化时保存数据
if (GUI.changed)
{
    EditorUtility.SetDirty(target);
}
serializedObject.ApplyModifiedProperties();

示例:

public override void OnInspectorGUI()
{
    _yourScripts = target as YourScripts;
    
    // ……
    // 扩展编辑器的各种设定
    // ……

    //当Inspector 面板发生变化时保存数据
    if (GUI.changed)
    {
        EditorUtility.SetDirty(target);
    }
    serializedObject.ApplyModifiedProperties();
}

实测,这种写法的缺点是无法撤销。

MenuItem 关联方法修改

在关联方法末尾添加

// MarkSceneDirty 方法:当通过扩展编辑器调用这个方法时视为修改场景,场景出现星号,可以保存
UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene());

示例:

[MenuItem("TOOLS/示例", false, 1)]
 private static void OnInitScene() 
 {
     // ……
     // 实现的代码
     // ……

     // MarkSceneDirty 方法:当通过扩展编辑器调用这个方法时视为修改场景,场景出现星号,可以保存
     UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene());
 }

缺点也是不可撤销。