Skip to main content

[通用] 编辑器自动保存

防止各种意外崩溃导致未保存的内容丢失,可以按照需求删减或修改 。

使用方法:在Assets内创建一个C#脚本,删除脚本内预制的代码,将以下代码黏贴到脚本内,保存后即可生效。


#if UNITY_EDITOR

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEditor.SceneManagement;


[InitializeOnLoad]
public class AutoSaveScenes
{
    static AutoSaveScenes()
    {
        //当层级视图中对象层级发生变化后触发事件
        EditorApplication.hierarchyChanged += EditorApplication_hierarchyChanged;
        //当切换其他程序或切换回编辑器时触发事件
        EditorApplication.focusChanged += EditorApplication_focusChanged;
        //当编辑器播放触发事件
        EditorApplication.playModeStateChanged += DoAutoSaveScenesWhenPlay;
    }
    static int count = 0;
    /// <summary>
    /// 当层级视图中对象层级发生10次变化后触发事件
    /// </summary>
    private static void EditorApplication_hierarchyChanged()
    {
        count++;
        if (count > 10)
        {
            count = 0;
            EditorSceneManager.SaveOpenScenes();
            AssetDatabase.SaveAssets();
        }
    }
    /// <summary>
    /// 获取编辑器焦点状态
    /// </summary>
    /// <param name="obj"> false为切出编辑器,true为切回编辑器 </param>
    private static void EditorApplication_focusChanged(bool obj)
    {
        if (!obj)
        {
            EditorSceneManager.SaveOpenScenes();
            AssetDatabase.SaveAssets();
        }
    }
    /// <summary>
    /// 播放前保存
    /// </summary>
    /// <param name="state">播放状态</param>
    private static void DoAutoSaveScenesWhenPlay(PlayModeStateChange state)
    {
        if (state == PlayModeStateChange.ExitingEditMode)
        {
            EditorSceneManager.SaveOpenScenes();
            AssetDatabase.SaveAssets(); 
        }
    }
}

#endif