/*
ย * Unity Scene AutoSave Script
ย * https://ohwooya.com
ย * ๋๊ตฌ๋ ์ ๋ํฐ์์ ์ธ์ ๋ ์ด๋ค ๊ฒฝ์ฐ๋ ์ด์ฉ ๊ฐ๋ฅํฉ๋๋ค.
ย * ์ธํฐ๋ท์ ๊ฒ์ํ ๋๋ ์ถ์ฒ๋ง ํ๊ธฐํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
*/
using UnityEngine;
using UnityEditor;
using System;
using System.IO;
#if UNITY_5_3_OR_NEWER
using UnityEditor.SceneManagement;
using UnityEngine.SceneManagement;
#endif
#region "์๋์ ์ฅ ์ต์ "
[Serializable]
struct AutoSaveOption
{
public bool StartAutoSave;
public bool PlayModeSceneSave;
public bool CompileToSave;
public bool TimedAutoSave;
public intย SaveTimeTickMinute;
}
#endregion
public class AutoSave : EditorWindow
{
[SerializeField] static AutoSaveOption Option;
static private DateTime lastSaveTime = DateTime.Now;
static private Vector2ย ScrollPosition = Vector2.zero;
#region "์๋ํฐ ์๋์ฐ"
[MenuItem("Tools/AutoSave")]
static void AutoSaveWindow()
{
#if UNITY_5_3_OR_NEWER
// Get existing open window or if none, make a new one:
AutoSave window = (AutoSave)GetWindow(typeof(AutoSave));
window.minSize = new Vector2(500f, 400f);
window.maxSize = new Vector2(500f, 400f);
window.autoRepaintOnSceneChange = true;
window.Show();
#else
Debug.LogError("Unity 5.3๋ฒ์ ๋ฏธ๋ง์ ์ฌ์ฉํ ์ ์์ต๋๋ค");
#endif
}
#endregion
#region "์๋ํฐ ์ด๋ฒคํธ ํจ์"
[InitializeOnLoadMethod]
static private void OnInitalrize()
{
EditorApplication.update += update;
}
private void OnDestroy()
{
SaveAutoSaveOption();
EditorSceneManager.sceneSaving -= (scene, path) => Debug.Log(DateTime.Now + " " + path + " ์ ์ฅ์๋ฃ");
}
private void OnEnable()
{
EditorSceneManager.sceneSaving += (scene, path) => Debug.Log(DateTime.Now + " " + path + " ์ ์ฅ์๋ฃ");
try
{
LoadAutoSaveOption();
}
catch
{
Option = new AutoSaveOption();
SaveAutoSaveOption();
}
}
#endregion
#region "์ต์ ์ ์ฅ ๋ถ๋ฌ์ค๊ธฐ"
void SaveAutoSaveOption()
{
StreamWriter writer = new StreamWriter(Application.persistentDataPath + "/AutoSaveOption.json");
writer.Write(JsonUtility.ToJson(Option));
writer.Close();
}
void LoadAutoSaveOption()
{
StreamReader reader = new StreamReader(Application.persistentDataPath + "/AutoSaveOption.json");
Option = JsonUtility.FromJson<AutoSaveOption>(reader.ReadToEnd());
reader.Close();
}
#endregion
#region "์๋ ์ ์ฅ"
static private void update()
{
if (Option.StartAutoSave)
{
if (Option.TimedAutoSave && !EditorApplication.isPlaying)
{
TimeSpan TickTime = DateTime.Now - lastSaveTime;
if (TickTime.TotalMinutes >= Option.SaveTimeTickMinute)
{
SaveScene();
lastSaveTime = DateTime.Now;
}
}
if (!EditorApplication.isPlaying && EditorApplication.isPlayingOrWillChangePlaymode)
{
if (Option.PlayModeSceneSave)
{
SaveScene();
lastSaveTime = DateTime.Now;
}
}
if (EditorApplication.isCompiling)
{
if (Option.CompileToSave)
{
SaveScene();
lastSaveTime = DateTime.Now;
}
}
}
}
static void SaveScene()
{
SceneSetup[] Setup = EditorSceneManager.GetSceneManagerSetup();
for (int i = 0; i < Setup.Length; i++)
{
if (Setup[i].isLoaded)
{
Scene scene = EditorSceneManager.GetSceneByPath(Setup[i].path);
EditorSceneManager.SaveScene(scene);
}
}
EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo();
Debug.Log("์๋ ์ ์ฅ ์๋ฃ!");
}
#endregion
#region "์๋ํฐ ์๋์ฐ๋ฅผ ๊ทธ๋ฆฝ๋๋ค"
void OnGUI()
{
if (!EditorApplication.isPlaying)
{
GUILayout.Label("ํ๊ฒฝ์ค์ ", EditorStyles.boldLabel);
Option.PlayModeSceneSaveย = GUILayout.Toggle(Option.PlayModeSceneSave, "ํ๋ ์ด๋ชจ๋์ ์ ์ฅ");
Option.CompileToSave ย = GUILayout.Toggle(Option.CompileToSave, "์คํฌ๋ฆฝํธ ์ปดํ์ผ์ ์ ์ฅ");
Option.TimedAutoSaveย ย ย = EditorGUILayout.BeginToggleGroup("์๊ฐ ๊ฐ๊ฒฉ์ ๋ฐ๋ผ ์ ์ฅ", Option.TimedAutoSave);
Option.SaveTimeTickMinute = EditorGUILayout.IntSlider("๊ฐ๊ฒฉ(๋ถ)", Option.SaveTimeTickMinute, 1, 60);
EditorGUILayout.EndToggleGroup();
EditorGUILayout.HelpBox("์ต์ ์ ๋ณด๋ " + Application.persistentDataPath + "/AutoSaveOption.json์ ์ ์ฅ ๋ฉ๋๋ค", MessageType.Info, true);
GUILayout.Label("ํ์ฌ ์ด๋ฆฐ์ฌ " + EditorSceneManager.loadedSceneCount, EditorStyles.boldLabel);
EditorGUILayout.BeginVertical();
ScrollPosition = EditorGUILayout.BeginScrollView(ScrollPosition);
SceneSetup[] Setup = EditorSceneManager.GetSceneManagerSetup();
if (Setup != null)
{
for (int i = 0; i < Setup.Length; i++)
{
if (Setup[i].isLoaded)
{
EditorGUILayout.LabelField(Setup[i].path, EditorStyles.textField);
}
}
}
EditorGUILayout.EndScrollView();
EditorGUILayout.EndVertical();
if ( Option.StartAutoSave)
{
EditorGUILayout.HelpBox("์๋์ ์ฅ ์คํ์ค ์ ๋๋ค", MessageType.Info, true);
}
else
{
EditorGUILayout.HelpBox("์๋์ ์ฅ ์ค๋จ์ค ์ ๋๋ค", MessageType.Warning, true);
}
if (GUILayout.Button("์ฆ์์ ์ฅ"))
{
SaveScene();
}
if (GUILayout.Button("์๋์ ์ฅ ์์"))
{
Option.StartAutoSave = true;
DateTime lastSaveTime = DateTime.Now;
}
if (GUILayout.Button("์๋์ ์ฅ ์ค์ง"))
{
Option.StartAutoSave = false; ;
}
}
}
#endregion
}
์ฝ๋๊ฐ ๋ณต๋ถ์ด ์์๋์๋ฉด ( https://ohwooya.com/125 )๋ก ์ค์๋ฉด ๋ฉ๋๋ค..
์ ๋ํฐ ์๋ํฐ ์คํฌ๋ฆฝํธ๋ก ์ฌ์ ์๋์ ์ฅํ๋ ์คํฌ๋ฆฝํธ ์ ๋๋ค.
์ฌ์ฉ๋ฐฉ๋ฒ์ ๊ฐ๋จํฉ๋๋ค.
/Assets ํด๋๋ด๋ถ์ Editor๋ฅผ ๋ง๋์๊ณ (์์ผ์๋ฉด)ย
AutoSave.cs ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋์ ํ ๊ทธ๋๋ก ๋ณต๋ถํ์๋ฉด ๋ฉ๋๋ค.
์ด๋ฐ์์ผ๋ก ๋ง๋์๋ฉด ๋ฉ๋๋ค.
๋ง๋ฌด๋ฆฌํ์ จ์ผ๋ฉด ๋ฉ๋ด์ Tools->AutoSave๋ฅผ ์ ํํ์๋ฉด ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ์์ ์๋์ฐ๊ฐ ์ด๋ฆฝ๋๋ค.
์ต์ ์ย
-> ํ๋ ์ด ๋ชจ๋ ์์์ ์ ์ฅ ( ์ฒดํฌํด๋์๋ฉด ์ฌ๋ฌ๋ถ์ด ํ๋ ์ด ๋ฒํผ ๋๋ฅด๋ ์๊ฐ ์ ์ฅ ๋ฉ๋๋ค. )
-> ์คํฌ๋ฆฝํธ ์ปดํ์ผ์ ์ ์ฅ ( ์ฒดํฌํด๋์๋ฉด ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ปดํ์ผ ํ ๋ ์ ์ฅ ๋ฉ๋๋ค.)
-> ์๊ฐ ๊ฐ๊ฒฉ์๋ฐ๋ผ ์ ์ฅ ( ์ผ์ ์๊ฐ๋ง๋ค ์๋์ ์ฅ ํฉ๋๋ค.ย 1๋ถ๋ถํฐ 60๋ถ๊น์ง ์ค์ ํ์ค์ ์์ต๋๋ค.)
ํ์ฌ ์ด๋ฆฐ์ฌ์ ๋ํ๋ ์ฌ์ด ์ ์ฅ๋ฉ๋๋ค.
๋ชจ๋ ์๋์ ์ฅ์ ์ฌ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง ์ ์ฅ๋ฉ๋๋ค.
์๋ก๋ง๋ค์ด ํ๋ฒ๋ ์ ์ฅ์ด ๋์ง์๋์ฌ์ ์ ์ฅ์ฌ๋ถ๋ฅผ ๋ฌป์ต๋๋ค.
์ต์ ์๋ฃ ๋์ จ์ผ๋ฉด ์๋์ ์ฅ ์์์ ๊ผญ ๋๋ฅด์ ์ผ ๋์ ํฉ๋๋ค.
์ฆ์์ ์ฅ๋ฒํผ์ ๋๋ฅด๋ฉด ์ง๊ธ ํ๋ฒ ์ ์ฅ์ ๋ฐ๋กํฉ๋๋ค.
์ฌ๋ฌ์ฌ์ด ๋์์ ์ด๋ฆฌ๋ ๋ฉํฐ์ฌํธ์ง์์๋ ์ ์ ๋์ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋งคํ๋ก์ ํธ ๋ง๋์ค๋๋ง๋ค ์ฝ๋๋ฅผ ์ถ๊ฐํ์๋๊ฒ ๊ท์ฐฎ์ผ์ ๋ถ๋ค์ ์๋์ ๊ฐ์ด ํ์ธ์
ย
์ ๋ํฐ์ค์นํด๋8.1.1f1EditorDataResourcesPackageManagerProjectTemplatescom.unity.template.3dAssets
์ดํด๋๋ก ๊ฐ์ ์ ์ฌ๊ธฐ๋ค๊ฐ ๋ฏธ๋ฆฌ ์ฝ๋๋ฅผ ๋ฃ์ด๋์๋ฉด ๋ฉ๋๋ค.
์๋ฐ์ดํ๊ฐ ๋ฐ์ดํ๋ก ๋ชจ๋ ์นํ๋๋ฒ๋ ธ๋ค
๊ฐ๊ฟ๊ฐ์ฌ
ํ์ด์คํธ๋น์ด๋ ๊นํ์ด๋ ์ด๋๋ค ์ฌ๋ฆฌ๊ณ ๋งํฌ๋ฅผ ๊ฑธ์์ผ๋ฉด ๋ ์ข์์๋ฏ;