Unity3d Unity(自定义编辑器)退出Unity时保存数据

Unity3d Unity(自定义编辑器)退出Unity时保存数据,unity3d,scripting,editor,ondestroy,scriptable-object,Unity3d,Scripting,Editor,Ondestroy,Scriptable Object,我创建了一个简单的自定义编辑器,显示我在Unity上花费了多少时间。当按下按钮时,它会将开始时间记录在可编写脚本的对象中(它是脏的)。再次按下按钮时,它会记录结束时间。如果在按下按钮之前关闭了窗口,我将使用OnDestroy()方法完成录制。它可以工作(我也使用“ExecuteInEditMode”)。 问题是:如果我不按按钮就关闭Unity,那么OnDestroy()方法这次就不起作用了。有什么方法可以解决这个问题吗?您可以向 Unity在编辑器应用程序退出时引发此事件 将事件处理程序添加到此

我创建了一个简单的自定义编辑器,显示我在Unity上花费了多少时间。当按下按钮时,它会将开始时间记录在可编写脚本的对象中(它是脏的)。再次按下按钮时,它会记录结束时间。如果在按下按钮之前关闭了窗口,我将使用OnDestroy()方法完成录制。它可以工作(我也使用“ExecuteInEditMode”)。
问题是:如果我不按按钮就关闭Unity,那么OnDestroy()方法这次就不起作用了。有什么方法可以解决这个问题吗?

您可以向

Unity在编辑器应用程序退出时引发此事件

将事件处理程序添加到此事件以接收应用程序正在退出的通知

请注意,如果编辑器被迫退出或出现崩溃,则不会触发此命令。无法取消退出过程时引发此事件

请注意,不需要按钮或ScriptableObject,您就可以完全自动完成:

using UnityEngine;
using UnityEditor;
using System.Diagnostics;

public static class LogEditorTime
{
    private static bool isLogging;
    private static readonly StopWatch sw = new StopWatch ();

    static void OnQuit()
    {
        sw.Stop();
        var elapsedTime = sw.Elapsed;

        Debug.Log($"Quitting the Editor after {elapsedTime.Hours}h {elapsedTime.Minutes}m {elapsedTime.Seconds}.{elapsedTime.Milliseconds / 10}s");
    }

    [InitializeOnLoadMethod]
    static void OnLoad()
    {
        if(isLogging) return;

        sw.Restart();

        EditorApplication.quitting -= OnQuit;
        EditorApplication.quitting += OnQuit;

        isLogging = true;
    }
}
谢谢你的代码:)我试了一会儿,它的工作。秒表很好。。但我用的是EditorApplication.timessurestartup。。无论如何,再次感谢你的解释。(顺便说一句,为什么我的问题会让选票下降?如果没有在互联网上进行认真的研究,我肯定不会在这里写作。我试图写清楚。我做错什么了吗?)