//============= Copyright (c) Ludic GmbH, All rights reserved. ============== // // Purpose: Part of the My Behaviour Tree Code // //============================================================================= using System.Collections; using System.Collections.Generic; using UnityEngine; namespace MyBT { using UnityEditor.IMGUI.Controls; using UnityEditor; using UnityEditor.Callbacks; [InitializeOnLoadAttribute] public class DetectBtChanges : AssetPostprocessor { public static bool autodetectFilechanges = true; [DidReloadScripts] static void MethodsReloaded() { Debug.Log("DetectBtChanges.MethodsReloaded"); if (autodetectFilechanges) { foreach (TaskController tc in Object.FindObjectsOfType(typeof(TaskController))) { if (tc.InspectorRegenerate!=null) { tc.InspectorRegenerate?.Invoke(false); } tc.RegenerateBehaviourTreeIfRequired(true); //tc.ClearBindingsAndScanAndBindMethods(); } } } static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) { if (autodetectFilechanges) { List changedFiles = new List(); foreach (string str in importedAssets) { string[] pathSplitStr = str.Split('/'); string[] fileSplitStr = pathSplitStr[pathSplitStr.Length - 1].Split('.'); string fileName = string.Join(".", fileSplitStr, 0, fileSplitStr.Length - 1); changedFiles.Add(fileName); } //TaskController[] taskControllers = Resources.FindObjectsOfTypeAll(); foreach (TaskController tc in UnityEngine.Resources.FindObjectsOfTypeAll()) { // unmutable objects if (tc.hideFlags == HideFlags.NotEditable || tc.hideFlags == HideFlags.HideAndDontSave) { Debug.Log("NotEditable || HideAndDontSave"); continue; } // is a file on disk //if (!EditorUtility.IsPersistent(tc.transform.root.gameObject)) { // Debug.Log("IsPersistent"); // continue; //} // everything else is a scene TaskController foreach (UnityEngine.TextAsset txt in tc.taskScripts) { if (txt != null) { if (changedFiles.Contains(txt.name)) { if (tc.InspectorRegenerate != null) tc.InspectorRegenerate.Invoke(true); //tc.BtScriptChangeDetected(); } } } } //foreach (string str in deletedAssets) { // Debug.Log("Deleted Asset: " + str); //} //for (int i = 0; i < movedAssets.Length; i++) { // Debug.Log("Moved Asset: " + movedAssets[i] + " from: " + movedFromAssetPaths[i]); //} } } //static DetectBtChanges() { // EditorApplication.playModeStateChanged += LogPlayModeState; //} //private static void LogPlayModeState(PlayModeStateChange state) { // switch (state) { // // start playing // case PlayModeStateChange.ExitingEditMode: // Debug.Log("DetectBtChanges.LogPlayModeState.ExitingEditMode"); // break; // case PlayModeStateChange.EnteredPlayMode: // Debug.Log("DetectBtChanges.LogPlayModeState.EnteredPlayMode"); // break; // // stopping playing // case PlayModeStateChange.ExitingPlayMode: // Debug.Log("DetectBtChanges.LogPlayModeState.ExitingPlayMode"); // break; // case PlayModeStateChange.EnteredEditMode: // Debug.Log("DetectBtChanges.LogPlayModeState.EnteredEditMode"); // EnterEditMode(); // break; // } //} //private static void EnterEditMode () { // TaskController[] taskControllers = Resources.FindObjectsOfTypeAll(); // Debug.Log($"DetectBtChanges.EnteredEditMode: has {taskControllers.Length} TaskControllers"); // foreach (TaskController taskController in taskControllers) { // // is NOT a file on disk (not in the scene) // if (!EditorUtility.IsPersistent(taskController)) { // Debug.Log($"Regenerate {taskController.name}"); // taskController.ResetNodesAndTokens(); // taskController.GenerateTokensAndNodes(); // } // } //} } }