Esempio n. 1
0
    void DrawDoors()
    {
        Handles.color = new Color(0.45f, 0.2f, 0.04f);         // Brown
        for (int i = 0; i < doors.Count; i++)
        {
            EditorDoor door = doors[i];
            if (i == GetClosestDoor() && state == RoomState.RemoveDoor)
            {
                Handles.color = Color.red;
            }

            Handles.CubeHandleCap(2, door.Pos, Quaternion.identity, 0.5f, EventType.Repaint);
        }

        Handles.color = Color.white;
    }
Esempio n. 2
0
    void GenerateMesh()
    {
        GameObject           obj   = ((TestScript)target).gameObject;
        HashSet <(int, int)> walls = new HashSet <(int, int)>();

        GameObject roomObj = new GameObject();

        roomObj.transform.parent = obj.transform;
        roomObj.name             = "Rooms";
        foreach (EditorRoom room in rooms)
        {
            GameObject roomObject = new GameObject();
            roomObject.transform.parent = roomObj.transform;
            roomObject.name             = "Rooms";

            MeshRenderer meshRenderer = roomObject.AddComponent <MeshRenderer>();
            MeshFilter   meshFilter   = roomObject.AddComponent <MeshFilter>();
            roomObject.AddComponent <RoomController>();

            Material defaultMat = Resources.Load <Material>("Default");
            meshFilter.mesh       = GenerateFloor(room);
            meshRenderer.material = defaultMat;

            for (int i = 1; i < room.Points.Count; i++)
            {
                int p1 = room.Points[i];
                int p2 = room.Points[i - 1];

                if (p1 < p2)
                {
                    walls.Add((p1, p2));
                }
                else
                {
                    walls.Add((p2, p1));
                }
            }

            int lastP1 = room.Points[0];
            int lastP2 = room.Points[room.Points.Count - 1];

            if (lastP1 < lastP2)
            {
                walls.Add((lastP1, lastP2));
            }
            else
            {
                walls.Add((lastP2, lastP1));
            }
        }

        GameObject wallObj = new GameObject();

        wallObj.transform.parent = obj.transform;
        wallObj.name             = "Walls";
        foreach (var wall in walls)
        {
            Vector3 p1 = points[wall.Item1] + Vector3.up / 2f;
            Vector3 p2 = points[wall.Item2] + Vector3.up / 2f;

            int        doorIndex = GetDoor(wall.Item1, wall.Item2);
            EditorDoor door      = default;
            if (doorIndex != -1)
            {
                door = doors[doorIndex];
            }

            Vector3 half  = (p2 - p1) / 2;
            float   angle = Vector3.SignedAngle(Vector3.right, half.normalized, Vector3.up);

            if (doorIndex == -1)
            {
                GameObject wallObject = Instantiate(Resources.Load <GameObject>("Wall"));
                wallObject.transform.parent     = wallObj.transform;
                wallObject.transform.position   = p1 + half;
                wallObject.transform.localScale = new Vector3(half.magnitude * 2, 2, 0.2f);
                wallObject.transform.rotation   = Quaternion.Euler(0, angle, 0);
            }
            else
            {
                float doorSize   = 1.25f;
                float doorDistP1 = Vector3.Distance(door.Pos, p1) - doorSize / 2;
                float doorDistP2 = Vector3.Distance(door.Pos, p2) - doorSize / 2;

                GameObject wallObject = Instantiate(Resources.Load <GameObject>("Wall"));
                wallObject.transform.parent     = wallObj.transform;
                wallObject.transform.position   = p1 + (p2 - p1).normalized * doorDistP1 / 2;
                wallObject.transform.localScale = new Vector3(doorDistP1, 2, 0.2f);
                wallObject.transform.rotation   = Quaternion.Euler(0, angle, 0);

                wallObject = Instantiate(Resources.Load <GameObject>("Wall"));
                wallObject.transform.parent     = wallObj.transform;
                wallObject.transform.position   = p2 + (p1 - p2).normalized * doorDistP2 / 2;
                wallObject.transform.localScale = new Vector3(doorDistP2, 2, 0.2f);
                wallObject.transform.rotation   = Quaternion.Euler(0, angle, 0);
            }
        }

        GameObject doorObj = new GameObject();

        doorObj.transform.parent = obj.transform;
        doorObj.name             = "Doors";
        for (int i = 0; i < doors.Count; i++)
        {
            EditorDoor door = doors[i];

            Vector3 p1 = points[door.Node1];
            Vector3 p2 = points[door.Node2];

            float angle = Vector3.SignedAngle(Vector3.right, (p2 - p1).normalized, Vector3.up);

            GameObject doorObject = Instantiate(Resources.Load <GameObject>("Door"));
            doorObject.transform.parent   = doorObj.transform;
            doorObject.transform.position = door.Pos;
            doorObject.transform.rotation = Quaternion.Euler(0, angle, 0);

            DoorController doorController = doorObject.GetComponent <DoorController>();
            roomObj.transform.GetChild(door.Room1).GetComponent <RoomController>().AddDoor(doorController);
            roomObj.transform.GetChild(door.Room2).GetComponent <RoomController>().AddDoor(doorController);
        }

        meshGenerated = true;
    }