読者です 読者をやめる 読者になる 読者になる

PaperSloth’s diary

Unity(C#)、UE4(Blueprint/C++)についての記事を書いたり日常のことをつぶやきます。

Unityの開発準備3(AutoSaveのお話)

 
AutoSaveの説明に入る前に先に書いておきます!
 

このAutoSave機能はまだまだ開発途中のため、結構ダメダメな点が多いです。

できれば、データ復旧機能とか色々付け足していきたいと考えております。
 
 
現在実装できている機能はこちらです。
・一定間隔毎に自動でSceneを保存
 現状では1〜10分間隔
・上書き保存を行うかの確認
・保存した際にログを出す
 
ソースコードになります。
using UnityEngine;
using UnityEditor;
using System;

// Sceneの自動保存機能
public class AutoSave : EditorWindow
{
private bool m_isAutoSaveScene = true; // 自動保存を行うか否かの判定
private bool m_isShowMessage = true; // 保存時のメッセージ(ログ)を記述するかの判定
 private bool m_isOverwrite = true; // 上書き保存を行うかの判定
/* 上記3つのフラグはWindow上から有効、無効の変更が可能です */

private bool m_isStarted = false; // 最終保存時の時間描画判定
private int m_intervalScene; // 自動保存を行う時間の長さ(分単位)
private const int MIN_INTERVAL = 1; // 自動保存を行う最少の間隔
private const int MAX_INTERVAL = 10; // 自動保存を行う最大の間隔
private DateTime m_lastSaveTimeScene = DateTime.Now; // 最後に保存された時間を記録

private string m_projectPath = Application.dataPath; // プロジェクトへのパス名
private string m_scenePath; // Sceneへのパス名

// WindowにAutoSave Windowを追加する
[MenuItem("Window/AutoSave")]
static void Init()
{
AutoSave saveWindow = (AutoSave)EditorWindow.GetWindow(typeof(AutoSave));
saveWindow.Show();
}

// Windowに表示する情報の定義
void OnGUI()
{
// Window上にプロジェクトとSceneのパスを記述
GUILayout.Label("Information:", EditorStyles.boldLabel);
EditorGUILayout.LabelField("Saving to:", "" + projectPath);
EditorGUILayout.LabelField("Saving scene:", "" + scenePath);

// 保存する際のOption設定の詳細
GUILayout.Label("Options:", EditorStyles.boldLabel);
this.m_isAutoSaveScene =
EditorGUILayout.BeginToggleGroup("Auto save", this.m_isAutoSaveScene);
this.m_intervalScene =
EditorGUILayout.IntSlider("Interval (minutes)",
this.m_intervalScene,
MIN_INTERVAL, MAX_INTERVAL);
// 最終保存された時間を表示
if (this.m_isStarted)
{
EditorGUILayout.LabelField("Last save:", "" + this.m_lastSaveTimeScene);
}
EditorGUILayout.EndToggleGroup();
this.m_isShowMessage =
EditorGUILayout.BeginToggleGroup("Show Message", this.m_isShowMessage);
EditorGUILayout.EndToggleGroup();
this.m_isOverwrite =
EditorGUILayout.BeginToggleGroup("Overwrite Dialog", this.m_isOverwrite);
EditorGUILayout.EndToggleGroup();
}

// 上書きを行うか否かの確認ダイアログ(正直うz...なんでもないです)
void CallDialog(){
bool result = EditorUtility.DisplayDialog(
"",
"上書き保存しますか?",
"OK",
"キャンセル"
);
if (result)
{
Debug.Log("上書き保存されました");
this.SaveScene();
}
else
{
Debug.Log("保存されませんでした");
this.m_lastSaveTimeScene = DateTime.Now;
}
}

void Update()
{
scenePath = EditorApplication.currentScene;
if (this.m_isAutoSaveScene)
{
if (DateTime.Now.Minute >=
(this.m_lastSaveTimeScene.Minute + this.m_intervalScene)
|| DateTime.Now.Minute == 59 && DateTime.Now.Second == 59)
{
if (this.m_isOverwrite)
{
this.CallDialog();
}
else
{
this.SaveScene();
}
}
}
else
{
this.m_isStarted = false;
}
}

void SaveScene()
{
EditorApplication.SaveScene(scenePath);
this.m_lastSaveTimeScene = DateTime.Now;
this.m_isStarted = true;
if (this.m_isShowMessage)
{
Debug.Log("AutoSave saved: " + scenePath + " on " + this.m_lastSaveTimeScene);
}
AutoSave repaintSaveWindow = (AutoSave)EditorWindow.GetWindow(typeof(AutoSave));
repaintSaveWindow.Repaint();
}
}
 
少し注意点があります。
拡張Windowのため、このAutoSave Windowを開いていないと機能しないですorz
 
また、実行中(Play中)でも保存しようとします。
勘弁してくだされ〜
 
一応チェックボックスで無駄な機能を省いたりもできるようにしています。
 
 
 
まだまだ未熟者ですが、今後ともよろしくお願いしますm(__)m