10

Unity插件研究院之自动保存场景

 3 years ago
source link: https://www.xuanyusong.com/archives/2309
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Unity插件研究院之自动保存场景

雨松MOMO 【Unity杂文】 围观2450524 条评论 编辑日期:2013-05-08 字体:

原文: http://wiki.unity3d.com/index.php?title=AutoSave 

最近发现Unity老有自动崩溃的BUG。 每次崩溃的时候由于项目没有保存所以Hierarchy视图游戏对象与游戏资源的关系就会丢失。所以想到自动保存场景。  本来想自己写一个这样的脚本,但是发现维基百科上已经有了。。。

using UnityEngine;
using UnityEditor;
using System;
public class AutoSave : EditorWindow {
    private bool autoSaveScene = true;
    private bool showMessage = true;
    private bool isStarted = false;
    private int intervalScene;
    private DateTime lastSaveTimeScene = DateTime.Now;
    private string projectPath = Application.dataPath;
    private string scenePath;
    [MenuItem ("Window/AutoSave")]
    static void Init () {
        AutoSave saveWindow = (AutoSave)EditorWindow.GetWindow (typeof (AutoSave));
        saveWindow.Show();
    void OnGUI () {
        GUILayout.Label ("Info:", EditorStyles.boldLabel);
        EditorGUILayout.LabelField ("Saving to:", ""+projectPath);
        EditorGUILayout.LabelField ("Saving scene:", ""+scenePath);
        GUILayout.Label ("Options:", EditorStyles.boldLabel);
        autoSaveScene = EditorGUILayout.BeginToggleGroup ("Auto save", autoSaveScene);
        intervalScene = EditorGUILayout.IntSlider ("Interval (minutes)", intervalScene, 1, 10);
        if(isStarted) {
            EditorGUILayout.LabelField ("Last save:", ""+lastSaveTimeScene);
        EditorGUILayout.EndToggleGroup();
        showMessage = EditorGUILayout.BeginToggleGroup ("Show Message", showMessage);
        EditorGUILayout.EndToggleGroup ();
    void Update(){
        scenePath = EditorApplication.currentScene;
        if(autoSaveScene) {
            if(DateTime.Now.Minute >= (lastSaveTimeScene.Minute+intervalScene) || DateTime.Now.Minute == 59 && DateTime.Now.Second == 59){
                saveScene();
        } else {
            isStarted = false;
    void saveScene() {
        EditorApplication.SaveScene(scenePath);
        lastSaveTimeScene = DateTime.Now;
        isStarted = true;
        if(showMessage){
            Debug.Log("AutoSave saved: "+scenePath+" on "+lastSaveTimeScene);
        AutoSave repaintSaveWindow = (AutoSave)EditorWindow.GetWindow (typeof (AutoSave));
        repaintSaveWindow.Repaint();

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK