134 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			134 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C#
		
	
	
	
| using System.Collections;
 | |
| using System.Collections.Generic;
 | |
| using UnityEngine;
 | |
| using UnityEngine.SceneManagement;
 | |
| 
 | |
| public class ES3AutoSaveMgr : MonoBehaviour
 | |
| {
 | |
| 	public static ES3AutoSaveMgr _current = null;
 | |
|     public static ES3AutoSaveMgr Current
 | |
|     {
 | |
|         get
 | |
|         {
 | |
|             if (_current == null /*|| _current.gameObject.scene != SceneManager.GetActiveScene()*/)
 | |
|             {
 | |
|                 var scene = SceneManager.GetActiveScene();
 | |
|                 var roots = scene.GetRootGameObjects();
 | |
| 
 | |
|                 // First, look for Easy Save 3 Manager in the top-level.
 | |
|                 foreach (var root in roots)
 | |
|                     if (root.name == "Easy Save 3 Manager")
 | |
|                         return _current = root.GetComponent<ES3AutoSaveMgr>();
 | |
| 
 | |
|                 // If the user has moved or renamed the Easy Save 3 Manager, we need to perform a deep search.
 | |
|                 foreach (var root in roots)
 | |
|                     if ((_current = root.GetComponentInChildren<ES3AutoSaveMgr>()) != null)
 | |
|                         return _current;
 | |
|             }
 | |
|             return _current;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     // Included for backwards compatibility.
 | |
|     public static ES3AutoSaveMgr Instance
 | |
|     {
 | |
|         get { return Current; }
 | |
|     }
 | |
| 
 | |
|     public enum LoadEvent { None, Awake, Start }
 | |
| 	public enum SaveEvent { None, OnApplicationQuit, OnApplicationPause }
 | |
| 
 | |
| 	public string key = System.Guid.NewGuid().ToString();
 | |
| 	public SaveEvent saveEvent = SaveEvent.OnApplicationQuit;
 | |
| 	public LoadEvent loadEvent = LoadEvent.Awake;
 | |
| 	public ES3SerializableSettings settings = new ES3SerializableSettings("AutoSave.es3", ES3.Location.Cache);
 | |
| 
 | |
| 	public HashSet<ES3AutoSave> autoSaves = new HashSet<ES3AutoSave>();
 | |
| 
 | |
| 	public void Save()
 | |
| 	{
 | |
|         if (autoSaves == null || autoSaves.Count == 0)
 | |
|             return;
 | |
| 
 | |
|         // If we're using caching and we've not already cached this file, cache it.
 | |
|         if (settings.location == ES3.Location.Cache && !ES3.FileExists(settings))
 | |
|             ES3.CacheFile(settings);
 | |
| 
 | |
|         if (autoSaves == null || autoSaves.Count == 0)
 | |
|         {
 | |
|             ES3.DeleteKey(key, settings);
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             var gameObjects = new List<GameObject>();
 | |
|             foreach (var autoSave in autoSaves)
 | |
|                 // If the ES3AutoSave component is disabled, don't save it.
 | |
|                 if (autoSave.enabled)
 | |
|                     gameObjects.Add(autoSave.gameObject);
 | |
|             ES3.Save<GameObject[]>(key, gameObjects.ToArray(), settings);
 | |
|         }
 | |
| 
 | |
|         if(settings.location == ES3.Location.Cache && ES3.FileExists(settings))
 | |
|             ES3.StoreCachedFile(settings);
 | |
| 	}
 | |
| 
 | |
| 	public void Load()
 | |
| 	{
 | |
|         try
 | |
|         {
 | |
|             // If we're using caching and we've not already cached this file, cache it.
 | |
|             if (settings.location == ES3.Location.Cache && !ES3.FileExists(settings))
 | |
|                 ES3.CacheFile(settings);
 | |
|         }
 | |
|         catch { }
 | |
| 
 | |
|         ES3.Load<GameObject[]>(key, new GameObject[0], settings);
 | |
| 	}
 | |
| 
 | |
| 	void Start()
 | |
| 	{
 | |
| 		if(loadEvent == LoadEvent.Start)
 | |
| 			Load();
 | |
| 	}
 | |
| 
 | |
|     public void Awake()
 | |
|     {
 | |
|         autoSaves = new HashSet<ES3AutoSave>();
 | |
| 
 | |
|         foreach (var go in this.gameObject.scene.GetRootGameObjects())
 | |
|             autoSaves.UnionWith(go.GetComponentsInChildren<ES3AutoSave>(true));
 | |
| 
 | |
|         _current = this;
 | |
| 
 | |
|         if (loadEvent == LoadEvent.Awake)
 | |
|             Load();
 | |
|     }
 | |
| 
 | |
|     void OnApplicationQuit()
 | |
| 	{
 | |
| 		if(saveEvent == SaveEvent.OnApplicationQuit)
 | |
| 			Save();
 | |
| 	}
 | |
| 
 | |
| 	void OnApplicationPause(bool paused)
 | |
| 	{
 | |
| 		if(	(saveEvent == SaveEvent.OnApplicationPause || 
 | |
| 			(Application.isMobilePlatform && saveEvent == SaveEvent.OnApplicationQuit)) && paused)
 | |
| 			Save();
 | |
| 	}
 | |
| 
 | |
| 	/* Register an ES3AutoSave with the ES3AutoSaveMgr, if there is one */
 | |
| 	public static void AddAutoSave(ES3AutoSave autoSave)
 | |
| 	{
 | |
| 		if(ES3AutoSaveMgr.Current != null)
 | |
| 			ES3AutoSaveMgr.Current.autoSaves.Add(autoSave);
 | |
| 	}
 | |
| 
 | |
| 	/* Remove an ES3AutoSave from the ES3AutoSaveMgr, for example if it's GameObject has been destroyed */
 | |
| 	public static void RemoveAutoSave(ES3AutoSave autoSave)
 | |
| 	{
 | |
| 		if(ES3AutoSaveMgr.Current != null)
 | |
| 			ES3AutoSaveMgr.Current.autoSaves.Remove(autoSave);
 | |
| 	}
 | |
| }
 |