using System.Linq; using System.Threading.Tasks; using General; using UnityEditor; using UnityEngine; namespace DSM.Editor { public class DSMEditor : MonoBehaviour { private const string DebuggerComponentName = "DebuggerComponent"; private const string UnableToInstantiateDsmWithCurrentCompilerSettings = "Unable to instantiate DSM with current compiler settings."; private const string DSMData = "DSMData"; private const int ExecutionOrder = -50; static Il2CppCompilerConfiguration debug = Il2CppCompilerConfiguration.Debug; static ScriptingImplementation mono = ScriptingImplementation.Mono2x; static ScriptingImplementation il2cpp = ScriptingImplementation.IL2CPP; private static bool state = true; private static bool keepOldVersion; private static GameObject dsmObject; private static int updateFrequency = 20; #region Methods public static void ClearCurrentScene() { foreach (var item in FindObjectsOfType()) { DestroyImmediate(item.gameObject); } } public static async void InstantiateCurrentScene(bool force = false) { if(!await InstantiateFPS(GetIl2CppCompilerConfiguration() , GetScriptingBackend(),force)) { Debug.LogWarning(UnableToInstantiateDsmWithCurrentCompilerSettings); } } [InitializeOnLoadMethod] static async void Init() { if (EditorApplication.isPlaying) return; await Task.Yield(); SetExecutionOrder(); while (true) { if (dsmObject != null) break; foreach (var item in AssetDatabase.FindAssets(DSMData)) { var data = (DSMObj)AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(item), typeof(DSMObj)); if (data.gameObjectFps == null) continue; dsmObject = data.gameObjectFps; keepOldVersion = data.keepOldVersion; break; } } } static async Task InstantiateFPS(Il2CppCompilerConfiguration Il2CppCompilerConfig , ScriptingImplementation scripting,bool force = false) { foreach (var item in FindObjectsOfType()) { DestroyImmediate(item.gameObject); } if (!force) if ((Il2CppCompilerConfig != debug || !dsmObject) && (scripting != mono || !dsmObject)) return false; dsmObject.GetComponent().keepOldVersion = keepOldVersion; var obj = Instantiate(dsmObject); await Task.Yield(); return true; } static void SetExecutionOrder() { if (MonoImporter.GetAllRuntimeMonoScripts(). Where(item => item.name == DebuggerComponentName). Any(item => ExecutionOrder == MonoImporter.GetExecutionOrder(item))) { return; } foreach (var item in AssetDatabase.FindAssets(DebuggerComponentName)) { var assetPath = AssetDatabase.GUIDToAssetPath(item); var monoImporter = AssetImporter.GetAtPath(assetPath) as MonoImporter; if (monoImporter != null) MonoImporter.SetExecutionOrder(monoImporter.GetScript(), ExecutionOrder); } } static ScriptingImplementation GetScriptingBackend() => PlayerSettings.GetScriptingBackend(EditorUserBuildSettings.selectedBuildTargetGroup); static Il2CppCompilerConfiguration GetIl2CppCompilerConfiguration() => PlayerSettings.GetIl2CppCompilerConfiguration(EditorUserBuildSettings.selectedBuildTargetGroup); #endregion } }