/*

ย * 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

์ดํด๋”๋กœ ๊ฐ€์…”์„œ ์—ฌ๊ธฐ๋‹ค๊ฐ€ ๋ฏธ๋ฆฌ ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด๋‘์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.