using System.Collections.Generic; using UnityEditor; using UnityEngine; [CustomEditor(typeof(RoomVolumeCheck))] public class RoomVolumeCheckEditor : Editor { private bool showEncapsulationBox = true; // Toggle for visualization public override void OnInspectorGUI() { DrawDefaultInspector(); // Keeps default Inspector fields RoomVolumeCheck script = (RoomVolumeCheck)target; GUILayout.Space(10); showEncapsulationBox = EditorGUILayout.Toggle("Show Encapsulation Box", showEncapsulationBox); if (GUILayout.Button("Calculate Encapsulating Box")) { CalculateEncapsulatingBox(script); EditorUtility.SetDirty(script); // Marks script as changed } SceneView.RepaintAll(); // Refresh Scene view to update Gizmos } private void CalculateEncapsulatingBox(RoomVolumeCheck script) { Collider[] colliders = script.GetComponentsInChildren<Collider>(); if (colliders.Length == 0) { Debug.LogWarning("No colliders found in children of " + script.gameObject.name); return; } List<Vector3> worldPoints = new List<Vector3>(); foreach (Collider col in colliders) { Bounds bounds = col.bounds; // World-space bounds Vector3 min = bounds.min; Vector3 max = bounds.max; // Get all 8 corner points worldPoints.Add(new Vector3(min.x, min.y, min.z)); worldPoints.Add(new Vector3(min.x, min.y, max.z)); worldPoints.Add(new Vector3(min.x, max.y, min.z)); worldPoints.Add(new Vector3(min.x, max.y, max.z)); worldPoints.Add(new Vector3(max.x, min.y, min.z)); worldPoints.Add(new Vector3(max.x, min.y, max.z)); worldPoints.Add(new Vector3(max.x, max.y, min.z)); worldPoints.Add(new Vector3(max.x, max.y, max.z)); } // Compute min/max in world space Vector3 minPoint = worldPoints[0]; Vector3 maxPoint = worldPoints[0]; foreach (Vector3 point in worldPoints) { minPoint = Vector3.Min(minPoint, point); maxPoint = Vector3.Max(maxPoint, point); } // Compute encapsulating box Vector3 center = (minPoint + maxPoint) / 2f; Vector3 size = maxPoint - minPoint; // Convert world position to local space script.CheckPosition = script.transform.InverseTransformPoint(center); script.currentSize = size; Debug.Log($"Encapsulating Box Updated! Local Position: {script.CheckPosition}, Size: {size}"); } private void OnSceneGUI() { if (!showEncapsulationBox) return; RoomVolumeCheck script = (RoomVolumeCheck)target; if (script == null) return; Handles.color = Color.magenta; Handles.DrawWireCube(script.gameObject.transform.position + script.CheckPosition, script.currentSize); } }