using UnityEditor; using UnityEngine; public static class SnapTools { [MenuItem("Tools/Add Intersection &i")] public static void AddIntersection() => AttachRoom("Intersection"); [MenuItem("Tools/Add Hall Part &h")] public static void AddHallPart() => AttachRoom("Hall Part"); [MenuItem("Tools/Add Hall Part 2 &o")] public static void AddHallPart2() => AttachRoom("Hall Part 2"); [MenuItem("Tools/Swap with Prefab &p")] public static void SwapWithPrefab() { foreach (var roomGo in Selection.gameObjects) { var room = roomGo.GetComponent<SnappableRoom>(); if (room != null) { var replacement = SnappableRoom.SpawnRoom(room.name); replacement.Points = replacement.GetComponentsInChildren<SnapPoint>(); for (int i = 0; i < room.Points.Length; i++) { replacement.Points[i].SnapTarget = room.Points[i].SnapTarget; if (replacement.Points[i].SnapTarget != null) replacement.Points[i].SnapTarget.SnapTarget = replacement.Points[i]; } replacement.transform.position = room.transform.position; replacement.transform.rotation = room.transform.rotation; GameObject.DestroyImmediate(room.gameObject); } } } [MenuItem("Tools/Clear All Snaps in Scene")] public static void ClearAllSnaps() { foreach (var snap in GameObject.FindObjectsOfType<SnapPoint>()) snap.SnapTarget = null; } [MenuItem("Tools/Remove Snap Target &c")] public static void RemoveSnapTarget() { if (Selection.activeGameObject.GetComponent<SnapPoint>() != null) Selection.activeGameObject.GetComponent<SnapPoint>().SnapTarget = null; } [MenuItem("Tools/Fix All Snaps in Scene &l")] public static void FixAllSnaps() { foreach (var snap in GameObject.FindObjectsOfType<SnapPoint>()) { if (snap.SnapTarget != null && snap.SnapTarget.SnapTarget == null) { Debug.Log($"Fixed bad snap on {{snap.SnapTarget}}"); if (Vector3.Distance(snap.transform.position, snap.SnapTarget.transform.position) <= 5f) snap.SnapTarget.SnapTarget = snap; } } } public static void AttachRoom(string name) { if (!TryGetSnapPointForAttach(out var selectedPoint)) return; var room = SnappableRoom.SpawnRoom(name); var point = room.NextOpenPoint(); selectedPoint.SnapTarget = point; point.SnapTarget = selectedPoint; point.SnapAndAlign(); var otherPoint = room.NextOpenPoint(); Selection.activeGameObject = otherPoint.gameObject; } static bool TryGetSnapPointForAttach(out SnapPoint selectedPoint) { selectedPoint = Selection.activeGameObject.GetComponent<SnapPoint>(); if (selectedPoint != null) return true; var selectedRoom = Selection.activeGameObject.GetComponent<SnappableRoom>(); if (selectedRoom != null) { selectedPoint = selectedRoom.NextOpenPoint(); if (selectedPoint != null) return true; } var selectedHallPart = Selection.activeGameObject.GetComponent<HallPart>(); if (selectedHallPart != null) { selectedPoint = selectedHallPart.GetComponentInParent<SnapPoint>(); if (selectedPoint != null) return true; } return false; } }