From 733a7de800669d0e27820dde65954b9ccbaea0e1 Mon Sep 17 00:00:00 2001 From: Anders Ejlersen Date: Sun, 11 May 2025 15:02:40 +0200 Subject: [PATCH] Changed type lookup to use TypeCache, instead of iterating through all assemblies --- CHANGELOG.md | 6 ++ .../Utilities/ToolbarSettingsUtility.cs | 39 ++++++++++++- Editor/Toolbar/Utilities/ToolbarUtility.cs | 55 ++++++++++++++----- package.json | 2 +- 4 files changed, 85 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 28b3326..203e88e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ All notable changes to this project will be documented in this file. +## [1.11.3] - 2025-05-11 + +### Changed +- Changed type lookup to use TypeCache, instead of iterating through all assemblies + + ## [1.11.2] - 2024-11-26 ### Added diff --git a/Editor/Toolbar/Utilities/ToolbarSettingsUtility.cs b/Editor/Toolbar/Utilities/ToolbarSettingsUtility.cs index 4299214..c013108 100644 --- a/Editor/Toolbar/Utilities/ToolbarSettingsUtility.cs +++ b/Editor/Toolbar/Utilities/ToolbarSettingsUtility.cs @@ -1,8 +1,13 @@ using System; using System.Collections.Generic; -using System.Reflection; using System.Runtime.Serialization; +#if UNITY_2021_3 || UNITY_2022_2 || UNITY_6000_0_OR_NEWER +using UnityEditor; +#else +using System.Reflection; +#endif + namespace Module.NavigationTool.Editor.Toolbar { internal static class ToolbarSettingsUtility @@ -13,6 +18,21 @@ namespace Module.NavigationTool.Editor.Toolbar try { +#if UNITY_2021_3 || UNITY_2022_2 || UNITY_6000_0_OR_NEWER + var types = TypeCache.GetTypesDerivedFrom(); + + for (var i = 0; i < types.Count; i++) + { + Type type = types[i]; + + if (type.IsInterface || type.IsAbstract) + continue; + + var toolbar = (IToolbarSettings)FormatterServices.GetUninitializedObject(type); + toolbar.Initialize(); + list.Add(toolbar); + } +#else Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); Type iType = typeof(IToolbarSettings); @@ -33,6 +53,7 @@ namespace Module.NavigationTool.Editor.Toolbar list.Add(toolbar); } } +#endif list.Sort((s0, s1) => string.Compare(s0.Title, s1.Title, StringComparison.Ordinal)); } @@ -50,6 +71,21 @@ namespace Module.NavigationTool.Editor.Toolbar try { +#if UNITY_2021_3 || UNITY_2022_2 || UNITY_6000_0_OR_NEWER + var types = TypeCache.GetTypesDerivedFrom(); + + for (var i = 0; i < types.Count; i++) + { + Type type = types[i]; + + if (type.IsInterface || type.IsAbstract) + continue; + + var toolbar = (IToolbarProjectSettings)FormatterServices.GetUninitializedObject(type); + toolbar.Initialize(settings); + list.Add(toolbar); + } +#else Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); Type iType = typeof(IToolbarProjectSettings); @@ -70,6 +106,7 @@ namespace Module.NavigationTool.Editor.Toolbar list.Add(toolbar); } } +#endif list.Sort((s0, s1) => string.Compare(s0.Title, s1.Title, StringComparison.Ordinal)); } diff --git a/Editor/Toolbar/Utilities/ToolbarUtility.cs b/Editor/Toolbar/Utilities/ToolbarUtility.cs index e0d4a46..d1daf1c 100644 --- a/Editor/Toolbar/Utilities/ToolbarUtility.cs +++ b/Editor/Toolbar/Utilities/ToolbarUtility.cs @@ -5,6 +5,10 @@ using System.Reflection; using System.Runtime.Serialization; using Object = UnityEngine.Object; +#if UNITY_2021_3 || UNITY_2022_2 || UNITY_6000_0_OR_NEWER +using UnityEditor; +#endif + #if UNITY_2019_1_OR_NEWER using UnityEngine.UIElements; #else @@ -17,25 +21,26 @@ namespace Module.NavigationTool.Editor.Toolbar { private static readonly Assembly ASSEMBLY = typeof(UnityEditor.Editor).Assembly; - #if UNITY_2021_1_OR_NEWER +#if UNITY_2021_1_OR_NEWER private static ScriptableObject CURRENT_TOOLBAR; + private static VisualElement CURRENT_ROOT; private static VisualElement CURRENT_PARENT_LEFT; private static VisualElement CURRENT_PARENT_RIGHT; - private static int CURRENT_INSTANCE_ID = -1; - #endif + private static int CURRENT_INSTANCE_ID; +#endif - #if UNITY_2021_1_OR_NEWER +#if UNITY_2021_1_OR_NEWER public static void OnUpdate(Action callback) { if (CURRENT_TOOLBAR == null) CURRENT_TOOLBAR = GetToolbarObject(); - if (CURRENT_TOOLBAR != null && CURRENT_PARENT_LEFT != null && CURRENT_TOOLBAR.GetInstanceID() != CURRENT_INSTANCE_ID) + if (CURRENT_TOOLBAR != null && CURRENT_TOOLBAR.GetInstanceID() != CURRENT_INSTANCE_ID) { - CURRENT_PARENT_LEFT.RemoveFromHierarchy(); + CURRENT_PARENT_LEFT?.RemoveFromHierarchy(); CURRENT_PARENT_LEFT = null; - CURRENT_PARENT_RIGHT.RemoveFromHierarchy(); + CURRENT_PARENT_RIGHT?.RemoveFromHierarchy(); CURRENT_PARENT_RIGHT = null; CURRENT_INSTANCE_ID = CURRENT_TOOLBAR.GetInstanceID(); @@ -44,17 +49,25 @@ namespace Module.NavigationTool.Editor.Toolbar if (CURRENT_TOOLBAR == null) return; - if (CURRENT_PARENT_LEFT == null) + if (CURRENT_PARENT_LEFT == null || CURRENT_PARENT_RIGHT == null || CURRENT_ROOT == null) { + CURRENT_INSTANCE_ID = CURRENT_TOOLBAR.GetInstanceID(); + CURRENT_PARENT_LEFT?.RemoveFromHierarchy(); + CURRENT_PARENT_LEFT = null; + CURRENT_PARENT_RIGHT?.RemoveFromHierarchy(); - + CURRENT_PARENT_RIGHT = null; + FieldInfo root = CURRENT_TOOLBAR.GetType().GetField("m_Root", BindingFlags.NonPublic | BindingFlags.Instance); object rawRoot = root?.GetValue(CURRENT_TOOLBAR); - var mRoot = rawRoot as VisualElement; - - CURRENT_PARENT_LEFT = CreateParent(mRoot, "ToolbarZoneLeftAlign", true); - CURRENT_PARENT_RIGHT = CreateParent(mRoot, "ToolbarZoneRightAlign", false); + CURRENT_ROOT = rawRoot as VisualElement; + + if (CURRENT_ROOT != null) + { + CURRENT_PARENT_LEFT = CreateParent(CURRENT_ROOT, "ToolbarZoneLeftAlign", true); + CURRENT_PARENT_RIGHT = CreateParent(CURRENT_ROOT, "ToolbarZoneRightAlign", false); + } } if (CURRENT_PARENT_LEFT != null) @@ -111,7 +124,7 @@ namespace Module.NavigationTool.Editor.Toolbar parent.Add(result); return result; } - #else +#else public static void AddGuiListener(Action action) { ScriptableObject so = GetToolbarObject(); @@ -153,7 +166,7 @@ namespace Module.NavigationTool.Editor.Toolbar handler += action; fiImguiContainer.SetValue(container, handler); } - #endif +#endif private static ScriptableObject GetToolbarObject() { @@ -168,6 +181,17 @@ namespace Module.NavigationTool.Editor.Toolbar try { +#if UNITY_2021_3 || UNITY_2022_2 || UNITY_6000_0_OR_NEWER + var types = TypeCache.GetTypesDerivedFrom(); + + for (var i = 0; i < types.Count; i++) + { + Type type = types[i]; + + if (!type.IsAbstract) + list.Add((AbstractToolbarDrawer)FormatterServices.GetUninitializedObject(type)); + } +#else Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); Type iType = typeof(AbstractToolbarDrawer); @@ -184,6 +208,7 @@ namespace Module.NavigationTool.Editor.Toolbar list.Add((AbstractToolbarDrawer)FormatterServices.GetUninitializedObject(type)); } } +#endif list.Sort((t0, t1) => t0.Priority.CompareTo(t1.Priority)); } diff --git a/package.json b/package.json index ac7f4d0..e76908a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "com.module.navigationtool", - "version": "1.11.2", + "version": "1.11.3", "displayName": "Module.NavigationTool", "description": "Support for navigation tools, like favorites, history and toolbars", "unity": "2019.2",