SDK_UnityMoney/Assets/Plugins/Easy Save 3/Editor/ES3Postprocessor.cs

149 lines
5.5 KiB
C#

using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.SceneManagement;
using UnityEngine.SceneManagement;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using ES3Internal;
/*
* ---- How Postprocessing works for the reference manager ----
* - When the manager is first added to the scene, all top-level dependencies are added to the manager (AddManagerToScene).
* - When the manager is first added to the scene, all prefabs with ES3Prefab components are added to the manager (AddManagerToScene).
* - All GameObjects and Components in the scene are added to the reference manager when we enter Playmode or the scene is saved (PlayModeStateChanged, OnWillSaveAssets -> AddGameObjectsAndComponentstoManager).
* - When a UnityEngine.Object field of a Component is modified, the new UnityEngine.Object reference is added to the reference manager (PostProcessModifications)
* - All prefabs with ES3Prefab Components are added to the reference manager when we enter Playmode or the scene is saved (PlayModeStateChanged, OnWillSaveAssets -> AddGameObjectsAndComponentstoManager).
* - Local references for prefabs are processed whenever a prefab with an ES3Prefab Component is deselected (SelectionChanged -> ProcessGameObject)
*/
[InitializeOnLoad]
public class ES3Postprocessor : UnityEditor.AssetModificationProcessor
{
private static bool refreshed = false;
public static ES3ReferenceMgr RefMgr
{
get { return (ES3ReferenceMgr)ES3ReferenceMgr.Current; }
}
public static GameObject lastSelected = null;
// This constructor is also called once when playmode is activated and whenever recompilation happens
// because we have the [InitializeOnLoad] attribute assigned to the class.
static ES3Postprocessor()
{
// Open the Easy Save 3 window the first time ES3 is installed.
//ES3Editor.ES3Window.OpenEditorWindowOnStart();
#if UNITY_2017_2_OR_NEWER
EditorApplication.playModeStateChanged += PlayModeStateChanged;
#else
EditorApplication.playmodeStateChanged += PlaymodeStateChanged;
#endif
}
#region Reference Updating
private static void RefreshReferences(bool isEnteringPlayMode = false)
{
if (refreshed) // If we've already refreshed, do nothing.
return;
if (RefMgr != null && ES3Settings.defaultSettingsScriptableObject.autoUpdateReferences)
{
RefMgr.RefreshDependencies(isEnteringPlayMode);
}
UpdateAssembliesContainingES3Types();
refreshed = true;
}
#if UNITY_2017_2_OR_NEWER
public static void PlayModeStateChanged(PlayModeStateChange state)
{
// Add all GameObjects and Components to the reference manager before we enter play mode.
if (state == PlayModeStateChange.ExitingEditMode && ES3Settings.defaultSettingsScriptableObject.autoUpdateReferences)
RefreshReferences(true);
}
#else
public static void PlaymodeStateChanged()
{
// Add all GameObjects and Components to the reference manager before we enter play mode.
if (!EditorApplication.isPlaying && ES3Settings.defaultSettingsScriptableObject.autoUpdateReferences)
RefreshReferences(true);
}
#endif
public static string[] OnWillSaveAssets(string[] paths)
{
// Don't refresh references when the application is playing.
if (!EditorApplication.isUpdating && !Application.isPlaying && ES3Settings.defaultSettingsScriptableObject.autoUpdateReferences)
RefreshReferences();
return paths;
}
#endregion
private static void UpdateAssembliesContainingES3Types()
{
#if UNITY_2017_3_OR_NEWER
var assemblies = UnityEditor.Compilation.CompilationPipeline.GetAssemblies();
var defaults = ES3Settings.defaultSettingsScriptableObject;
var currentAssemblyNames = defaults.settings.assemblyNames;
var assemblyNames = new List<string>();
foreach (var assembly in assemblies)
{
try
{
var name = assembly.name;
var substr = name.Length >= 5 ? name.Substring(0, 5) : "";
if (substr != "Unity" && substr != "com.u" && !name.Contains("-Editor"))
assemblyNames.Add(name);
}
catch { }
}
// Only update if the list has changed.
for (int i = 0; i < currentAssemblyNames.Length; i++)
{
if (currentAssemblyNames[i] != assemblyNames[i])
{
defaults.settings.assemblyNames = assemblyNames.ToArray();
EditorUtility.SetDirty(defaults);
}
}
#endif
}
public static GameObject AddManagerToScene()
{
GameObject mgr = null;
if (RefMgr != null)
mgr = RefMgr.gameObject;
if (mgr == null)
mgr = new GameObject("Easy Save 3 Manager");
if (mgr.GetComponent<ES3ReferenceMgr>() == null)
{
mgr.AddComponent<ES3ReferenceMgr>();
if (!Application.isPlaying && ES3Settings.defaultSettingsScriptableObject.autoUpdateReferences)
RefMgr.RefreshDependencies();
}
if (mgr.GetComponent<ES3AutoSaveMgr>() == null)
mgr.AddComponent<ES3AutoSaveMgr>();
Undo.RegisterCreatedObjectUndo(mgr, "Enabled Easy Save for Scene");
return mgr;
}
}