149 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			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;
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 |