Skip to content
Snippets Groups Projects
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;
    }
}