From 690e32792137c9fd5259d74b30c8bc22b8812b2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mi=C5=82osz=20Matkowski?= Date: Thu, 13 Apr 2023 20:59:05 +0200 Subject: [PATCH 01/15] Ignore invalid Scenes while caching build settings --- .../Runtime/Serialization/SceneSerializationUtility.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Assets/Editor Toolbox/Runtime/Serialization/SceneSerializationUtility.cs b/Assets/Editor Toolbox/Runtime/Serialization/SceneSerializationUtility.cs index 730b686e..9b94a67f 100644 --- a/Assets/Editor Toolbox/Runtime/Serialization/SceneSerializationUtility.cs +++ b/Assets/Editor Toolbox/Runtime/Serialization/SceneSerializationUtility.cs @@ -43,6 +43,11 @@ private static void RefreshCache() var buildIndex = -1; foreach (var scene in EditorBuildSettings.scenes) { + if (string.IsNullOrEmpty(scene.path)) + { + continue; + } + buildIndex++; var sceneIndex = scene.enabled ? buildIndex : InvalidSceneIndex; var sceneAsset = EditorGUIUtility.Load(scene.path) as SceneAsset; From b11ae04762a577d66a928f29aad3e15b077de0f7 Mon Sep 17 00:00:00 2001 From: Grizmu Date: Sun, 11 Jun 2023 00:05:21 +0200 Subject: [PATCH 02/15] WIP Added SceneView object selector. --- Assets/Editor Toolbox/Editor/SceneView.meta | 8 + .../ToolboxEditorSceneViewObjectSelector.cs | 168 +++++++ ...olboxEditorSceneViewObjectSelector.cs.meta | 11 + .../Editor/ToolboxEditorSceneView.cs | 95 ++++ .../Editor/ToolboxEditorSceneView.cs.meta | 11 + .../Editor/ToolboxEditorSettings.cs | 57 ++- .../Editor/ToolboxEditorSettingsEditor.cs | 46 +- .../Editor Toolbox/Editor/ToolboxManager.cs | 7 + Assets/Editor Toolbox/EditorSettings.asset | 2 + Assets/Examples/Scenes/SampleScene.unity | 422 ++++++++++++++++++ 10 files changed, 822 insertions(+), 5 deletions(-) create mode 100644 Assets/Editor Toolbox/Editor/SceneView.meta create mode 100644 Assets/Editor Toolbox/Editor/SceneView/ToolboxEditorSceneViewObjectSelector.cs create mode 100644 Assets/Editor Toolbox/Editor/SceneView/ToolboxEditorSceneViewObjectSelector.cs.meta create mode 100644 Assets/Editor Toolbox/Editor/ToolboxEditorSceneView.cs create mode 100644 Assets/Editor Toolbox/Editor/ToolboxEditorSceneView.cs.meta diff --git a/Assets/Editor Toolbox/Editor/SceneView.meta b/Assets/Editor Toolbox/Editor/SceneView.meta new file mode 100644 index 00000000..d2197a22 --- /dev/null +++ b/Assets/Editor Toolbox/Editor/SceneView.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7cca29365d790494bbae22d223dc17de +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor Toolbox/Editor/SceneView/ToolboxEditorSceneViewObjectSelector.cs b/Assets/Editor Toolbox/Editor/SceneView/ToolboxEditorSceneViewObjectSelector.cs new file mode 100644 index 00000000..129a535d --- /dev/null +++ b/Assets/Editor Toolbox/Editor/SceneView/ToolboxEditorSceneViewObjectSelector.cs @@ -0,0 +1,168 @@ +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace Toolbox.Editor.SceneView +{ + public class ToolboxEditorSceneViewObjectSelector : EditorWindow + { + private List gameObjects; + private List gameObjectPaths; + + private const float sizeXPadding = 8f; + private const float sizeYPadding = 4f; + private const float sizeYspacing = 2.0f; + + private GameObject highlightedObject; + private Vector2 size; + private GUIStyle buttonStyle; + + private GameObject HighlightedObject + { + set + { + if (highlightedObject == value) + { + return; + } + + highlightedObject = value; + Selection.activeGameObject = value; + UnityEditor.SceneView.RepaintAll(); + } + } + + public static void Show(List gameObjects, Vector2 position) + { + Rect rect = new Rect(position, Vector2.one); + + ToolboxEditorSceneViewObjectSelector window = CreateInstance(); + window.wantsMouseMove = true; + window.wantsMouseEnterLeaveWindow = true; + window.gameObjects = gameObjects; + window.InitializeGameobjectPaths(); + window.CalculateSize(); + window.ShowAsDropDown(rect, window.size); + } + + private void InitializeStyle() + { + buttonStyle = new GUIStyle(GUI.skin.button); + buttonStyle.alignment = TextAnchor.MiddleLeft; + } + + private Vector2 CalculateSize() + { + if (buttonStyle == null) + { + InitializeStyle(); + } + + GUIContent content = new GUIContent(); + + size = Vector2.zero; + + foreach (string path in gameObjectPaths) + { + content.text = path; + Vector2 currentSize = buttonStyle.CalcSize(content); + if (currentSize.x > size.x) + { + size.x = currentSize.x; + } + + size.y += currentSize.y + sizeYspacing; + } + + size.x += sizeXPadding; + size.y += sizeYPadding; + + return size; + } + + private void InitializeGameobjectPaths() + { + gameObjectPaths = new List(); + Stack pathStack = new Stack(); + + for (int i = 0; i < gameObjects.Count; i++) + { + pathStack.Clear(); + Transform transf = gameObjects[i].transform; + pathStack.Push(transf.gameObject.name); + + while (transf.parent != null) + { + transf = transf.parent; + pathStack.Push(transf.gameObject.name); + } + + string path = string.Join("/", pathStack.ToArray()); + gameObjectPaths.Add(path); + } + } + + private void OnGUI() + { + if (buttonStyle == null) + { + InitializeStyle(); + } + + //Debug.Log($"Event : {Event.current.type}"); + + if (Event.current.type == EventType.MouseMove) + { + OnGUI_MouseMove(); + } + else if (Event.current.type == EventType.MouseLeaveWindow) + { + OnGUI_MouseLeave(); + } + else + { + OnGUI_Normal(); + } + } + + private void OnGUI_Normal() + { + for (int i = 0; i < gameObjects.Count; i++) + { + GameObject gameObject = gameObjects[i]; + if (GUILayout.Button(gameObjectPaths[i], buttonStyle)) + { + Selection.activeGameObject = gameObject; + Event.current.Use(); + Close(); + } + } + } + + private void OnGUI_MouseMove() + { + for (int i = 0; i < gameObjects.Count; i++) + { + GameObject gameObject = gameObjects[i]; + if (GUILayout.Button(gameObjectPaths[i], buttonStyle)) + { + Selection.activeGameObject = gameObject; + Event.current.Use(); + Close(); + } + + Rect lastRect = GUILayoutUtility.GetLastRect(); + + if (lastRect.Contains(Event.current.mousePosition)) + { + HighlightedObject = gameObject; + } + } + } + + private void OnGUI_MouseLeave() + { + HighlightedObject = null; + } + } +} \ No newline at end of file diff --git a/Assets/Editor Toolbox/Editor/SceneView/ToolboxEditorSceneViewObjectSelector.cs.meta b/Assets/Editor Toolbox/Editor/SceneView/ToolboxEditorSceneViewObjectSelector.cs.meta new file mode 100644 index 00000000..30c05240 --- /dev/null +++ b/Assets/Editor Toolbox/Editor/SceneView/ToolboxEditorSceneViewObjectSelector.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 23e85c8e0f6e08041a82bda7b21fdea1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor Toolbox/Editor/ToolboxEditorSceneView.cs b/Assets/Editor Toolbox/Editor/ToolboxEditorSceneView.cs new file mode 100644 index 00000000..af2471a9 --- /dev/null +++ b/Assets/Editor Toolbox/Editor/ToolboxEditorSceneView.cs @@ -0,0 +1,95 @@ +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace Toolbox.Editor +{ + using Toolbox.Editor.SceneView; + + [InitializeOnLoad] + public static class ToolboxEditorSceneView + { + static ToolboxEditorSceneView() + { + UpdateEventCallback(); + } + + private static List GetObjectsUnderCursor() + { + List hitObjects = new List(); + GameObject[] hitObjectsArray; + + int maxIterations = 50; + for (int i = 0; i < maxIterations; i++) + { + hitObjectsArray = hitObjects.ToArray(); + + GameObject go = HandleUtility.PickGameObject(Event.current.mousePosition, true, hitObjectsArray); + if (go == null) + { + break; + } + + hitObjects.Add(go); + } + + return hitObjects; + } + + private static void UpdateEventCallback() + { + if (UseToolboxSceneView && !IsEventAttached) + { + UnityEditor.SceneView.duringSceneGui += SceneView_DuringSceneGUI; + IsEventAttached = true; + } + else if (!UseToolboxSceneView && IsEventAttached) + { + UnityEditor.SceneView.duringSceneGui -= SceneView_DuringSceneGUI; + IsEventAttached = false; + } + } + + private static void SceneView_DuringSceneGUI(UnityEditor.SceneView sceneView) + { + if (Event.current.type == EventType.KeyDown + && Event.current.keyCode == SelectorKey) + { + List objectsUnderCursor = GetObjectsUnderCursor(); + if (objectsUnderCursor.Count > 0) + { + ToolboxEditorSceneViewObjectSelector.Show(objectsUnderCursor, Event.current.mousePosition + sceneView.position.position); + } + } + } + + internal static void UpdateSettings(IToolboxSceneViewSettings settings) + { + if (settings == null) + { + UseToolboxSceneView = true; + SelectorKey = KeyCode.LeftControl; + } + else + { + UseToolboxSceneView = settings.UseToolboxSceneView; + SelectorKey = settings.SelectorKey; + } + + UpdateEventCallback(); + } + + private static bool IsEventAttached { get; set; } = false; + + /// + /// Should the scene view be used. + /// + private static bool UseToolboxSceneView { get; set; } = true; + + /// + /// Which key should activate the scene view. + /// + private static KeyCode SelectorKey { get; set; } = KeyCode.LeftControl; + + } +} diff --git a/Assets/Editor Toolbox/Editor/ToolboxEditorSceneView.cs.meta b/Assets/Editor Toolbox/Editor/ToolboxEditorSceneView.cs.meta new file mode 100644 index 00000000..86f8da28 --- /dev/null +++ b/Assets/Editor Toolbox/Editor/ToolboxEditorSceneView.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: baf6be454a6d71f4b9ec44e48e6b0df2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor Toolbox/Editor/ToolboxEditorSettings.cs b/Assets/Editor Toolbox/Editor/ToolboxEditorSettings.cs index 61fc1c38..0adaa53f 100644 --- a/Assets/Editor Toolbox/Editor/ToolboxEditorSettings.cs +++ b/Assets/Editor Toolbox/Editor/ToolboxEditorSettings.cs @@ -52,8 +52,15 @@ internal interface IToolboxInspectorSettings List TargetTypeDrawerHandlers { get; } } + internal interface IToolboxSceneViewSettings + { + bool UseToolboxSceneView { get; } + + KeyCode SelectorKey { get; } + } + [CreateAssetMenu(fileName = "Editor Toolbox Settings", menuName = "Editor Toolbox/Settings")] - internal class ToolboxEditorSettings : ScriptableObject, IToolboxGeneralSettings, IToolboxHierarchySettings, IToolboxProjectSettings, IToolboxInspectorSettings + internal class ToolboxEditorSettings : ScriptableObject, IToolboxGeneralSettings, IToolboxHierarchySettings, IToolboxProjectSettings, IToolboxInspectorSettings, IToolboxSceneViewSettings { [SerializeField] private bool useToolboxHierarchy = true; @@ -82,6 +89,12 @@ internal class ToolboxEditorSettings : ScriptableObject, IToolboxGeneralSettings [SerializeField, ReorderableList(ListStyle.Boxed)] private List customFolders = new List(); + [SerializeField] + private bool useToolboxScene = true; + + [SerializeField] + private KeyCode selectorKey = KeyCode.LeftControl; + [SerializeField, Tooltip("Set to false if you don't want to use Toolbox attributes and related features.")] private bool useToolboxDrawers = true; [SerializeField, Tooltip("By default, Inspectors will use the built-in version of the list instead of the Toolbox-based one. " + @@ -103,11 +116,12 @@ internal class ToolboxEditorSettings : ScriptableObject, IToolboxGeneralSettings private bool hierarchySettingsDirty; private bool projectSettingsDirty; private bool inspectorSettingsDirty; + private bool sceneSettingsDirty; internal event Action OnHierarchySettingsChanged; internal event Action OnProjectSettingsChanged; internal event Action OnInspectorSettingsChanged; - + internal event Action OnSceneViewSettingsChanged; #region Methods: Internal/data validation @@ -122,7 +136,7 @@ internal void SetHierarchySettingsDirty() /// /// Forces Project settings validation in the next call. /// - internal void SetProjectSettingsDirty() + internal void SetSceneViewSettingsDirty() { projectSettingsDirty = true; } @@ -135,6 +149,13 @@ internal void SetInspectorSettingsDirty() inspectorSettingsDirty = true; } + /// + /// Forces Scene settings validation in the next call. + /// + internal void SetSceneSettingsDirty() + { + sceneSettingsDirty = true; + } internal void ValidateHierarchySettings() { @@ -151,11 +172,17 @@ internal void ValidateInspectorSettings() OnInspectorSettingsChanged?.Invoke(this); } + internal void ValidateSceneSettings() + { + OnSceneViewSettingsChanged?.Invoke(this); + } + internal void Validate() { ValidateHierarchySettings(); ValidateProjectSettings(); ValidateInspectorSettings(); + ValidateSceneSettings(); } @@ -183,6 +210,11 @@ private void OnValidate() { ValidateInspectorSettings(); } + + if (sceneSettingsDirty) + { + ValidateSceneSettings(); + } } else { @@ -206,6 +238,7 @@ public void Reset() ResetHierarchySettings(); ResetProjectSettings(); ResetInspectorSettings(); + ResetSceneSettings(); } public void ResetHierarchySettings() @@ -233,6 +266,12 @@ public void ResetInspectorSettings() SetAllPossibleTargetTypeDrawers(); } + public void ResetSceneSettings() + { + UseToolboxSceneView = true; + SelectorKey = KeyCode.LeftControl; + } + public void SetAllPossibleDecoratorDrawers() { decoratorDrawerHandlers.Clear(); @@ -355,6 +394,18 @@ public List CustomFolders set => customFolders = value; } + public bool UseToolboxSceneView + { + get => useToolboxScene; + set => useToolboxScene = value; + } + + public KeyCode SelectorKey + { + get => selectorKey; + set => selectorKey = value; + } + public bool UseToolboxDrawers { get => useToolboxDrawers; diff --git a/Assets/Editor Toolbox/Editor/ToolboxEditorSettingsEditor.cs b/Assets/Editor Toolbox/Editor/ToolboxEditorSettingsEditor.cs index f68079a2..f5c84be0 100644 --- a/Assets/Editor Toolbox/Editor/ToolboxEditorSettingsEditor.cs +++ b/Assets/Editor Toolbox/Editor/ToolboxEditorSettingsEditor.cs @@ -18,6 +18,7 @@ internal class ToolboxEditorSettingsEditor : ToolboxEditor private AnimBool hierarchyAnimBool; private AnimBool projectAnimBool; private AnimBool inspectorAnimBool; + private AnimBool sceneViewAnimBool; private int enabledToShowDrawerType; @@ -31,6 +32,8 @@ internal class ToolboxEditorSettingsEditor : ToolboxEditor private SerializedProperty smallIconScaleProperty; private SerializedProperty largeIconPaddingProperty; private SerializedProperty smallIconPaddingProperty; + private SerializedProperty useToolboxSceneViewProperty; + private SerializedProperty selectorKeyProperty; private ReorderableListBase rowDataItemsList; private ReorderableListBase customFoldersList; @@ -50,6 +53,7 @@ private void OnEnable() hierarchyAnimBool = new AnimBool(ToolboxPrefs.GetBool(nameof(ToolboxEditorSettings), "HierarchyEnabled")); projectAnimBool = new AnimBool(ToolboxPrefs.GetBool(nameof(ToolboxEditorSettings), "ProjectEnabled")); inspectorAnimBool = new AnimBool(ToolboxPrefs.GetBool(nameof(ToolboxEditorSettings), "InspectorEnabled")); + sceneViewAnimBool = new AnimBool(ToolboxPrefs.GetBool(nameof(ToolboxEditorSettings), "SceneViewEnabled")); enabledToShowDrawerType = ToolboxPrefs.GetInt(nameof(ToolboxEditorSettings), "PickedDrawerType"); @@ -63,6 +67,7 @@ private void OnEnable() hierarchyAnimBool.valueChanged.AddListener(repaintAction); projectAnimBool.valueChanged.AddListener(repaintAction); inspectorAnimBool.valueChanged.AddListener(repaintAction); + sceneViewAnimBool.valueChanged.AddListener(repaintAction); //hierarchy-related properties useToolboxHierarchyProperty = serializedObject.FindProperty("useToolboxHierarchy"); @@ -127,6 +132,11 @@ private void OnEnable() "", "" }; + + //SceneView-related properties + useToolboxSceneViewProperty = serializedObject.FindProperty("useToolboxSceneView"); + selectorKeyProperty = serializedObject.FindProperty("selectorKey"); + } private void OnDisable() @@ -250,7 +260,7 @@ private void DrawProjectSettings() EditorGUILayout.Space(); if (EditorGUI.EndChangeCheck()) { - currentTarget.SetProjectSettingsDirty(); + currentTarget.SetSceneViewSettingsDirty(); } EditorGUI.indentLevel--; @@ -334,6 +344,26 @@ private void DrawInspectorSettings() EditorGUI.indentLevel--; } + private void DrawSceneViewSettings() + { + EditorGUI.indentLevel++; + EditorGUI.BeginChangeCheck(); + EditorGUILayout.Space(); + EditorGUILayout.PropertyField(useToolboxDrawersProperty); + EditorGUILayout.Space(); + + EditorGUI.BeginDisabledGroup(!useToolboxDrawersProperty.boolValue); + EditorGUILayout.PropertyField(selectorKeyProperty); + EditorGUI.EndDisabledGroup(); + + if (EditorGUI.EndChangeCheck()) + { + currentTarget.SetSceneViewSettingsDirty(); + } + + EditorGUI.indentLevel--; + } + private void ApplyAllDrawers() { Undo.RecordObject(target, "Assign Drawers"); @@ -425,10 +455,20 @@ public override void DrawCustomInspector() } } + GUILayout.Space(EditorGUIUtility.standardVerticalSpacing); + //handle inspector settings section + sceneViewAnimBool.target = DrawHeaderFoldout(sceneViewAnimBool.target, Style.sceneViewSettingsContent, true, Style.sectionHeaderStyle, Style.headersGroupStyle); + using (var group = new EditorGUILayout.FadeGroupScope(sceneViewAnimBool.faded)) + { + if (group.visible) + { + DrawSceneViewSettings(); + } + } + serializedObject.ApplyModifiedProperties(); } - internal static class Style { internal static readonly GUIStyle headersGroupStyle; @@ -451,6 +491,8 @@ internal static class Style EditorGUIUtility.IconContent("Project").image); internal static readonly GUIContent inspectorSettingsContent = new GUIContent("Inspector", EditorGUIUtility.IconContent("UnityEditor.InspectorWindow").image); + internal static readonly GUIContent sceneViewSettingsContent = new GUIContent("SceneView", + EditorGUIUtility.IconContent("UnityEditor.SceneView").image); internal static readonly GUILayoutOption[] resetButtonOptions = new GUILayoutOption[] { diff --git a/Assets/Editor Toolbox/Editor/ToolboxManager.cs b/Assets/Editor Toolbox/Editor/ToolboxManager.cs index 2b327b3d..4a88b1a8 100644 --- a/Assets/Editor Toolbox/Editor/ToolboxManager.cs +++ b/Assets/Editor Toolbox/Editor/ToolboxManager.cs @@ -19,6 +19,7 @@ private static void ForceModulesUpdate() ManageInspectorCore(Settings); ManageProjectCore(Settings); ManageHierarchyCore(Settings); + ManageSceneViewCore(Settings); } private static void ManageInspectorCore(IToolboxInspectorSettings settings) @@ -82,6 +83,11 @@ private static void ManageHierarchyCore(IToolboxHierarchySettings settings) ToolboxEditorHierarchy.RepaintHierarchyOverlay(); } + private static void ManageSceneViewCore(IToolboxSceneViewSettings settings) + { + ToolboxEditorSceneView.UpdateSettings(settings); + } + [InitializeOnLoadMethod] internal static bool InitializeSettings() @@ -122,6 +128,7 @@ internal static bool InitializeSettings(string settingsGuid) Settings.OnHierarchySettingsChanged += ManageHierarchyCore; Settings.OnProjectSettingsChanged += ManageProjectCore; Settings.OnInspectorSettingsChanged += ManageInspectorCore; + Settings.OnSceneViewSettingsChanged += ManageSceneViewCore; //initialize core functionalities Settings.Validate(); return true; diff --git a/Assets/Editor Toolbox/EditorSettings.asset b/Assets/Editor Toolbox/EditorSettings.asset index 3fba6090..7dde179d 100644 --- a/Assets/Editor Toolbox/EditorSettings.asset +++ b/Assets/Editor Toolbox/EditorSettings.asset @@ -46,6 +46,8 @@ MonoBehaviour: largeIcon: {fileID: 2800000, guid: 6315862a85e61a44e947fbd4b1b23e11, type: 3} smallIcon: {fileID: 2800000, guid: e99d63b63394eba4aaf10385704d0ef3, type: 3} iconName: + useToolboxScene: 1 + selectorKey: 306 useToolboxDrawers: 1 forceDefaultLists: 0 decoratorDrawerHandlers: diff --git a/Assets/Examples/Scenes/SampleScene.unity b/Assets/Examples/Scenes/SampleScene.unity index a220f5cc..67b4dcab 100644 --- a/Assets/Examples/Scenes/SampleScene.unity +++ b/Assets/Examples/Scenes/SampleScene.unity @@ -397,6 +397,101 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &580334316 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 580334320} + - component: {fileID: 580334319} + - component: {fileID: 580334318} + - component: {fileID: 580334317} + m_Layer: 0 + m_Name: SelectionCube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!65 &580334317 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 580334316} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &580334318 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 580334316} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &580334319 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 580334316} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &580334320 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 580334316} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -7.59, y: -2.12, z: 0.53} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 22 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &661896457 GameObject: m_ObjectHideFlags: 0 @@ -488,6 +583,81 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 7 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &663659267 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 663659268} + - component: {fileID: 663659270} + - component: {fileID: 663659269} + m_Layer: 5 + m_Name: Panel-B + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &663659268 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 663659267} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 941031098} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 200, y: 200} + m_Pivot: {x: 0, y: 0} +--- !u!114 &663659269 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 663659267} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 1, b: 0.15642643, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &663659270 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 663659267} + m_CullTransparentMesh: 1 --- !u!1 &666544666 GameObject: m_ObjectHideFlags: 0 @@ -548,6 +718,81 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 21 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &704298044 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 704298045} + - component: {fileID: 704298047} + - component: {fileID: 704298046} + m_Layer: 5 + m_Name: Panel-C + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &704298045 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 704298044} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 941031098} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 300, y: 300} + m_Pivot: {x: 1, y: 1} +--- !u!114 &704298046 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 704298044} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0.95602536, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &704298047 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 704298044} + m_CullTransparentMesh: 1 --- !u!1 &752799891 GameObject: m_ObjectHideFlags: 0 @@ -656,6 +901,83 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 19 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &941031097 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 941031098} + - component: {fileID: 941031100} + - component: {fileID: 941031099} + m_Layer: 5 + m_Name: Panel-A + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &941031098 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 941031097} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 704298045} + - {fileID: 663659268} + m_Father: {fileID: 1245694416} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 100, y: 100} + m_SizeDelta: {x: 400, y: 400} + m_Pivot: {x: 0, y: 0} +--- !u!114 &941031099 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 941031097} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &941031100 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 941031097} + m_CullTransparentMesh: 1 --- !u!1 &959025297 GameObject: m_ObjectHideFlags: 0 @@ -1016,6 +1338,106 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 17 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1245694412 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1245694416} + - component: {fileID: 1245694415} + - component: {fileID: 1245694414} + - component: {fileID: 1245694413} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1245694413 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1245694412} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1245694414 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1245694412} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &1245694415 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1245694412} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 1 + m_Camera: {fileID: 534669904} + m_PlaneDistance: 10 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &1245694416 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1245694412} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 941031098} + m_Father: {fileID: 0} + m_RootOrder: 23 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} --- !u!1 &1414023086 GameObject: m_ObjectHideFlags: 0 From 8394ec2a7435441e501d1d88c85fe437a23bb15f Mon Sep 17 00:00:00 2001 From: Grizmu Date: Wed, 14 Jun 2023 01:30:32 +0200 Subject: [PATCH 03/15] Finalized the scene selector. --- .../ToolboxEditorSceneViewObjectSelector.cs | 220 ++++++++++++++++-- .../Editor/ToolboxEditorSettings.cs | 22 +- .../Editor/ToolboxEditorSettingsEditor.cs | 7 +- .../Editor Toolbox/Editor/ToolboxManager.cs | 1 - 4 files changed, 212 insertions(+), 38 deletions(-) diff --git a/Assets/Editor Toolbox/Editor/SceneView/ToolboxEditorSceneViewObjectSelector.cs b/Assets/Editor Toolbox/Editor/SceneView/ToolboxEditorSceneViewObjectSelector.cs index 129a535d..4045ec83 100644 --- a/Assets/Editor Toolbox/Editor/SceneView/ToolboxEditorSceneViewObjectSelector.cs +++ b/Assets/Editor Toolbox/Editor/SceneView/ToolboxEditorSceneViewObjectSelector.cs @@ -9,13 +9,21 @@ public class ToolboxEditorSceneViewObjectSelector : EditorWindow private List gameObjects; private List gameObjectPaths; - private const float sizeXPadding = 8f; - private const float sizeYPadding = 4f; - private const float sizeYspacing = 2.0f; + private const float sizeXPadding = 2f; + private const float sizeYPadding = 2f; + private const float buttonYSpacing = 0.0f; + private const float buttonYSize = 20f; + private const float sizeXOffset = -30f; private GameObject highlightedObject; private Vector2 size; + private Vector2 buttonSize; private GUIStyle buttonStyle; + private Color selectionColor = new Color(0.50f, 0.70f, 1.00f); + + private int shiftMinSelectionID = -1; + private int shiftMaxSelectionID = -1; + private int shiftLastID = -1; private GameObject HighlightedObject { @@ -27,8 +35,12 @@ private GameObject HighlightedObject } highlightedObject = value; - Selection.activeGameObject = value; UnityEditor.SceneView.RepaintAll(); + + if (highlightedObject != null) + { + EditorGUIUtility.PingObject(highlightedObject); + } } } @@ -58,24 +70,26 @@ private Vector2 CalculateSize() InitializeStyle(); } - GUIContent content = new GUIContent(); - size = Vector2.zero; - foreach (string path in gameObjectPaths) + foreach (GameObject go in gameObjects) { - content.text = path; + GUIContent content = EditorGUIUtility.ObjectContent(go, typeof(GameObject)); Vector2 currentSize = buttonStyle.CalcSize(content); if (currentSize.x > size.x) { size.x = currentSize.x; } - - size.y += currentSize.y + sizeYspacing; } - size.x += sizeXPadding; - size.y += sizeYPadding; + //This is needed because CalcSize calculates content drawing with icon at full size. + size.x += sizeXOffset; + + buttonSize.x = size.x; + buttonSize.y = buttonYSize; + + size.y = gameObjects.Count * buttonYSize + sizeYPadding * 2.0f + buttonYSpacing * gameObjects.Count - 1; + size.x += sizeXPadding * 2.0f; return size; } @@ -109,6 +123,11 @@ private void OnGUI() InitializeStyle(); } + if (Event.current.type == EventType.Layout) + { + return; + } + //Debug.Log($"Event : {Event.current.type}"); if (Event.current.type == EventType.MouseMove) @@ -127,37 +146,194 @@ private void OnGUI() private void OnGUI_Normal() { + Rect rect = new Rect(sizeXPadding, sizeYPadding, buttonSize.x, buttonSize.y); + for (int i = 0; i < gameObjects.Count; i++) { GameObject gameObject = gameObjects[i]; - if (GUILayout.Button(gameObjectPaths[i], buttonStyle)) + + if(gameObject == null) { - Selection.activeGameObject = gameObject; - Event.current.Use(); - Close(); + //Can happen when something removes the gameobject during the window display. + continue; } + + GUIContent content = EditorGUIUtility.ObjectContent(gameObject, typeof(GameObject)); + + bool objectSelected = Selection.Contains(gameObject); + + if (objectSelected) + { + GUI.backgroundColor = selectionColor; + } + + if (GUI.Button(rect, content, buttonStyle)) + { + GameObjectButtonPress(i); + } + + GUI.backgroundColor = Color.white; + + rect.y += buttonYSize + buttonYSpacing; } } private void OnGUI_MouseMove() { + Rect rect = new Rect(sizeXPadding, sizeYPadding, buttonSize.x, buttonSize.y); + for (int i = 0; i < gameObjects.Count; i++) { GameObject gameObject = gameObjects[i]; - if (GUILayout.Button(gameObjectPaths[i], buttonStyle)) + + if (gameObject == null) { - Selection.activeGameObject = gameObject; - Event.current.Use(); - Close(); + //Can happen when something removes the gameobject during the window display. + continue; } - Rect lastRect = GUILayoutUtility.GetLastRect(); + GUIContent content = EditorGUIUtility.ObjectContent(gameObject, typeof(GameObject)); - if (lastRect.Contains(Event.current.mousePosition)) + GUI.Button(rect, content, buttonStyle); + + if (rect.Contains(Event.current.mousePosition)) { HighlightedObject = gameObject; } + + rect.y += buttonYSize + buttonYSpacing; + } + } + + private void GameObjectButtonPress(int id) + { + SelectObject(id, Event.current.control, Event.current.shift); + + if (Event.current.control || Event.current.shift) + { + return; + } + + Close(); + } + + private void UpdateShiftSelectionIDs(int id) + { + if(shiftLastID == -1) + { + shiftLastID = id; + } + + if(shiftMinSelectionID == -1) + { + shiftMinSelectionID = id; + } + + if (shiftMaxSelectionID == -1) + { + shiftMaxSelectionID = id; + } + + if(id < shiftMinSelectionID) + { + shiftMinSelectionID = id; } + else if(id >= shiftMaxSelectionID) + { + shiftMaxSelectionID = id; + } + else if(id > shiftMinSelectionID) + { + //ID is between min and max. + if(shiftLastID < id) + { + shiftMaxSelectionID = id; + } + else + { + shiftMinSelectionID = id; + } + } + + shiftLastID = id; + } + + private void SelectObject(int id, bool control, bool shift) + { + GameObject gameObject = gameObjects[id]; + + if (shift) + { + UpdateShiftSelectionIDs(id); + SelectObjects(shiftMinSelectionID, shiftMaxSelectionID); + } + else if (control) + { + UpdateShiftSelectionIDs(id); + + if (Selection.Contains(gameObject)) + { + //Deselect + RemoveObjectFromSelection(gameObject); + } + else + { + //Select + AddObjectToSelection(gameObject); + } + } + else + { + Selection.objects = new Object[] { gameObject }; + } + } + + private void SelectObjects(int minID, int maxID) + { + int size = maxID - minID + 1; + Object[] newSelection = new Object[size]; + + int index = 0; + + for (int i = minID; i <= maxID; i++) + { + newSelection[index] = gameObjects[i]; + index++; + } + + Selection.objects = newSelection; + } + + private void AddObjectToSelection(GameObject gameObject) + { + Object[] currentSelection = Selection.objects; + Object[] newSelection = new Object[currentSelection.Length + 1]; + + currentSelection.CopyTo(newSelection, 0); + newSelection[newSelection.Length - 1] = gameObject; + + Selection.objects = newSelection; + } + + private void RemoveObjectFromSelection(GameObject gameObject) + { + Object[] currentSelection = Selection.objects; + Object[] newSelection = new Object[currentSelection.Length - 1]; + + int index = 0; + + for (int i = 0; i < currentSelection.Length; i++) + { + if (currentSelection[i] == gameObject) + { + continue; + } + + newSelection[index] = currentSelection[i]; + index++; + } + + Selection.objects = newSelection; } private void OnGUI_MouseLeave() diff --git a/Assets/Editor Toolbox/Editor/ToolboxEditorSettings.cs b/Assets/Editor Toolbox/Editor/ToolboxEditorSettings.cs index 0adaa53f..c0145382 100644 --- a/Assets/Editor Toolbox/Editor/ToolboxEditorSettings.cs +++ b/Assets/Editor Toolbox/Editor/ToolboxEditorSettings.cs @@ -90,7 +90,7 @@ internal class ToolboxEditorSettings : ScriptableObject, IToolboxGeneralSettings private List customFolders = new List(); [SerializeField] - private bool useToolboxScene = true; + private bool useToolboxSceneView = true; [SerializeField] private KeyCode selectorKey = KeyCode.LeftControl; @@ -116,7 +116,7 @@ internal class ToolboxEditorSettings : ScriptableObject, IToolboxGeneralSettings private bool hierarchySettingsDirty; private bool projectSettingsDirty; private bool inspectorSettingsDirty; - private bool sceneSettingsDirty; + private bool sceneViewSettingsDirty; internal event Action OnHierarchySettingsChanged; internal event Action OnProjectSettingsChanged; @@ -136,7 +136,7 @@ internal void SetHierarchySettingsDirty() /// /// Forces Project settings validation in the next call. /// - internal void SetSceneViewSettingsDirty() + internal void SetProjectSettingsDirty() { projectSettingsDirty = true; } @@ -152,9 +152,9 @@ internal void SetInspectorSettingsDirty() /// /// Forces Scene settings validation in the next call. /// - internal void SetSceneSettingsDirty() + internal void SetSceneViewSettingsDirty() { - sceneSettingsDirty = true; + sceneViewSettingsDirty = true; } internal void ValidateHierarchySettings() @@ -172,7 +172,7 @@ internal void ValidateInspectorSettings() OnInspectorSettingsChanged?.Invoke(this); } - internal void ValidateSceneSettings() + internal void ValidateSceneViewSettings() { OnSceneViewSettingsChanged?.Invoke(this); } @@ -182,7 +182,7 @@ internal void Validate() ValidateHierarchySettings(); ValidateProjectSettings(); ValidateInspectorSettings(); - ValidateSceneSettings(); + ValidateSceneViewSettings(); } @@ -211,9 +211,9 @@ private void OnValidate() ValidateInspectorSettings(); } - if (sceneSettingsDirty) + if (sceneViewSettingsDirty) { - ValidateSceneSettings(); + ValidateSceneViewSettings(); } } else @@ -396,8 +396,8 @@ public List CustomFolders public bool UseToolboxSceneView { - get => useToolboxScene; - set => useToolboxScene = value; + get => useToolboxSceneView; + set => useToolboxSceneView = value; } public KeyCode SelectorKey diff --git a/Assets/Editor Toolbox/Editor/ToolboxEditorSettingsEditor.cs b/Assets/Editor Toolbox/Editor/ToolboxEditorSettingsEditor.cs index f5c84be0..280253de 100644 --- a/Assets/Editor Toolbox/Editor/ToolboxEditorSettingsEditor.cs +++ b/Assets/Editor Toolbox/Editor/ToolboxEditorSettingsEditor.cs @@ -136,7 +136,6 @@ private void OnEnable() //SceneView-related properties useToolboxSceneViewProperty = serializedObject.FindProperty("useToolboxSceneView"); selectorKeyProperty = serializedObject.FindProperty("selectorKey"); - } private void OnDisable() @@ -260,7 +259,7 @@ private void DrawProjectSettings() EditorGUILayout.Space(); if (EditorGUI.EndChangeCheck()) { - currentTarget.SetSceneViewSettingsDirty(); + currentTarget.SetProjectSettingsDirty(); } EditorGUI.indentLevel--; @@ -349,10 +348,10 @@ private void DrawSceneViewSettings() EditorGUI.indentLevel++; EditorGUI.BeginChangeCheck(); EditorGUILayout.Space(); - EditorGUILayout.PropertyField(useToolboxDrawersProperty); + EditorGUILayout.PropertyField(useToolboxSceneViewProperty); EditorGUILayout.Space(); - EditorGUI.BeginDisabledGroup(!useToolboxDrawersProperty.boolValue); + EditorGUI.BeginDisabledGroup(!useToolboxSceneViewProperty.boolValue); EditorGUILayout.PropertyField(selectorKeyProperty); EditorGUI.EndDisabledGroup(); diff --git a/Assets/Editor Toolbox/Editor/ToolboxManager.cs b/Assets/Editor Toolbox/Editor/ToolboxManager.cs index 4a88b1a8..413ea350 100644 --- a/Assets/Editor Toolbox/Editor/ToolboxManager.cs +++ b/Assets/Editor Toolbox/Editor/ToolboxManager.cs @@ -12,7 +12,6 @@ internal static class ToolboxManager private static Editor globalSettingsEditor; - private static void ForceModulesUpdate() { //perform separated modules update From 5cb451430aa1043120c9dab2bdeec2b97d5a4fe1 Mon Sep 17 00:00:00 2001 From: Grizmu Date: Wed, 14 Jun 2023 01:48:01 +0200 Subject: [PATCH 04/15] Updated settings. Updated documentation. --- Assets/Editor Toolbox/EditorSettings.asset | 2 +- Docs/sceneview.png | Bin 0 -> 11305 bytes README.md | 13 +++++++++++-- 3 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 Docs/sceneview.png diff --git a/Assets/Editor Toolbox/EditorSettings.asset b/Assets/Editor Toolbox/EditorSettings.asset index 7dde179d..ada24212 100644 --- a/Assets/Editor Toolbox/EditorSettings.asset +++ b/Assets/Editor Toolbox/EditorSettings.asset @@ -46,7 +46,7 @@ MonoBehaviour: largeIcon: {fileID: 2800000, guid: 6315862a85e61a44e947fbd4b1b23e11, type: 3} smallIcon: {fileID: 2800000, guid: e99d63b63394eba4aaf10385704d0ef3, type: 3} iconName: - useToolboxScene: 1 + useToolboxSceneView: 1 selectorKey: 306 useToolboxDrawers: 1 forceDefaultLists: 0 diff --git a/Docs/sceneview.png b/Docs/sceneview.png new file mode 100644 index 0000000000000000000000000000000000000000..a98398a1fc8020231bbc1ed91aab644eea51d863 GIT binary patch literal 11305 zcmY+q1z42d6F&+_F1;+>AuJ%>2omlBN-iPYEiH}GQcHsfOS5!HOE=OWf*>GEOG-$$ z-1YnW|L=Y7v(MIf&&-)KGoLv#^S&`!8p^}~IsgU+2Js6Oh&BcW=D*)l__*j#QRrPV z`U}%jTUimK`YXdO`VY3fg1Q0*MqMJ|oh1(XKY_c7p(h3gN&mk$=8#*N4F(2p*9(Y( zuAkXK4uKct9AaBaHWl$Ku+2W@&<~ZG`hxjw_SuNkF3nJ#2ZO+iA&m}#4i;7dR{0S0 zi!ddL44Cx|P6kwbVrA~K;kRNvH0X!f5f<;#Vc8MVtoF4?WGVFw;kFlCeA`lU)_Ga6 zr`K7b@9q8dXs5H{wz^`ueMNJnQ}411HZd^)vZ0a?o0`9YerWJ-=Ojc-xBFn5w5qLc zuYC2v5`aezDvdgtjWTs`K0SWUUAw0|vXNt&>krbP)}3{; z(Yqe6hJee?qljW>x8s%P$DUYZebdJ`ZLb>eYGO#VX;P!sMldyt z`@K%cSWqO~zx&1{l_`{Z0JVqn;d^s}tY5qm5@4-ipH3AqhHVBC;pG9_FDYHDiqVOr zzP;UGsw~?Sy}<7PzZ~6$eI1-Y^AY7Kx3Qp7t~kkTKog|00=9a@=qO7SY6dLh(ULeU zzq>#W#AGQ{zwDm~Xvjg2Sp?y{U8N)bBb}jV>3828rnU+dDyYbmb&nsc>Cr1*8(O&x zM~iwFMu#Sy;#5(nc*(9Zw8@ETG|hFLWbvI0!8nD%K6ZO(hR3Yj+9hxkN?*3Z=6c0O*CY1?TiYg z8u$h}B}Py0i#H}V+0ghw?f~22-kO4__8E__*PaC78G%x_ce%G<{Vxk=TVf6AQ1)aF zFq;j~De54-c2TT+jjn8vd3~Uce;zs9#J%+tocAioo4s8#l|fX=wVjg&z2t)Uz#S7$ zNz;Qj1$vx@FJ_fuzjr)>u%U#U@7XmkEBxXi=lQmY2fwkB2#_ykpXD1eNoRa2V?0Ci zi<^&DC>eB!d1#uCUche5VVz)oyKIf13aqUzBoW(xq=feZr2(BeceCaWzASd8oiM!n z+krN26*yZ>D9=Xp8A)|jmUA(I5X|erkwLxnlFM0Yf(&t`CVD7bQC*NgtlRD332#Mf zLt-YUe<>kQG&$h!z1{1ZKl)zF^KK2cg$avCotz?ZqmGk>9Ukoy(+WajgvAQt3Ys&c=ym2P`<7%=j`yc`| zG>A27DBFAGmaD8oJ&}*x;}#7J;-08PXnsEb?5y=Rlv!tdVm-;-_VHq5JEJyeC-TYt zSwNf1@5F@@*yGvTG6HdSsL*(kcQMxSyDWv^XPaJX`E}~8q6JOSob(IIhO^Gefuf?~ zwY|9{r%tc2Ld{Hv|0PsG=vbpgWaS#sf{)Z>LeBc)%zer@&GA|hW?NV$JSZNssfHR{$O z1rq{OF$O0Zb#)}aWa`Kc61XM#yi?c03;L$~evIDXFjaq=nDGI$%QBUMPg(_@PJytA)1T2T zC|4#2J{c|T+q24iCDcF6Fj`*H^)WMZ<3DCY`J1lAiaT+2X{T`j1O=4s2mQhj5Bse_rfREqgszEHnw{RqsVl@|ulpMdJJ2cV zy$SxBM&TGM)FT~pkQX=p;2?Oo;6|dRpo1~}n;hzkIj3GRc~d@M@!BDb1(3iO;bnMh z(B{6u(B|MRW%|?Xxtxm&GOy-!srkjH;w;?eTCP-X!Mu&zxx7hX2QOLahe?Cik{*1N zE8euGu!q1V5)wVS1v=-20959$II@VN6q>Dyzja>cro|p{3ldrUDDiZDlc!nyhZXr_ zM!$C}E;hZ?HGP#DNHxe}T1qzYoEcxiiiI2x3|s1h*b~%M**;)vgDCLa3Xh$tiw%uk z3nG5k6c*oilXdfoFF|ygwzdCOW3~Ca3El4{0NZXfp0hk1+v!vHbnu!qX=}8`ylb6BAU=h z4!j_la3ekVjoS0Cum-SPvTij?@rj-P7hC3A;?RBJ`o!K=(SQktwxXrsXGZk9_Bo%< z#=6ex6CudeQ9B^*7bs^-y@p5oGxb0CAHYfKqMxp%I$wFZs$uYT|1Lq2;yOGy*$U|@ zaIhO*kaHykia3mmKWBO5xud*v8oytdTkUKr{voicfeJe?*p=M%P42Fhcj(4y{tY5K0_u6e!|d{5V}9H={GzE#BbvMqH=yho2@zPukr3RQYJE1&Ha& zXRq3|r*-+zq~{o~pvlo*I98u;r>`GgmY-{i#P3^QxL-`E==;(v3}uRW^+&4jXXSkw z-#?sMkET%s1=&;3^q}T_Jf29B4@2FmfT6k7U|=r+gc8Ctj@5dZ*gSnGNBPCq{7|q> z;Az~xb$D`MRj!*2v$q#?5qPt$mvdGb#O}h38Vmv}a3aXY*HvD4_}kjvKm6=wmosm3%`PNsfOT#3by#Q(GHKz<2)t$}?Da%xR{2Gm_-Jsu zfFKfm>L%Gce3VD;SKE%cnI3Dw$%fe&z0n->Minon1hWIHnA%)qA7PE?l4T7fmv>jb zh_6Ae*2jqDITyg$dBG1k-l5bHqX9;2TARt>Ta`$(Ncc8GUUUr}oTiPq3(6CJTz-!h zNu^`2`_^U-tX&>M(&qIN)l$J(A>b`0BhD}ZdT8&#BQpR8|LuI_zV%hpc~gMLVq3N- zSDS!1HgG0iH1>I4+H6a>8&c(idPqHWy(&l>I08Z2`WI%3kNE`=p-pLWpmQd)@a^`u zVpFsaR;y($ie?99V5h`~+EXcu=RVguhJr@w3AAqRw8;||o7$|T+YM0rPO8vksWfKIaS}M(0@k*r$Oo&oGohY!*JcG~gCAT`o}L$>1K}*B zDjOBcdvT_j=k$7Xz-kj3*re~wm(X!jrq3zrUcsU&I7Xn{UILr#x(agSs{9X3%U^B- z=?b&AK@=J0EPkBA?zRo&hwmUtn1=2dk7OBHVubDJT6qY*`M-Iz$?QlTFI|CbS%>qA zW=hWFpQk{kRezqZ{u27))$~rd#qrmcGgf1#ocy&wb4WfiYPVFpN1~`dR?#J1RiNk%H|IVEtJ@XZ(9FFKksV_9H~JcROLyyeT5) z{no3?3zSluzk}H@Z@qC93cT^U*(pq%59HbN z5R;JjzSbY*`1{8v=LNyk1aK8V9{KV)^zc#*wBv*7JiBfB2fz-h2tC-UuebMSvcc!1 zvJlmDe#%82US7w^T-h@;FL>w#5{Z0|%n);WwJ&9M*^9^gC08>`JYL*wS?zN9ZOyQF zQC!l1^GcWLhllf;U_Kjcg5f#!Y{}#w)uyVKC{NN)=H0oR>X{r(i{udjCXxa+)UOfX zRS0McLlaMrCN~DF*=dZv%1U2aQtiLwzDEKAl>U3F%8Yl zH9fb+3x57IlJ@(PKTP)PZ+(6Jy!D5-_vdp1*4TIH=0UXd%nE|R7Yp{H-g~+g<>dtu z%YN*xYHPFl=Eaebk&-Z$F@-rrVc$cPfj`6CNGjLv{pCvO_fpO8yfqzc_4KWBJO-4| zf+#c=cmPsKj^6LE%5=tO5eYn7JtwKo)Hq=`XrOxi8Ycf)XB~xa(aKDVDg0#L2#0iSbk5&N%k#0FS*E{4UWPAKRUMC(JJ+v% z{VhYgd=mERMQcncGU-y&fHGp1dn;Rp!^B^}!x+etiqvXn;vuBw2R%&D)6+wHUg_x> z0-;V$yt23Z4Q%aNp&>1E9vO**3j}S_Ns&hU`y3R|5^UCEHBgIaK)|y3A}}JuDro*1 zGFra_&|0l-smGidcUH68Z$onrbMKxwLsXAoj5R=$R_AXTx^vV@&8b z>!F00H|@Sh8duUJ4AjE-*Yu{$CY+n2k+cn9;T&k09~%JmT*#^k%#JG(q$afe3w>H= z9jk(Xdbl)6@4&T-r+dC>8 z`AaN)N|wmdyda~yK~K+SNUCXu2te)_0@{-W`9PBSbjI}@okck?C1WI^;v`(($2}S- znoZHON)evDSubSJNFj}2guS*ZxUkZ zD@=obiq<+)2rn-^-qjjuu*%B)q3>=OA^*4k#p+p~9vnALf)8M%BwBw_Kjr_J<8Xs- zDl;8ICXFXJF{nEb99qb4I^$7Vj|=9;hj zpOlpzZ(6IG++#;fq#y5DFdqO{cHkZUQ)CZgdcefEI}(~4;(SZxxtb1U!RWNJYnei- z$TtPXO8rp$QnS2OEHEkrkf*39&FU!|`!Dy(V6`fC_3*l3~nBgv9@u zi6DyyY0nUR1~X_1$t_b{y9uS+XoFtQJ;%{!yfYA?*wj)oO`~UN?=_+ii0flEp~k89 zlgzaWlKHt}#b3t;7py_Vw5!%ZbknnJgR?V89QT z=x{AVEL^O{gbeE)xkiwaEG*S|U0MUuYzTL6mqF2HqhVm#i-f&YJ94QK?D z%#q5B;ofSUd@$@e@C^I#-W(Z%ah8c#<7`B_OMA}z=H4QM^bTnPPDo%3+AKcM^=5Ei zmmMb!14Gf%!LE@VeWr!Oz>@@H%#h^SkNbovI%_>BzYrMB0x&s zlP+f_6PLRiQY%PVjgA=dq; z8hx!l&Et!8k(|B)Dj8Eq!GEnR0SK!=Vn8S*Or@{G&h8(g!XyV|#*r91X8*#AvIBI@ z0e)Sso~tP|`3jAW|9NXcj$Q6D=#-L8z7ZVx|MSw_4+M|sajIk3hIPgp^g!}82wGX; zRy#YkA{LC?c1}18nvWf9wHu(Vb*3*ig^|~ssg5D$K9LbF!w8(+%>;)@4=~tNf^FuW z3q(=#{qbMi4Jexy>`&WP(OVXSt-_U?G=-X{_>ctE)KZC}uUI9p=zFjM zyP<1?nFx$#Kla-m-IGUnBwDJfgvJ`F{?n8Z^kGSHql=u`DLUHAxWa9lkSc6L`}qckmy(vmXqJu zs5=fC2*@&6RCG;bL#JI$47yKzWhMQ~bZc5?lfm`JXe19NfH{2riSZ@_Q0*%6h*r{2 zf7!D;MUEMM8_3i6#X;SEWrA2> zIW+DA0hIM5M8it{xXwH<8$~kU9NMf~VDL2U0KPCQpi2JnBT-t79}{1!y_heKRs@*x zBs~5rVWW7tzR;RR0TRgys1?h1oa><*;+w?>ix1?w8o*n-yZkMgR#TKBqnGzKM2}`g8nC%>0ehl%B~+Tu8&^B z$_&UOAZelB#Y9+%Og@U%yyFW6{mL&k=BT6yM;J_GEmA*L{=MZ)tLGJ5Rb}4v|7@Pt0{xRW`ld6k_|}{D2cp;Cgn1+z-#O${ zSkt(jMVIf;jICnvIu8$GqR)mY_Nh!n5>$A+_ki-TP)U?@JJR8xL^va?X-^(pg5w92;mhZ#PQ)3 zyNH61HW7lsNa#b3g^NaV&RGK{9Z2`Z-455>bYiffqFk422`3NDze-(?%H+?_i2oRm zl%aaLi~3?%C^eu{K_z@*Tu-qe z`6mym%7&!Lds~7hGWpWl9h+Sk&>#sc=o(B0$MGu<^bUv%g{=?+haomxO8UxnT#V*k zM7CU!YLWF6>>|B6MFP#Fwp>GVT7L;H8_@icBJ1O$(W&v6qk<>tx$FGnAakkeY`)SF zra#yA+Mp44)VWqM?DH0tw6-T^;IrGT#<|gPm~u+(SS<+E!||b|E_JP%q&~GEbbeD8 zzo5g$hKmHx>L7Z(xo@YBHi zYC@z@9NAb3!z&}`4Dr#V%yVPkmB;U43-jvM85rFzKiPiPdNa%3Tu~r9{2#tgc0$72 z4+}kXs9-@0+5zi5Ar|B1ab@OU9_-PBG0_6xzshjx<9pdEI94~;2XO*R z)NK#DXuB);+nZ8}>D7y;JH1iN6pymfx5sH&0XA%T!N(E9lE0dMbN$c`9E+Uy#CFpe zvilh{^t{pP+y_S5lm$&LGeLDNG9x#a7I(P%Z!6L-zE=({Bb9@1vG_!q*c)~jJ46n> zCvuD(h8Rh8j92*EPPPiFDM!8CT5?>omLbL$&*THMF24($R9MwK^|`}NPEboItARY8>jEL`{J-3a3|l-hs# z_u{R`2GbS&8-*)P?Qnw&%x~(7RAFxnDs>Xr<67(DH1e+Fs>Ry~zgPT( zN?p^D@FFwx+IgBt7shigWs}cjHa(jO(!lNm>}#OYZ$xHxAJt+M!#)Jqxll9u{k1(_ zpgMlj3I98K6{vsrs|7?lgZHRg$dgw7%GROjeSiF$Bu-ZEz+e*>JL zA5W&8hBht`b!>poyy32dU%40jgAN2Hi;o^S1TN^Bqa(qQk73u&I*L3Tc$mzhFb)cI z7a*!{VQiymNz$=E#n|PlxaaMXNUdud6 ze#qjN%Xca+N*tyQ;1Qt!6J;>rWHO`7#SCHN>DMUhO-)+ij5>>*PN&@k1@pjjy=-vP z0ewKtH`{;{1p7>vkN)&2y8W=x^aSfM{5U+7z#UkNH3-gikde~><*KsrQPHPJ#Y(A! zhoDQxgfUrPlQxByKwoz!-i{%;?Fpi{xmFXW?Z7#hmxI2Yxh3``iZgk zD))6u3{^3sBY`w-Jw3baN5Lv-6M=PsWSC8?Nffg&pocH*T;+8xsq?unLHI$#cnBP< z+q2zC$m)h%_mf24r#r6smqT$ezTkdM&6>P`|~? z77WdFN7>FW10~i7OB_8=%U)flt(O{zF%QQOs3G{?Dn(VerRQIJRYjK;G-1dC30=vC zNRk=g3lllNxji;NZ|lqaAmQ_vSE8{-+|^w>tXlw2Vq$o%T)~xc=6383hrm3xEp;}Q z2uoYoZTqVZB~B13C1NQKT^P|GdfOE-grK&{eiyv79=*XbnmXqVsM~sX^ZH_Cx~p*0 zLznrr-CDRX5lvq$H?@cl1d|N(_|*74O>V$V$iJ5I*R(nGa|xg;kLOfAP)i&QrWC|d zB~Aqkhhrja^{bkf9Qsz_7d|ugP#H;G#J=<^gci>`!ASDw!2bV|8YzD2H;ZD+y)jsF zjw5W(zmKaDabxI_WJ9K@aC(*yNjR>X%guLqR_>=O_J0TP9o^sQUBt5%L4KWD>K3TD zU)pCBv(ZPHv}~ZiqT7X!N zt3O;(pJV9j-3cgZqekm0g7cesyCwh}v~~!UJ~qk)$q;m=b#)i@aCL6U7k78v{BUc3 zQ`s#Y)palT)!KZlw+7Mb0{QcEvx?)55u{VZ`|&bT1I>6Oj-G-Wx4+Z*fG>T=vCd%9uIr>l{`x zl1lBhuw|!~?pT-Mq8ZQr+ptUGBi3c7j_p1B6!

@eB%8WqI|x`}(N=rOF+;g}d$b z_xb_y-Tp(JcM-C@+!24nV`F_l*LX!f&D&elw-<}&Q&my9o}O-FekA7;=losu2~n5b zH<>@CUs@9@#4*l04BL#=YAKC=0nk!M7y^Afba*r(u&Mw9zpE3CsF|{Gj)&@NVmt~< z#N?=t5T*+FO;pq4qlV6pei%^T1U5EM8Zm@R=p8+ISp zAv|Qt!sFVsz)_&WM69aGkzJgHb?8*|R(-q%g#bWh-O2pcxa}cyC3>6ex#gP8g|`Bp zVyIdVn6{_ff<6g~Dq{z?aHple{#t0Qx8jje9tRpN^_(oo85`94zW2M_izOW(q3*RE z$PCUu!8x5DERx~{a1+Em&whJ&ZAITk?>FAbpH-U;8@6bMUwgkcg|Q;gZWqPRZk+bA z{t3=yl|`32(lzp?wMa40H16}YXm?4Ni+m<4tSqIc=_v4sP1=1mDG7(k-su(Van)~D zdb8e0M-O5lauY^Nj;U*-5nbH^ix8l8uM9mt*6q@cU0L3XxZD@Irp+N}Hg;2;T8}aR zTxD%%b3r`ru8hwvgCFEJ%u-$aq?JOI23@vkrX*9f$A6G}x$mQVo|Y*lx3ESRRprVP z?m5ll7QG-6CQ!kWTeRpuLoF$|agw?VAo;F3Yi7)TuYSQc)|Hwt9g)3dBTn|m@%@~J z^w|7XP~7@BJ+xPRoi_0}C7wg`mA3&UMdSyU*v>?PGH?$l%y2(fE%KN!?h03PC%VXF z?yR=_W{nW~Lz&TfcHUaDmWYYl(mwV_Ysl$HcSwZh+1D0=`} z0)XUV3M%lulKOaM3P$HxHs{d3k#OtREBo`-)wzOf0|q9>ed0{&UbTq#DR zpsptIHa76^stza*ipS)I3*sfpNF+5oR>&`X#78g9a^N{{QkK3q7Y7>nWXx&nZDG(m zB2|G&O}h7zNMD~*@-2~L(8qtoz2MKVZI?_ot!9KJy$)6K?y1(w(@OVqgMm*0Ry)Nv zVz_m2eXlpP>5+^rZNe|K68Zsqw|11=e$`!#-&D_?h~9&3tm&szOdx-Wx!lhedOrn( zMF+T^)G>~q$LCAr@iFfK^^vHWf9}8Q?|uik6EBmzX54CP zpgg@cga+oAw%n}$cdgzhuJ3EGiHJ#H(E7GV`4Qoei#m>T{}d#)iXy_f2lcG7EY#xv zuwMM9nw|>_&bbU>Xi`Ei_dkx|!!GC2h2JEH!81xnpz38C$w1R@JyO3&q<`~cR%_Hu zq4gCaU`oo54-{I)f0FOIu}38A%Gi9vgtqo1fZ{cLKC&=|DwMHMmXk&HnES6P@$a1+9t!WJXb|w>f z11K(yzFQJ(GITKy|J+++b+1uXSV84X`#y7P%kJjEiVMlh%Hp1ne!Lgs1ylo4t!NSU F{{XIGcW(dy literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 69e04a50..8ceed0bc 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,8 @@ Unity 2018.x or newer - Enable/disable Hierarchy overlay, choose allowed information - Enable/disable Project icons or/and assign own directories - Enable/disable Toolbox drawers or/and assign custom drawers - + - Enable/disable Toolbox Scene View and assign hotkeys + ## Table Of Contents - [Attributes & Drawers](#drawers) @@ -56,15 +57,17 @@ Unity 2018.x or newer - [Project](#project) - [Toolbar](#toolbar) - [Utilities](#utilities) + - [SceneView](#sceneview) ## Settings The most important file, allows the user to manage all available features. Can be accessed from the Project Settings window (Edit/Project Settings.../Editor Toolbox) or directly inside the Project window. Make sure to have one valid settings file per project. -Available features are divided into three groups: +Available features are divided into four groups: - Hierarchy - Project - Inspector +- SceneView Each module is described in its respective section. @@ -844,3 +847,9 @@ Assets/Create/Editor Toolbox/ScriptableObject Creation Wizard ``` ![inspector](https://github.com/arimger/Unity-Editor-Toolbox/blob/develop/Docs/createso.png) + +### SceneView + +Select a specific object that is under the cursor (default key: left control). + +![inspector](https://github.com/arimger/Unity-Editor-Toolbox/blob/develop/Docs/sceneview.png) \ No newline at end of file From 9d646b7efc824d1b569e9e4d4680ae9e35ba7567 Mon Sep 17 00:00:00 2001 From: Grizmu Date: Wed, 14 Jun 2023 19:39:33 +0200 Subject: [PATCH 05/15] Applied pull request suggestions --- .../ToolboxEditorSceneViewObjectSelector.cs | 161 +++++++++--------- .../Editor/ToolboxEditorSceneView.cs | 33 ++-- 2 files changed, 97 insertions(+), 97 deletions(-) diff --git a/Assets/Editor Toolbox/Editor/SceneView/ToolboxEditorSceneViewObjectSelector.cs b/Assets/Editor Toolbox/Editor/SceneView/ToolboxEditorSceneViewObjectSelector.cs index 4045ec83..a62a31c1 100644 --- a/Assets/Editor Toolbox/Editor/SceneView/ToolboxEditorSceneViewObjectSelector.cs +++ b/Assets/Editor Toolbox/Editor/SceneView/ToolboxEditorSceneViewObjectSelector.cs @@ -19,40 +19,21 @@ public class ToolboxEditorSceneViewObjectSelector : EditorWindow private Vector2 size; private Vector2 buttonSize; private GUIStyle buttonStyle; - private Color selectionColor = new Color(0.50f, 0.70f, 1.00f); + private static readonly Color selectionColor = new Color(0.50f, 0.70f, 1.00f); - private int shiftMinSelectionID = -1; - private int shiftMaxSelectionID = -1; - private int shiftLastID = -1; - - private GameObject HighlightedObject - { - set - { - if (highlightedObject == value) - { - return; - } - - highlightedObject = value; - UnityEditor.SceneView.RepaintAll(); - - if (highlightedObject != null) - { - EditorGUIUtility.PingObject(highlightedObject); - } - } - } + private int shiftMinSelectionId = -1; + private int shiftMaxSelectionId = -1; + private int shiftLastId = -1; public static void Show(List gameObjects, Vector2 position) { - Rect rect = new Rect(position, Vector2.one); + var rect = new Rect(position, Vector2.one); - ToolboxEditorSceneViewObjectSelector window = CreateInstance(); + var window = CreateInstance(); window.wantsMouseMove = true; window.wantsMouseEnterLeaveWindow = true; window.gameObjects = gameObjects; - window.InitializeGameobjectPaths(); + window.InitializeGameObjectPaths(); window.CalculateSize(); window.ShowAsDropDown(rect, window.size); } @@ -72,7 +53,7 @@ private Vector2 CalculateSize() size = Vector2.zero; - foreach (GameObject go in gameObjects) + foreach (var go in gameObjects) { GUIContent content = EditorGUIUtility.ObjectContent(go, typeof(GameObject)); Vector2 currentSize = buttonStyle.CalcSize(content); @@ -94,21 +75,21 @@ private Vector2 CalculateSize() return size; } - private void InitializeGameobjectPaths() + private void InitializeGameObjectPaths() { gameObjectPaths = new List(); - Stack pathStack = new Stack(); + var pathStack = new Stack(); for (int i = 0; i < gameObjects.Count; i++) { pathStack.Clear(); - Transform transf = gameObjects[i].transform; - pathStack.Push(transf.gameObject.name); + Transform transform = gameObjects[i].transform; + pathStack.Push(transform.gameObject.name); - while (transf.parent != null) + while (transform.parent != null) { - transf = transf.parent; - pathStack.Push(transf.gameObject.name); + transform = transform.parent; + pathStack.Push(transform.gameObject.name); } string path = string.Join("/", pathStack.ToArray()); @@ -128,29 +109,33 @@ private void OnGUI() return; } - //Debug.Log($"Event : {Event.current.type}"); - - if (Event.current.type == EventType.MouseMove) + switch (Event.current.type) { - OnGUI_MouseMove(); - } - else if (Event.current.type == EventType.MouseLeaveWindow) - { - OnGUI_MouseLeave(); - } - else - { - OnGUI_Normal(); + case EventType.MouseMove: + { + OnGUIMouseMove(); + break; + } + case EventType.MouseLeaveWindow: + { + OnGUIMouseLeave(); + break; + } + default: + { + OnGUINormal(); + break; + } } } - private void OnGUI_Normal() + private void OnGUINormal() { Rect rect = new Rect(sizeXPadding, sizeYPadding, buttonSize.x, buttonSize.y); for (int i = 0; i < gameObjects.Count; i++) { - GameObject gameObject = gameObjects[i]; + var gameObject = gameObjects[i]; if(gameObject == null) { @@ -158,7 +143,7 @@ private void OnGUI_Normal() continue; } - GUIContent content = EditorGUIUtility.ObjectContent(gameObject, typeof(GameObject)); + var content = EditorGUIUtility.ObjectContent(gameObject, typeof(GameObject)); bool objectSelected = Selection.Contains(gameObject); @@ -178,13 +163,13 @@ private void OnGUI_Normal() } } - private void OnGUI_MouseMove() + private void OnGUIMouseMove() { - Rect rect = new Rect(sizeXPadding, sizeYPadding, buttonSize.x, buttonSize.y); + var rect = new Rect(sizeXPadding, sizeYPadding, buttonSize.x, buttonSize.y); for (int i = 0; i < gameObjects.Count; i++) { - GameObject gameObject = gameObjects[i]; + var gameObject = gameObjects[i]; if (gameObject == null) { @@ -192,7 +177,7 @@ private void OnGUI_MouseMove() continue; } - GUIContent content = EditorGUIUtility.ObjectContent(gameObject, typeof(GameObject)); + var content = EditorGUIUtility.ObjectContent(gameObject, typeof(GameObject)); GUI.Button(rect, content, buttonStyle); @@ -219,53 +204,53 @@ private void GameObjectButtonPress(int id) private void UpdateShiftSelectionIDs(int id) { - if(shiftLastID == -1) + if(shiftLastId == -1) { - shiftLastID = id; + shiftLastId = id; } - if(shiftMinSelectionID == -1) + if(shiftMinSelectionId == -1) { - shiftMinSelectionID = id; + shiftMinSelectionId = id; } - if (shiftMaxSelectionID == -1) + if (shiftMaxSelectionId == -1) { - shiftMaxSelectionID = id; + shiftMaxSelectionId = id; } - if(id < shiftMinSelectionID) + if(id < shiftMinSelectionId) { - shiftMinSelectionID = id; + shiftMinSelectionId = id; } - else if(id >= shiftMaxSelectionID) + else if(id >= shiftMaxSelectionId) { - shiftMaxSelectionID = id; + shiftMaxSelectionId = id; } - else if(id > shiftMinSelectionID) + else if(id > shiftMinSelectionId) { //ID is between min and max. - if(shiftLastID < id) + if(shiftLastId < id) { - shiftMaxSelectionID = id; + shiftMaxSelectionId = id; } else { - shiftMinSelectionID = id; + shiftMinSelectionId = id; } } - shiftLastID = id; + shiftLastId = id; } private void SelectObject(int id, bool control, bool shift) { - GameObject gameObject = gameObjects[id]; + var gameObject = gameObjects[id]; if (shift) { UpdateShiftSelectionIDs(id); - SelectObjects(shiftMinSelectionID, shiftMaxSelectionID); + SelectObjects(shiftMinSelectionId, shiftMaxSelectionId); } else if (control) { @@ -290,8 +275,8 @@ private void SelectObject(int id, bool control, bool shift) private void SelectObjects(int minID, int maxID) { - int size = maxID - minID + 1; - Object[] newSelection = new Object[size]; + var size = maxID - minID + 1; + var newSelection = new Object[size]; int index = 0; @@ -306,8 +291,8 @@ private void SelectObjects(int minID, int maxID) private void AddObjectToSelection(GameObject gameObject) { - Object[] currentSelection = Selection.objects; - Object[] newSelection = new Object[currentSelection.Length + 1]; + var currentSelection = Selection.objects; + var newSelection = new Object[currentSelection.Length + 1]; currentSelection.CopyTo(newSelection, 0); newSelection[newSelection.Length - 1] = gameObject; @@ -317,10 +302,10 @@ private void AddObjectToSelection(GameObject gameObject) private void RemoveObjectFromSelection(GameObject gameObject) { - Object[] currentSelection = Selection.objects; - Object[] newSelection = new Object[currentSelection.Length - 1]; + var currentSelection = Selection.objects; + var newSelection = new Object[currentSelection.Length - 1]; - int index = 0; + var index = 0; for (int i = 0; i < currentSelection.Length; i++) { @@ -336,9 +321,29 @@ private void RemoveObjectFromSelection(GameObject gameObject) Selection.objects = newSelection; } - private void OnGUI_MouseLeave() + private void OnGUIMouseLeave() { HighlightedObject = null; } + + private GameObject HighlightedObject + { + set + { + if (highlightedObject == value) + { + return; + } + + highlightedObject = value; + UnityEditor.SceneView.RepaintAll(); + + if (highlightedObject != null) + { + EditorGUIUtility.PingObject(highlightedObject); + } + } + } + } } \ No newline at end of file diff --git a/Assets/Editor Toolbox/Editor/ToolboxEditorSceneView.cs b/Assets/Editor Toolbox/Editor/ToolboxEditorSceneView.cs index af2471a9..679d6662 100644 --- a/Assets/Editor Toolbox/Editor/ToolboxEditorSceneView.cs +++ b/Assets/Editor Toolbox/Editor/ToolboxEditorSceneView.cs @@ -38,28 +38,26 @@ private static List GetObjectsUnderCursor() private static void UpdateEventCallback() { - if (UseToolboxSceneView && !IsEventAttached) - { - UnityEditor.SceneView.duringSceneGui += SceneView_DuringSceneGUI; - IsEventAttached = true; - } - else if (!UseToolboxSceneView && IsEventAttached) + UnityEditor.SceneView.duringSceneGui -= SceneViewDuringSceneGUI; + + if (UseToolboxSceneView) { - UnityEditor.SceneView.duringSceneGui -= SceneView_DuringSceneGUI; - IsEventAttached = false; + UnityEditor.SceneView.duringSceneGui += SceneViewDuringSceneGUI; } } - private static void SceneView_DuringSceneGUI(UnityEditor.SceneView sceneView) + private static void SceneViewDuringSceneGUI(UnityEditor.SceneView sceneView) { - if (Event.current.type == EventType.KeyDown - && Event.current.keyCode == SelectorKey) + if (Event.current.type != EventType.KeyDown + || Event.current.keyCode != SelectorKey) { - List objectsUnderCursor = GetObjectsUnderCursor(); - if (objectsUnderCursor.Count > 0) - { - ToolboxEditorSceneViewObjectSelector.Show(objectsUnderCursor, Event.current.mousePosition + sceneView.position.position); - } + return; + } + + List objectsUnderCursor = GetObjectsUnderCursor(); + if (objectsUnderCursor.Count > 0) + { + ToolboxEditorSceneViewObjectSelector.Show(objectsUnderCursor, Event.current.mousePosition + sceneView.position.position); } } @@ -79,8 +77,6 @@ internal static void UpdateSettings(IToolboxSceneViewSettings settings) UpdateEventCallback(); } - private static bool IsEventAttached { get; set; } = false; - ///

/// Should the scene view be used. /// @@ -90,6 +86,5 @@ internal static void UpdateSettings(IToolboxSceneViewSettings settings) /// Which key should activate the scene view. /// private static KeyCode SelectorKey { get; set; } = KeyCode.LeftControl; - } } From 4b1e6af7e03329ffdb1c600eafb508606ac32703 Mon Sep 17 00:00:00 2001 From: Grizmu Date: Wed, 14 Jun 2023 21:06:43 +0200 Subject: [PATCH 06/15] Refactored ToolboxEditorSceneViewObjectSelector style --- .../ToolboxEditorSceneViewObjectSelector.cs | 33 ++++++++----------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/Assets/Editor Toolbox/Editor/SceneView/ToolboxEditorSceneViewObjectSelector.cs b/Assets/Editor Toolbox/Editor/SceneView/ToolboxEditorSceneViewObjectSelector.cs index a62a31c1..c66fc23e 100644 --- a/Assets/Editor Toolbox/Editor/SceneView/ToolboxEditorSceneViewObjectSelector.cs +++ b/Assets/Editor Toolbox/Editor/SceneView/ToolboxEditorSceneViewObjectSelector.cs @@ -18,7 +18,6 @@ public class ToolboxEditorSceneViewObjectSelector : EditorWindow private GameObject highlightedObject; private Vector2 size; private Vector2 buttonSize; - private GUIStyle buttonStyle; private static readonly Color selectionColor = new Color(0.50f, 0.70f, 1.00f); private int shiftMinSelectionId = -1; @@ -38,25 +37,14 @@ public static void Show(List gameObjects, Vector2 position) window.ShowAsDropDown(rect, window.size); } - private void InitializeStyle() - { - buttonStyle = new GUIStyle(GUI.skin.button); - buttonStyle.alignment = TextAnchor.MiddleLeft; - } - private Vector2 CalculateSize() { - if (buttonStyle == null) - { - InitializeStyle(); - } - size = Vector2.zero; foreach (var go in gameObjects) { GUIContent content = EditorGUIUtility.ObjectContent(go, typeof(GameObject)); - Vector2 currentSize = buttonStyle.CalcSize(content); + Vector2 currentSize = Style.buttonStyle.CalcSize(content); if (currentSize.x > size.x) { size.x = currentSize.x; @@ -99,11 +87,6 @@ private void InitializeGameObjectPaths() private void OnGUI() { - if (buttonStyle == null) - { - InitializeStyle(); - } - if (Event.current.type == EventType.Layout) { return; @@ -152,7 +135,7 @@ private void OnGUINormal() GUI.backgroundColor = selectionColor; } - if (GUI.Button(rect, content, buttonStyle)) + if (GUI.Button(rect, content, Style.buttonStyle)) { GameObjectButtonPress(i); } @@ -179,7 +162,7 @@ private void OnGUIMouseMove() var content = EditorGUIUtility.ObjectContent(gameObject, typeof(GameObject)); - GUI.Button(rect, content, buttonStyle); + GUI.Button(rect, content, Style.buttonStyle); if (rect.Contains(Event.current.mousePosition)) { @@ -345,5 +328,15 @@ private GameObject HighlightedObject } } + private static class Style + { + internal static readonly GUIStyle buttonStyle; + + static Style() + { + buttonStyle = new GUIStyle(GUI.skin.button); + buttonStyle.alignment = TextAnchor.MiddleLeft; + } + } } } \ No newline at end of file From c3aff3394cf88b0e3229d57cbca3458099306fcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mi=C5=82osz=20Matkowski?= Date: Sat, 17 Jun 2023 01:07:28 +0200 Subject: [PATCH 07/15] Minor refactor changes --- .../ToolboxEditorSceneViewObjectSelector.cs | 198 ++++++++---------- .../Editor/ToolboxEditorSceneView.cs | 17 +- 2 files changed, 100 insertions(+), 115 deletions(-) diff --git a/Assets/Editor Toolbox/Editor/SceneView/ToolboxEditorSceneViewObjectSelector.cs b/Assets/Editor Toolbox/Editor/SceneView/ToolboxEditorSceneViewObjectSelector.cs index c66fc23e..0f6f834e 100644 --- a/Assets/Editor Toolbox/Editor/SceneView/ToolboxEditorSceneViewObjectSelector.cs +++ b/Assets/Editor Toolbox/Editor/SceneView/ToolboxEditorSceneViewObjectSelector.cs @@ -6,8 +6,7 @@ namespace Toolbox.Editor.SceneView { public class ToolboxEditorSceneViewObjectSelector : EditorWindow { - private List gameObjects; - private List gameObjectPaths; + private static readonly Color selectionColor = new Color(0.50f, 0.70f, 1.00f); private const float sizeXPadding = 2f; private const float sizeYPadding = 2f; @@ -15,10 +14,12 @@ public class ToolboxEditorSceneViewObjectSelector : EditorWindow private const float buttonYSize = 20f; private const float sizeXOffset = -30f; + private List gameObjects; + private List gameObjectPaths; + private GameObject highlightedObject; private Vector2 size; private Vector2 buttonSize; - private static readonly Color selectionColor = new Color(0.50f, 0.70f, 1.00f); private int shiftMinSelectionId = -1; private int shiftMaxSelectionId = -1; @@ -37,54 +38,6 @@ public static void Show(List gameObjects, Vector2 position) window.ShowAsDropDown(rect, window.size); } - private Vector2 CalculateSize() - { - size = Vector2.zero; - - foreach (var go in gameObjects) - { - GUIContent content = EditorGUIUtility.ObjectContent(go, typeof(GameObject)); - Vector2 currentSize = Style.buttonStyle.CalcSize(content); - if (currentSize.x > size.x) - { - size.x = currentSize.x; - } - } - - //This is needed because CalcSize calculates content drawing with icon at full size. - size.x += sizeXOffset; - - buttonSize.x = size.x; - buttonSize.y = buttonYSize; - - size.y = gameObjects.Count * buttonYSize + sizeYPadding * 2.0f + buttonYSpacing * gameObjects.Count - 1; - size.x += sizeXPadding * 2.0f; - - return size; - } - - private void InitializeGameObjectPaths() - { - gameObjectPaths = new List(); - var pathStack = new Stack(); - - for (int i = 0; i < gameObjects.Count; i++) - { - pathStack.Clear(); - Transform transform = gameObjects[i].transform; - pathStack.Push(transform.gameObject.name); - - while (transform.parent != null) - { - transform = transform.parent; - pathStack.Push(transform.gameObject.name); - } - - string path = string.Join("/", pathStack.ToArray()); - gameObjectPaths.Add(path); - } - } - private void OnGUI() { if (Event.current.type == EventType.Layout) @@ -95,41 +48,59 @@ private void OnGUI() switch (Event.current.type) { case EventType.MouseMove: - { - OnGUIMouseMove(); + OnGuiMouseMove(); break; - } - case EventType.MouseLeaveWindow: - { - OnGUIMouseLeave(); + case EventType.MouseLeaveWindow: + OnGuiMouseLeave(); break; - } default: - { - OnGUINormal(); + OnGuiNormal(); break; - } } } - private void OnGUINormal() + private void OnGuiMouseLeave() { - Rect rect = new Rect(sizeXPadding, sizeYPadding, buttonSize.x, buttonSize.y); + HighlightedObject = null; + } - for (int i = 0; i < gameObjects.Count; i++) + private void OnGuiMouseMove() + { + var rect = new Rect(sizeXPadding, sizeYPadding, buttonSize.x, buttonSize.y); + for (var i = 0; i < gameObjects.Count; i++) { var gameObject = gameObjects[i]; - - if(gameObject == null) + if (gameObject == null) { //Can happen when something removes the gameobject during the window display. continue; } var content = EditorGUIUtility.ObjectContent(gameObject, typeof(GameObject)); + GUI.Button(rect, content, Style.buttonStyle); + if (rect.Contains(Event.current.mousePosition)) + { + HighlightedObject = gameObject; + } - bool objectSelected = Selection.Contains(gameObject); + rect.y += buttonYSize + buttonYSpacing; + } + } + private void OnGuiNormal() + { + var rect = new Rect(sizeXPadding, sizeYPadding, buttonSize.x, buttonSize.y); + for (var i = 0; i < gameObjects.Count; i++) + { + var gameObject = gameObjects[i]; + if (gameObject == null) + { + //Can happen when something removes the gameobject during the window display. + continue; + } + + var content = EditorGUIUtility.ObjectContent(gameObject, typeof(GameObject)); + var objectSelected = Selection.Contains(gameObject); if (objectSelected) { GUI.backgroundColor = selectionColor; @@ -141,42 +112,61 @@ private void OnGUINormal() } GUI.backgroundColor = Color.white; - rect.y += buttonYSize + buttonYSpacing; } } - private void OnGUIMouseMove() + private Vector2 CalculateSize() { - var rect = new Rect(sizeXPadding, sizeYPadding, buttonSize.x, buttonSize.y); + size = Vector2.zero; - for (int i = 0; i < gameObjects.Count; i++) + foreach (var go in gameObjects) { - var gameObject = gameObjects[i]; - - if (gameObject == null) + var content = EditorGUIUtility.ObjectContent(go, typeof(GameObject)); + var currentSize = Style.buttonStyle.CalcSize(content); + if (currentSize.x > size.x) { - //Can happen when something removes the gameobject during the window display. - continue; + size.x = currentSize.x; } + } - var content = EditorGUIUtility.ObjectContent(gameObject, typeof(GameObject)); + //This is needed because CalcSize calculates content drawing with icon at full size. + size.x += sizeXOffset; - GUI.Button(rect, content, Style.buttonStyle); + buttonSize.x = size.x; + buttonSize.y = buttonYSize; - if (rect.Contains(Event.current.mousePosition)) + size.y = gameObjects.Count * buttonYSize + sizeYPadding * 2.0f + buttonYSpacing * gameObjects.Count - 1; + size.x += sizeXPadding * 2.0f; + + return size; + } + + private void InitializeGameObjectPaths() + { + gameObjectPaths = new List(); + var pathStack = new Stack(); + + for (var i = 0; i < gameObjects.Count; i++) + { + pathStack.Clear(); + var transform = gameObjects[i].transform; + pathStack.Push(transform.gameObject.name); + + while (transform.parent != null) { - HighlightedObject = gameObject; + transform = transform.parent; + pathStack.Push(transform.gameObject.name); } - rect.y += buttonYSize + buttonYSpacing; + var path = string.Join("/", pathStack.ToArray()); + gameObjectPaths.Add(path); } } private void GameObjectButtonPress(int id) { SelectObject(id, Event.current.control, Event.current.shift); - if (Event.current.control || Event.current.shift) { return; @@ -187,12 +177,12 @@ private void GameObjectButtonPress(int id) private void UpdateShiftSelectionIDs(int id) { - if(shiftLastId == -1) + if (shiftLastId == -1) { shiftLastId = id; } - if(shiftMinSelectionId == -1) + if (shiftMinSelectionId == -1) { shiftMinSelectionId = id; } @@ -202,18 +192,18 @@ private void UpdateShiftSelectionIDs(int id) shiftMaxSelectionId = id; } - if(id < shiftMinSelectionId) + if (id < shiftMinSelectionId) { shiftMinSelectionId = id; } - else if(id >= shiftMaxSelectionId) + else if (id >= shiftMaxSelectionId) { shiftMaxSelectionId = id; } - else if(id > shiftMinSelectionId) + else if (id > shiftMinSelectionId) { //ID is between min and max. - if(shiftLastId < id) + if (shiftLastId < id) { shiftMaxSelectionId = id; } @@ -238,16 +228,13 @@ private void SelectObject(int id, bool control, bool shift) else if (control) { UpdateShiftSelectionIDs(id); - if (Selection.Contains(gameObject)) { - //Deselect - RemoveObjectFromSelection(gameObject); + RemoveSelectedObject(gameObject); } else { - //Select - AddObjectToSelection(gameObject); + AppendSelectedObject(gameObject); } } else @@ -256,14 +243,14 @@ private void SelectObject(int id, bool control, bool shift) } } - private void SelectObjects(int minID, int maxID) + private void SelectObjects(int minId, int maxId) { - var size = maxID - minID + 1; + var size = maxId - minId + 1; var newSelection = new Object[size]; - int index = 0; + var index = 0; - for (int i = minID; i <= maxID; i++) + for (var i = minId; i <= maxId; i++) { newSelection[index] = gameObjects[i]; index++; @@ -272,7 +259,7 @@ private void SelectObjects(int minID, int maxID) Selection.objects = newSelection; } - private void AddObjectToSelection(GameObject gameObject) + private void AppendSelectedObject(GameObject gameObject) { var currentSelection = Selection.objects; var newSelection = new Object[currentSelection.Length + 1]; @@ -283,14 +270,14 @@ private void AddObjectToSelection(GameObject gameObject) Selection.objects = newSelection; } - private void RemoveObjectFromSelection(GameObject gameObject) + private void RemoveSelectedObject(GameObject gameObject) { var currentSelection = Selection.objects; var newSelection = new Object[currentSelection.Length - 1]; var index = 0; - for (int i = 0; i < currentSelection.Length; i++) + for (var i = 0; i < currentSelection.Length; i++) { if (currentSelection[i] == gameObject) { @@ -304,11 +291,6 @@ private void RemoveObjectFromSelection(GameObject gameObject) Selection.objects = newSelection; } - private void OnGUIMouseLeave() - { - HighlightedObject = null; - } - private GameObject HighlightedObject { set @@ -334,8 +316,10 @@ private static class Style static Style() { - buttonStyle = new GUIStyle(GUI.skin.button); - buttonStyle.alignment = TextAnchor.MiddleLeft; + buttonStyle = new GUIStyle(GUI.skin.button) + { + alignment = TextAnchor.MiddleLeft + }; } } } diff --git a/Assets/Editor Toolbox/Editor/ToolboxEditorSceneView.cs b/Assets/Editor Toolbox/Editor/ToolboxEditorSceneView.cs index 679d6662..8e230680 100644 --- a/Assets/Editor Toolbox/Editor/ToolboxEditorSceneView.cs +++ b/Assets/Editor Toolbox/Editor/ToolboxEditorSceneView.cs @@ -16,15 +16,16 @@ static ToolboxEditorSceneView() private static List GetObjectsUnderCursor() { - List hitObjects = new List(); - GameObject[] hitObjectsArray; + const int maxIterations = 50; - int maxIterations = 50; - for (int i = 0; i < maxIterations; i++) + var mousePosition = Event.current.mousePosition; + var hitObjects = new List(); + GameObject[] hitObjectsArray; + for (var i = 0; i < maxIterations; i++) { hitObjectsArray = hitObjects.ToArray(); - GameObject go = HandleUtility.PickGameObject(Event.current.mousePosition, true, hitObjectsArray); + var go = HandleUtility.PickGameObject(mousePosition, true, hitObjectsArray); if (go == null) { break; @@ -48,13 +49,13 @@ private static void UpdateEventCallback() private static void SceneViewDuringSceneGUI(UnityEditor.SceneView sceneView) { - if (Event.current.type != EventType.KeyDown - || Event.current.keyCode != SelectorKey) + if (Event.current.type != EventType.KeyDown || + Event.current.keyCode != SelectorKey) { return; } - List objectsUnderCursor = GetObjectsUnderCursor(); + var objectsUnderCursor = GetObjectsUnderCursor(); if (objectsUnderCursor.Count > 0) { ToolboxEditorSceneViewObjectSelector.Show(objectsUnderCursor, Event.current.mousePosition + sceneView.position.position); From 4ae3c1e91f7cebd1fbe577d262710420df5ddcda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mi=C5=82osz=20Matkowski?= Date: Sat, 17 Jun 2023 02:41:23 +0200 Subject: [PATCH 08/15] Handle removing and reimporting Scene assets --- .../SceneSerializationProcessor.cs | 42 +++++++++++++++++++ .../SceneSerializationProcessor.cs.meta | 11 +++++ .../SceneSerializationUtility.cs | 39 ++++++++++------- 3 files changed, 76 insertions(+), 16 deletions(-) create mode 100644 Assets/Editor Toolbox/Runtime/Serialization/SceneSerializationProcessor.cs create mode 100644 Assets/Editor Toolbox/Runtime/Serialization/SceneSerializationProcessor.cs.meta diff --git a/Assets/Editor Toolbox/Runtime/Serialization/SceneSerializationProcessor.cs b/Assets/Editor Toolbox/Runtime/Serialization/SceneSerializationProcessor.cs new file mode 100644 index 00000000..be3cab5c --- /dev/null +++ b/Assets/Editor Toolbox/Runtime/Serialization/SceneSerializationProcessor.cs @@ -0,0 +1,42 @@ +using System.IO; +#if UNITY_EDITOR +using UnityEditor; +#endif + +namespace Toolbox.Serialization +{ +#if UNITY_EDITOR + public class SceneSerializationProcessor : AssetPostprocessor + { +#if UNITY_2021_3_OR_NEWER + internal static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths, bool didDomainReload) +#else + internal static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) +#endif + { + foreach (string path in importedAssets) + { + if (IsSceneAsset(path)) + { + SceneSerializationUtility.RefreshCache(); + return; + } + } + + foreach (string path in deletedAssets) + { + if (IsSceneAsset(path)) + { + SceneSerializationUtility.RefreshCache(); + return; + } + } + } + + private static bool IsSceneAsset(string path) + { + return Path.GetExtension(path) == ".unity"; + } + } +#endif +} \ No newline at end of file diff --git a/Assets/Editor Toolbox/Runtime/Serialization/SceneSerializationProcessor.cs.meta b/Assets/Editor Toolbox/Runtime/Serialization/SceneSerializationProcessor.cs.meta new file mode 100644 index 00000000..509323f9 --- /dev/null +++ b/Assets/Editor Toolbox/Runtime/Serialization/SceneSerializationProcessor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 10115db7d10ebb44bb574a68e78b333d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor Toolbox/Runtime/Serialization/SceneSerializationUtility.cs b/Assets/Editor Toolbox/Runtime/Serialization/SceneSerializationUtility.cs index 9b94a67f..0fc087e4 100644 --- a/Assets/Editor Toolbox/Runtime/Serialization/SceneSerializationUtility.cs +++ b/Assets/Editor Toolbox/Runtime/Serialization/SceneSerializationUtility.cs @@ -27,7 +27,7 @@ private static void Initialize() isInitialized = true; } - private static void ConfirmCache() + internal static void ConfirmCache() { //NOTE: refresh data only if the cache is empty, //it probably means that it's our first time when we are updating it @@ -37,7 +37,7 @@ private static void ConfirmCache() } } - private static void RefreshCache() + internal static void RefreshCache() { cachedScenes.Clear(); var buildIndex = -1; @@ -48,23 +48,30 @@ private static void RefreshCache() continue; } - buildIndex++; - var sceneIndex = scene.enabled ? buildIndex : InvalidSceneIndex; var sceneAsset = EditorGUIUtility.Load(scene.path) as SceneAsset; - if (sceneAsset != null) + if (sceneAsset == null) { - if (cachedScenes.ContainsKey(sceneAsset)) - { - continue; - } - - cachedScenes.Add(sceneAsset, new SceneData() - { - BuildIndex = buildIndex, - SceneName = sceneAsset.name, - ScenePath = scene.path - }); + continue; + } + + var sceneIndex = InvalidSceneIndex; + if (scene.enabled) + { + buildIndex++; + sceneIndex = buildIndex; + } + + if (cachedScenes.ContainsKey(sceneAsset)) + { + continue; } + + cachedScenes.Add(sceneAsset, new SceneData() + { + BuildIndex = sceneIndex, + SceneName = sceneAsset.name, + ScenePath = scene.path + }); } } From 9dab6e3903c0a9c9af0d7d59c0f3a2ceda02eea7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mi=C5=82osz=20Matkowski?= Date: Sat, 17 Jun 2023 02:59:46 +0200 Subject: [PATCH 09/15] Log an error if cannot find a tree element when searching for property parent --- .../Editor Toolbox/Editor/Utilities/PropertyUtility.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Assets/Editor Toolbox/Editor/Utilities/PropertyUtility.cs b/Assets/Editor Toolbox/Editor/Utilities/PropertyUtility.cs index d8020a36..8f98ed0d 100644 --- a/Assets/Editor Toolbox/Editor/Utilities/PropertyUtility.cs +++ b/Assets/Editor Toolbox/Editor/Utilities/PropertyUtility.cs @@ -120,8 +120,13 @@ public static object GetTreePathReference(string treeField, object treeParent) } var fieldType = treeParent.GetType(); - var fieldInfo = fieldType.GetField(treeField, - BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); + var fieldInfo = fieldType.GetField(treeField, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); + if (fieldInfo == null) + { + ToolboxEditorLog.LogError($"Cannot find field: '{treeField}'."); + return null; + } + return fieldInfo.GetValue(treeParent); } From 1cdca4c25ad6686d602513aef4f9102f5d2de351 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mi=C5=82osz=20Matkowski?= Date: Sat, 17 Jun 2023 03:08:09 +0200 Subject: [PATCH 10/15] Add workflow responsible for creating UPM dev branch --- .github/workflows/upm-dev.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/workflows/upm-dev.yml diff --git a/.github/workflows/upm-dev.yml b/.github/workflows/upm-dev.yml new file mode 100644 index 00000000..b60e7006 --- /dev/null +++ b/.github/workflows/upm-dev.yml @@ -0,0 +1,19 @@ +name: Update UPM branch (develop) +on: + push: + branches: + - develop +jobs: + split-upm: + name: split upm branch + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + - name: split upm branch + run: | + git subtree split -P "$PKG_ROOT" -b upm + git push -u origin upm + env: + PKG_ROOT: 'Assets/Editor Toolbox' From 97a87a52112cf81f373918b277419444aa8329a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mi=C5=82osz=20Matkowski?= Date: Sat, 17 Jun 2023 03:15:35 +0200 Subject: [PATCH 11/15] Fix support for Unity 2018.x --- .../Editor/Editors/ToolboxScriptedImporterEditor.cs | 7 ++++++- Assets/Editor Toolbox/Editor/ToolboxEditorSceneView.cs | 2 ++ Assets/Examples/Editor/SampleScriptedImporter.cs | 6 ++++-- Assets/Examples/Editor/SampleScriptedImporterEditor.cs | 6 ++++-- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/Assets/Editor Toolbox/Editor/Editors/ToolboxScriptedImporterEditor.cs b/Assets/Editor Toolbox/Editor/Editors/ToolboxScriptedImporterEditor.cs index e2dd56ed..55ae9528 100644 --- a/Assets/Editor Toolbox/Editor/Editors/ToolboxScriptedImporterEditor.cs +++ b/Assets/Editor Toolbox/Editor/Editors/ToolboxScriptedImporterEditor.cs @@ -1,5 +1,9 @@ using UnityEditor; +#if UNITY_2020_2_OR_NEWER using UnityEditor.AssetImporters; +#else +using UnityEditor.Experimental.AssetImporters; +#endif namespace Toolbox.Editor.Editors { @@ -15,11 +19,12 @@ public sealed override void OnInspectorGUI() public virtual void DrawCustomInspector() { Drawer.DrawEditor(serializedObject); +#if UNITY_2020_2_OR_NEWER if (extraDataType != null) { Drawer.DrawEditor(extraDataSerializedObject); } - +#endif ApplyRevertGUI(); } diff --git a/Assets/Editor Toolbox/Editor/ToolboxEditorSceneView.cs b/Assets/Editor Toolbox/Editor/ToolboxEditorSceneView.cs index 8e230680..dd1ef369 100644 --- a/Assets/Editor Toolbox/Editor/ToolboxEditorSceneView.cs +++ b/Assets/Editor Toolbox/Editor/ToolboxEditorSceneView.cs @@ -39,12 +39,14 @@ private static List GetObjectsUnderCursor() private static void UpdateEventCallback() { +#if UNITY_2019_1_OR_NEWER UnityEditor.SceneView.duringSceneGui -= SceneViewDuringSceneGUI; if (UseToolboxSceneView) { UnityEditor.SceneView.duringSceneGui += SceneViewDuringSceneGUI; } +#endif } private static void SceneViewDuringSceneGUI(UnityEditor.SceneView sceneView) diff --git a/Assets/Examples/Editor/SampleScriptedImporter.cs b/Assets/Examples/Editor/SampleScriptedImporter.cs index 6d2b9b8f..8eb06e53 100644 --- a/Assets/Examples/Editor/SampleScriptedImporter.cs +++ b/Assets/Examples/Editor/SampleScriptedImporter.cs @@ -1,4 +1,5 @@ -using UnityEditor.AssetImporters; +#if UNITY_2020_2_OR_NEWER +using UnityEditor.AssetImporters; using UnityEngine; [ScriptedImporter(1, "sample")] @@ -11,4 +12,5 @@ public class SampleScriptedImporter : ScriptedImporter public override void OnImportAsset(AssetImportContext ctx) { } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/Assets/Examples/Editor/SampleScriptedImporterEditor.cs b/Assets/Examples/Editor/SampleScriptedImporterEditor.cs index 5d642270..481dba89 100644 --- a/Assets/Examples/Editor/SampleScriptedImporterEditor.cs +++ b/Assets/Examples/Editor/SampleScriptedImporterEditor.cs @@ -1,6 +1,8 @@ -using Toolbox.Editor.Editors; +#if UNITY_2020_2_OR_NEWER +using Toolbox.Editor.Editors; using UnityEditor; [CustomEditor(typeof(SampleScriptedImporter))] public class SampleScriptedImporterEditor : ToolboxScriptedImporterEditor -{ } \ No newline at end of file +{ } +#endif \ No newline at end of file From 42253d1b4069c66c735ba8693287a85b00844237 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mi=C5=82osz=20Matkowski?= Date: Sat, 17 Jun 2023 03:18:42 +0200 Subject: [PATCH 12/15] Rename UPM dev branch --- .github/workflows/upm-dev.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/upm-dev.yml b/.github/workflows/upm-dev.yml index b60e7006..8e3b9997 100644 --- a/.github/workflows/upm-dev.yml +++ b/.github/workflows/upm-dev.yml @@ -13,7 +13,7 @@ jobs: fetch-depth: 0 - name: split upm branch run: | - git subtree split -P "$PKG_ROOT" -b upm - git push -u origin upm + git subtree split -P "$PKG_ROOT" -b upm-dev + git push -u origin upm-dev env: PKG_ROOT: 'Assets/Editor Toolbox' From ed6167811880290a72e6429346f567b02c3b1fff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mi=C5=82osz=20Matkowski?= Date: Sat, 17 Jun 2023 03:48:54 +0200 Subject: [PATCH 13/15] Fix and optimize displaying Scene details --- .../Drawers/Regular/SerializedSceneDrawer.cs | 20 +- .../Runtime/Serialization/SerializedScene.cs | 4 +- Assets/Examples/Scenes/StartupScene.unity | 173 ++++++++++++++++++ .../Examples/Scenes/StartupScene.unity.meta | 7 + Assets/Examples/Scripts/SceneLoader.cs | 13 ++ Assets/Examples/Scripts/SceneLoader.cs.meta | 11 ++ 6 files changed, 221 insertions(+), 7 deletions(-) create mode 100644 Assets/Examples/Scenes/StartupScene.unity create mode 100644 Assets/Examples/Scenes/StartupScene.unity.meta create mode 100644 Assets/Examples/Scripts/SceneLoader.cs create mode 100644 Assets/Examples/Scripts/SceneLoader.cs.meta diff --git a/Assets/Editor Toolbox/Editor/Drawers/Regular/SerializedSceneDrawer.cs b/Assets/Editor Toolbox/Editor/Drawers/Regular/SerializedSceneDrawer.cs index 0108181b..b555f02b 100644 --- a/Assets/Editor Toolbox/Editor/Drawers/Regular/SerializedSceneDrawer.cs +++ b/Assets/Editor Toolbox/Editor/Drawers/Regular/SerializedSceneDrawer.cs @@ -51,7 +51,7 @@ protected override void OnGUISafe(Rect position, SerializedProperty property, GU return; } - var sceneData = SceneData.GetSceneData(sceneProperty); + var sceneData = SceneData.GetSceneDataFromIndex(property); var spacing = EditorGUIUtility.standardVerticalSpacing; position.y += EditorGUIUtility.singleLineHeight + spacing; if (sceneData.inBuild) @@ -82,10 +82,21 @@ private struct SceneData { public int index; public bool enabled; - public GUID guid; public bool inBuild; - public static SceneData GetSceneData(SerializedProperty property) + public static SceneData GetSceneDataFromIndex(SerializedProperty property) + { + var indexProperty = property.FindPropertyRelative("buildIndex"); + var index = indexProperty.intValue; + return new SceneData() + { + index = index, + enabled = index != -1, + inBuild = index != -1 + }; + } + + public static SceneData GetSceneDataFromScene(SerializedProperty property) { var sceneData = new SceneData() { @@ -101,7 +112,7 @@ public static SceneData GetSceneData(SerializedProperty property) for (var i = 0; i < EditorBuildSettings.scenes.Length; i++) { var sceneSettings = EditorBuildSettings.scenes[i]; - var isEnabled = sceneSettings.enabled; + var isEnabled = sceneSettings.enabled && !string.IsNullOrEmpty(sceneSettings.path); if (isEnabled) { sceneIndex++; @@ -112,7 +123,6 @@ public static SceneData GetSceneData(SerializedProperty property) { sceneData.index = isEnabled ? sceneIndex : -1; sceneData.enabled = isEnabled; - sceneData.guid = guid; sceneData.inBuild = true; break; } diff --git a/Assets/Editor Toolbox/Runtime/Serialization/SerializedScene.cs b/Assets/Editor Toolbox/Runtime/Serialization/SerializedScene.cs index 034078e5..d483bc7f 100644 --- a/Assets/Editor Toolbox/Runtime/Serialization/SerializedScene.cs +++ b/Assets/Editor Toolbox/Runtime/Serialization/SerializedScene.cs @@ -22,7 +22,7 @@ public class SerializedScene : ISerializationCallbackReceiver private string sceneName; [SerializeField, HideInInspector] private string scenePath; - [SerializeField, HideInInspector] + [SerializeField] private int buildIndex; @@ -37,7 +37,7 @@ void ISerializationCallbackReceiver.OnAfterDeserialize() private void UpdateProperties() { -#if UNITY_EDITOR +#if UNITY_EDITOR if (SceneSerializationUtility.TryGetSceneData(sceneReference, out var sceneData)) { SceneName = sceneData.SceneName; diff --git a/Assets/Examples/Scenes/StartupScene.unity b/Assets/Examples/Scenes/StartupScene.unity new file mode 100644 index 00000000..18fc0dbf --- /dev/null +++ b/Assets/Examples/Scenes/StartupScene.unity @@ -0,0 +1,173 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.37311953, g: 0.38074014, b: 0.3587274, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &284981408 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 284981410} + - component: {fileID: 284981409} + m_Layer: 0 + m_Name: SceneLoader + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &284981409 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 284981408} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3515fc2458d4146449db76ec05b91a23, type: 3} + m_Name: + m_EditorClassIdentifier: + scene: + sceneReference: {fileID: 102900000, guid: f11034f4657f51a47aac14f26410c500, type: 3} + sceneName: SampleScene + scenePath: Assets/Examples/Scenes/SampleScene.unity + buildIndex: 0 +--- !u!4 &284981410 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 284981408} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Assets/Examples/Scenes/StartupScene.unity.meta b/Assets/Examples/Scenes/StartupScene.unity.meta new file mode 100644 index 00000000..a843050b --- /dev/null +++ b/Assets/Examples/Scenes/StartupScene.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f78d57e2b3a7c4d41b107b859d04f165 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Examples/Scripts/SceneLoader.cs b/Assets/Examples/Scripts/SceneLoader.cs new file mode 100644 index 00000000..9339337f --- /dev/null +++ b/Assets/Examples/Scripts/SceneLoader.cs @@ -0,0 +1,13 @@ +using UnityEngine; +using UnityEngine.SceneManagement; + +public class SceneLoader : MonoBehaviour +{ + [SerializeField, SceneDetails] + private SerializedScene scene; + + private void Start() + { + SceneManager.LoadScene(scene.BuildIndex); + } +} \ No newline at end of file diff --git a/Assets/Examples/Scripts/SceneLoader.cs.meta b/Assets/Examples/Scripts/SceneLoader.cs.meta new file mode 100644 index 00000000..6e615b43 --- /dev/null +++ b/Assets/Examples/Scripts/SceneLoader.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3515fc2458d4146449db76ec05b91a23 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From 09711c6646232ccff953b38a8f803cbf89387d3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mi=C5=82osz=20Matkowski?= Date: Sat, 17 Jun 2023 13:25:27 +0200 Subject: [PATCH 14/15] Update: README.md, package.json, CHANGELOG.md --- Assets/Editor Toolbox/CHANGELOG.md | 11 ++++++++++ Assets/Editor Toolbox/README.md | 22 ++++++++++++++++++-- Assets/Editor Toolbox/package.json | 2 +- Assets/Examples/Scripts/SampleBehaviour1.cs | 5 +++++ Docs/labelwidth.png | Bin 0 -> 1743 bytes README.md | 9 ++++++++ 6 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 Docs/labelwidth.png diff --git a/Assets/Editor Toolbox/CHANGELOG.md b/Assets/Editor Toolbox/CHANGELOG.md index 9a40fa3e..1f1842c2 100644 --- a/Assets/Editor Toolbox/CHANGELOG.md +++ b/Assets/Editor Toolbox/CHANGELOG.md @@ -1,3 +1,14 @@ +## 0.12.3 [17.06.2023] + +### Changed: +- Fix updating SerializedScene index after deleting Scene +- Fix SerializedScene index calculation +- Fix NRE when deleted Scene was still included in Build Settings + +### Added: +- SceneView extension: better way to select raycasted objects in the Scene view +- LabelWidthAttribute + ## 0.12.1 [12.04.2023] ### Changed: diff --git a/Assets/Editor Toolbox/README.md b/Assets/Editor Toolbox/README.md index 69e04a50..7aa432cb 100644 --- a/Assets/Editor Toolbox/README.md +++ b/Assets/Editor Toolbox/README.md @@ -36,7 +36,8 @@ Unity 2018.x or newer - Enable/disable Hierarchy overlay, choose allowed information - Enable/disable Project icons or/and assign own directories - Enable/disable Toolbox drawers or/and assign custom drawers - + - Enable/disable Toolbox Scene View and assign hotkeys + ## Table Of Contents - [Attributes & Drawers](#drawers) @@ -56,15 +57,17 @@ Unity 2018.x or newer - [Project](#project) - [Toolbar](#toolbar) - [Utilities](#utilities) + - [SceneView](#sceneview) ## Settings The most important file, allows the user to manage all available features. Can be accessed from the Project Settings window (Edit/Project Settings.../Editor Toolbox) or directly inside the Project window. Make sure to have one valid settings file per project. -Available features are divided into three groups: +Available features are divided into four groups: - Hierarchy - Project - Inspector +- SceneView Each module is described in its respective section. @@ -228,6 +231,15 @@ public int bigNumber; ![inspector](https://github.com/arimger/Unity-Editor-Toolbox/blob/develop/Docs/formattednumber.png) +#### LabelWidthAttribute + +```csharp +[LabelWidth(220.0f)] +public int veryVeryVeryVeryVeryLongName; +``` + +![inspector](https://github.com/arimger/Unity-Editor-Toolbox/blob/develop/Docs/labelwidth.png) + --- ### Toolbox Drawers @@ -844,3 +856,9 @@ Assets/Create/Editor Toolbox/ScriptableObject Creation Wizard ``` ![inspector](https://github.com/arimger/Unity-Editor-Toolbox/blob/develop/Docs/createso.png) + +### SceneView + +Select a specific object that is under the cursor (default key: left control). + +![inspector](https://github.com/arimger/Unity-Editor-Toolbox/blob/develop/Docs/sceneview.png) \ No newline at end of file diff --git a/Assets/Editor Toolbox/package.json b/Assets/Editor Toolbox/package.json index 2e80a757..2d699f08 100644 --- a/Assets/Editor Toolbox/package.json +++ b/Assets/Editor Toolbox/package.json @@ -1,7 +1,7 @@ { "name": "com.browar.editor-toolbox", "displayName": "Editor Toolbox", - "version": "0.12.1", + "version": "0.12.3", "unity": "2018.1", "description": "Tools, custom attributes, drawers, hierarchy overlay, and other extensions for the Unity Editor.", "keywords": [ diff --git a/Assets/Examples/Scripts/SampleBehaviour1.cs b/Assets/Examples/Scripts/SampleBehaviour1.cs index f33fe623..16636ae9 100644 --- a/Assets/Examples/Scripts/SampleBehaviour1.cs +++ b/Assets/Examples/Scripts/SampleBehaviour1.cs @@ -109,4 +109,9 @@ public enum FlagExample public int bigNumber; [FormattedNumber("c")] public float currency; + + [Label("Label Width", skinStyle: SkinStyle.Box)] + + [LabelWidth(220.0f)] + public int veryVeryVeryVeryVeryLongName; } \ No newline at end of file diff --git a/Docs/labelwidth.png b/Docs/labelwidth.png new file mode 100644 index 0000000000000000000000000000000000000000..f644e7e1c7423edbf4d1a8d45c70956c82a61a31 GIT binary patch literal 1743 zcmV;=1~B=FP)000&U0ssI2xlj4v00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D24qP@K~#8N?VQ_7 zRC^T1&wD7^NU4mMyqqLO@rIIU7p&umpn1y(1?}XOLQ2%sddShdCJ`bSc`HQ?jmrC^ zqj_ng_!>eW^rX^@f5Q2mS--Q{XZB>HIFZi!JjhyW_WthulUd)revZr^62mYIbL?Pq zXBdV#hOoIaN0oQ)-u3nM^)L+6(}P|>M~L1q!RF2!N#;!K?Ck6^470n7UZAEB9m3|$ z98spGroMmwF5cG+!|d*&BhVM3L)hGzBg*9DqrKP2)s7NFSg=K+_WI=p<{Pgs+NDdo_cXoD)M3Uy`=VN1IMe?gqnmcx* zm6er|k&%gsiAJMQR2jzp*q^zhjs5-oMPec*CZ@KwRwM_7Wr2-kfs2dFhYue_a@auJ z+uK|I=;q_ck0(x?p!k=eH1~>%3fTJU>S|Y4msYFY+}so|FpQnCKXV5@K0dv@y%bMO zOrWzkUIOeg(Iad9!u6^RL! z1vZj}j@sOziH*Yb>(}qyyGPbcnuCLbH*el7C@7FWjY0kX{rj1jnNOcS#b%_D45g)|xCAyOD=RCg&?R2KevP%1m6d(|{Q2?Y$B66e>**BrO07XQ z_nn;`cX#)VjSWik^YiQK>L_Lydt=|`j<(Oq$)OninUa!1@ztwWF)^Y4(aab*QJJ2e zc6N5Ya^(sdxV^pI*VmVh92gkz^z=kyQ%bNbu#v1qbN|Z(G-2hz!NG7p0NrXpkApp$mYJbwuZG(4Ep-|@SG3{!`K=7 zHg|NghldB*M`&nhM@I*OSFc_L1O&*Q5)u;f^5si(vV(&Inw*L_fQG)mO;AyWWr2-k z)#i@b8P2=7xJYSKR1_Q*n(*cM`FT{9mzSNKoMvZdA&dP4te=jAiL1>W;t2yIsL4TS+ zMR|#~wl;Y-FDxv)efze>mC^xwBbz%OLihzz343eF&HdZAZ_wY` z+M@K)qeoa5#SCL_9K_twb=ZUZ`uYwJ4^zcpFu1w7VOvcxW<9jAnOOiBN^o#+RaKS9 z{}0OoTga--eRg)%)zuaLix>|E=noAInQ4-_8;wTXPhDLdg68JtlP6F9$lSr(w{J0S zlesrGHsY43jt7-B=5BGNbim%o<_^-*(rRjI5NvF0oH=s_j~uEqjJU|=A+7khkE)CPn-zN4cf`c~vBSQZ?*Ec{oa(cmWmA4iciLqbA4JUlSr zqGF~==8gb!HwJbeA0G_(DJdy?m^*;6lDT7Gzi{Eg*|TT;{r#~QvBumHs8?zYN^}46 zQKu7P8QUFaPvUAIfj2 zh>wrQ6fY7hfSc1NwAS;}m8wyiJMs1F*X`|XkuZ#1a+v162iP5B5W_r0|I~3F+ lFw8N8&7ENw=GY-g{{UF=cafy$hSmT8002ovPDHLkV1kW^bJzd? literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 8ceed0bc..7aa432cb 100644 --- a/README.md +++ b/README.md @@ -231,6 +231,15 @@ public int bigNumber; ![inspector](https://github.com/arimger/Unity-Editor-Toolbox/blob/develop/Docs/formattednumber.png) +#### LabelWidthAttribute + +```csharp +[LabelWidth(220.0f)] +public int veryVeryVeryVeryVeryLongName; +``` + +![inspector](https://github.com/arimger/Unity-Editor-Toolbox/blob/develop/Docs/labelwidth.png) + --- ### Toolbox Drawers From c54c2d314549aa8ebc79db94bf252df7bf04b164 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mi=C5=82osz=20Matkowski?= Date: Sat, 17 Jun 2023 13:28:34 +0200 Subject: [PATCH 15/15] Update CHANGELOG.md --- Assets/Editor Toolbox/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Assets/Editor Toolbox/CHANGELOG.md b/Assets/Editor Toolbox/CHANGELOG.md index 1f1842c2..f5090a99 100644 --- a/Assets/Editor Toolbox/CHANGELOG.md +++ b/Assets/Editor Toolbox/CHANGELOG.md @@ -4,6 +4,7 @@ - Fix updating SerializedScene index after deleting Scene - Fix SerializedScene index calculation - Fix NRE when deleted Scene was still included in Build Settings +- Fix compilation errors in Unity 2018.x ### Added: - SceneView extension: better way to select raycasted objects in the Scene view