// =============================================================================== // HierarchyEnhancer - Quick Toggle for GameObjects // // Creator: Scove // Last Updated: 2024-05-08 // Version: 2.0 // // Purpose: // Adds a handy toggle checkbox to the right side of every item in the Hierarchy. // This allows you to enable or disable GameObjects instantly without selecting them. // // Key Features: // 1. One-click activation/deactivation directly in Hierarchy. // 2. Full Undo/Redo support integrated with Unity's system. // 3. Optimized UI placement to avoid overlapping with object names. // 4. Visual clarity: Helps quickly identify inactive objects in a complex tree. // // How to Use: // 1. Place this script in an 'Editor' folder. // 2. Look at your Hierarchy window; a small checkbox will appear on the far right. // 3. Click the checkbox to toggle the Active/Inactive state of any GameObject. // =============================================================================== using UnityEditor; using UnityEngine; namespace Editor { [InitializeOnLoad] public class HierarchyEnhancer { // Define the width of the toggle area private const float TOGGLE_WIDTH = 16f; static HierarchyEnhancer() { // Subscribe to the hierarchy item GUI event EditorApplication.hierarchyWindowItemOnGUI += OnHierarchyItemGUI; } private static void OnHierarchyItemGUI(int instanceID, Rect selectionRect) { // Get the GameObject associated with this instance ID GameObject obj = EditorUtility.EntityIdToObject(instanceID) as GameObject; if (obj == null) return; // Calculate the position for the Toggle (Aligned to the far right) // selectionRect.xMax gives us the right boundary of the Hierarchy row Rect toggleRect = new Rect(selectionRect); toggleRect.x = selectionRect.xMax - TOGGLE_WIDTH; toggleRect.width = TOGGLE_WIDTH; // Check current active state bool isActive = obj.activeSelf; // Handle UI and changes EditorGUI.BeginChangeCheck(); // Set the color based on active state (Optional polish) Color originalColor = GUI.color; if (!isActive) GUI.color = new Color(1f, 1f, 1f, 0.5f); // Dim the toggle if inactive bool newActive = EditorGUI.Toggle(toggleRect, isActive); GUI.color = originalColor; // Restore original color for other elements if (EditorGUI.EndChangeCheck()) { // Record undo before applying the change Undo.RecordObject(obj, "Toggle GameObject Active State"); obj.SetActive(newActive); // If it's a Prefab, mark the scene as dirty to ensure it saves if (!Application.isPlaying) { EditorUtility.SetDirty(obj); } } } } }