You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
4.0 KiB
C#
130 lines
4.0 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()
|
|
{
|
|
// 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);
|
|
|
|
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);
|
|
}
|
|
}
|