using System; using System.Collections.Generic; using UnityEditor; using UnityEngine; [InitializeOnLoad] public static class BoltExecutionOrderManager { static BoltExecutionOrderManager() { Dictionary monoScripts = new Dictionary(); foreach (MonoScript monoScript in MonoImporter.GetAllRuntimeMonoScripts()) { try { switch (monoScript.name) { case "BoltPoll": SetExecutionOrder(monoScript, -10000); break; case "BoltSend": SetExecutionOrder(monoScript, +10000); break; case "BoltEntity": SetExecutionOrder(monoScript, -2500); break; default: if (monoScripts.ContainsKey(monoScript.name)) { monoScripts[monoScript.name] = monoScript; } else { monoScripts.Add(monoScript.name, monoScript); } break; } } catch { } } foreach (var asm in AppDomain.CurrentDomain.GetAssemblies()) { foreach (var type in asm.GetTypes()) { if (monoScripts.ContainsKey(type.Name)) { try { foreach (BoltExecutionOrderAttribute attribute in type.GetCustomAttributes(typeof(BoltExecutionOrderAttribute), false)) { SetExecutionOrder(monoScripts[type.Name], attribute.executionOrder); } } catch (Exception exn) { BoltLog.Exception(exn); } } } } } static void SetExecutionOrder(MonoScript script, Int32 executionOrder) { if (MonoImporter.GetExecutionOrder(script) != executionOrder) { MonoImporter.SetExecutionOrder(script, executionOrder); } } }