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