// // =============================================================================== // // HierarchySeparators - Visual Organization for Unity Hierarchy // // // // Creator: Scove // // Last Updated: 2024-05-08 // // Version: 2.0 // // // // Purpose: // // Converts GameObjects starting with "//" into visual separators or headers. // // This helps organize large scenes by creating clear, readable sections. // // // // Key Features: // // 1. Automatic formatting: "// player" becomes a bold, centered "PLAYER" header. // // 2. Custom background: Draws a distinctive bar to separate different logic groups. // // 3. Clean UI: Strips out the "//" prefix for a professional look in the editor. // // // // How to Use: // // 1. Place this script in an 'Editor' folder. // // 2. Create an Empty GameObject in your Hierarchy. // // 3. Rename it starting with "//" (e.g., "// --- ENVIRONMENT ---"). // // =============================================================================== // // using UnityEditor; // using UnityEngine; // // namespace Editor // { // [InitializeOnLoad] // public class HierarchySeparators // { // // Custom styling colors // private static readonly Color HeaderBackgroundColor = new Color(0.22f, 0.22f, 0.22f, 1f); // private static readonly Color TextColor = new Color(0.9f, 0.9f, 0.9f, 1f); // private static readonly Color BorderColor = new Color(0.15f, 0.15f, 0.15f, 1f); // // static HierarchySeparators() // { // // Subscribe to the hierarchy item GUI event // EditorApplication.hierarchyWindowItemOnGUI += OnHierarchyItemGUI; // } // // private static void OnHierarchyItemGUI(int instanceID, Rect selectionRect) // { // // Get the object from the instance ID // GameObject obj = EditorUtility.EntityIdToObject(instanceID) as GameObject; // // // Trigger only if the name starts with "//" // if (obj != null && obj.name.StartsWith("//")) // { // // 1. Draw Background // EditorGUI.DrawRect(selectionRect, HeaderBackgroundColor); // // // 2. Draw Subtle Bottom Border for better depth // Rect borderRect = new Rect(selectionRect.x, selectionRect.yMax - 1f, selectionRect.width, 1f); // EditorGUI.DrawRect(borderRect, BorderColor); // // // 3. Configure Text Style // GUIStyle headerStyle = new GUIStyle(EditorStyles.boldLabel) // { // alignment = TextAnchor.MiddleCenter, // normal = { textColor = TextColor }, // fontSize = 11, // fontStyle = FontStyle.Bold // }; // // // 4. Clean and Format the string // // Removes "//", trims spaces, and converts to Uppercase // string headerName = obj.name.Replace("//", "").Trim().ToUpper(); // // // 5. Draw the Header Label // EditorGUI.LabelField(selectionRect, headerName, headerStyle); // // // Optional: To prevent selecting the separator as a normal object // // (keeps focus on actual game objects), uncomment the lines below: // // if (Event.current.type == EventType.MouseDown && selectionRect.Contains(Event.current.mousePosition)) // { // Selection.activeGameObject = null; // } // // } // } // } // }