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; | |||
|  |     } | |||
|  | } |