Unity定时自动保存及播放模式前提示保存。Unity版本2023.1

一、背景:由于经常忘记手动保存场景,遇见停电、代码逻辑出错导致播放模式下unity崩溃等情况,让人很郁闷,搜索相关文章和插件都是2022版本的,部分方法已过时导致在2023版本下没有作用。

二、适宜人群:和我一样健忘、代码菜、电脑配置低的小伙伴。

三、代码功能:1.定时保存场景,默认为300秒(5分钟)

                   

                  2.可自行更改定时间隔,按两下回车键确认。(为什么按两下我也不理解,ChatGPT编写的代码和我实践得到的结果。)

                  

                  3.点击Play(播放)后,会弹出提示询问是否保存场景。

                

四、操作流程:

                         1.在Assets/Editor/路径下创建任意名称(建议AutoSaveAndPlayMode,与脚本保持一致)的脚本,复制代码并保存。

                         2.工具栏——个人插件——自动保存,打开即可。

                  

五、当前存在的问题:每次打开后,“下一次保存”显示的时间是上次设置输入的时间,但“自动保存间隔”显示的时间一直是默认的300秒。 但只是显示问题,不影响正常使用,希望有大佬来修复这个bug,ChatGPT已经被我问成神经了,一直重复一个答案。               

六、相关代码。

using UnityEditor;
using UnityEngine;
using UnityEditor.SceneManagement;
using UnityEditor.PackageManager.UI;

// 在Unity编辑器加载时执行的自动保存和播放模式检测类
[InitializeOnLoad]
public class AutoSaveAndPlayMode : EditorWindow
{
    private  static float saveTime=300; // 默认的自动保存时间间隔,单位为秒
    private static float nextSave = 0; // 下一次自动保存的时间戳
    private string userInput = "300"; // 用户输入的时间间隔,默认为 300 秒

    // 静态构造函数,在类被加载时注册播放模式状态改变事件
    static AutoSaveAndPlayMode()
    {
        EditorApplication.playModeStateChanged += OnPlayModeStateChanged;
    }

    // 菜单项:个人插件 -> 自动保存
    [MenuItem("个人插件/自动保存")]
    static void Init()
    {
        
        // 创建 AutoSaveAndPlayMode 窗口实例
        AutoSaveAndPlayMode window = (AutoSaveAndPlayMode)EditorWindow.GetWindowWithRect(typeof(AutoSaveAndPlayMode), new Rect(0, 0, 300, 80));
        window.Show();
    }

    // 在窗口进行绘制
    void OnGUI()
    { 
        // 从EditorPrefs中读取保存的值,如果没有则使用默认值
        saveTime = EditorPrefs.GetFloat("AutoSave_saveTime",300);
        
        // 若下一次保存的时间戳为 0,则初始化为当前时间加上自动保存时间间隔
        if (nextSave == 0)
        {
            nextSave = (float)EditorApplication.timeSinceStartup + saveTime;
        }
        // 显示自动保存时间间隔和下一次保存时间
        float timeToSave = nextSave - (float)EditorApplication.timeSinceStartup;
        EditorGUILayout.LabelField("下一次保存:", timeToSave.ToString() + " 秒");

        // 用户输入框及秒单位
        GUILayout.BeginHorizontal();
        EditorGUILayout.PrefixLabel("自动保存间隔:");
        userInput = EditorGUILayout.TextField(userInput, GUILayout.Width(50));
        GUILayout.Label("秒", GUILayout.Width(30));
        GUILayout.EndHorizontal();

        // 当用户按下回车键时执行保存
        Event e = Event.current;
        if (e.type == EventType.KeyDown && e.keyCode == KeyCode.Return )
        {
            if (float.TryParse(userInput, out float newSaveTime))
            {
                saveTime = newSaveTime;
                nextSave = (float)EditorApplication.timeSinceStartup + saveTime;
                // 保存用户输入的值到EditorPrefs
                EditorPrefs.SetFloat("AutoSave_saveTime", saveTime);
                SaveScene();
            }
            else
            {
                Debug.LogError("无效的时间间隔,请输入有效的数字。");
            }
        }
        else
        {
            SaveScene();
        }

        // 实时更新窗口
        Repaint();
    }

    // 手动保存当前场景的方法
    void SaveScene()
    {
        // 若不处于播放模式,且当前时间超过下一次保存的时间戳
        if (!EditorApplication.isPlaying && EditorApplication.timeSinceStartup > nextSave)
        {
            // 直接保存当前所有打开的场景
            bool saveOK = EditorSceneManager.SaveOpenScenes();
            // 在控制台中输出保存成功或失败的消息
            Debug.Log("保存场景 " + (saveOK ? "成功" : "失败!"));
            // 更新下一次保存的时间戳
            nextSave = (float)EditorApplication.timeSinceStartup + saveTime;
        }
    }

    // 播放模式状态改变时的回调方法
    private static void OnPlayModeStateChanged(PlayModeStateChange state)
    {
        if (state == PlayModeStateChange.ExitingEditMode)
        {
            // 在即将切换到播放模式时执行的代码
            bool shouldSaveScene = EditorUtility.DisplayDialog("保存 场景", "是否要在进入播放模式之前保存场景?", "是", "否");

            if (shouldSaveScene)
            {
                EditorSceneManager.SaveOpenScenes();
            }
        }
    }
}

  • 14
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Unity5.x升级到Unity2017.x的过程中常见的异常问题,可以参考整理的经验共享文档。另外,如果您需要下载Unity5.x的32位版本,可以通过修改下载链接中的数字64为32来获取相应的安装程序。此外,您还可以关注Unity官方的GitHub页面,那里会发布一些示例工程以及处于开发阶段的新功能,可以帮助您了解Unity的发展方向并提升开发技能。希望这些信息对您有帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Unity4.x/5.x/2017.x升级差异总结](https://blog.csdn.net/weixin_34206899/article/details/86085382)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [最全UnityHub国际版下载链接Unity2023~2017各版本+Unity5.x【间歇性更新】](https://blog.csdn.net/qq_36829186/article/details/123847081)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [unity 5.x从入门到精通_Unity学习中值得收藏的学习资料(书籍)与博客](https://blog.csdn.net/u013712343/article/details/123378759)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值