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; }
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; }