-
Tim Gaefgen authoredTim Gaefgen authored
SnapTools.cs 3.59 KiB
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;
}
}