private void HandleSimpleMode() { var doors = target as Doors; var gameObject = doors.transform.gameObject; var grid = gameObject.GetComponentInChildren <Grid>(); try { var polygon = RoomTemplatesLoader.GetPolygonFromRoomTemplate(doors.gameObject); if (polygon == null) { return; } foreach (var line in polygon.GetLines()) { if (line.Length - 2 * doors.DistanceFromCorners < doors.DoorLength - 1) { continue; } var doorLine = line.Shrink(doors.DistanceFromCorners); var from = doorLine.From; var to = doorLine.To; GridUtils.DrawRectangleOutline(grid, from.ToUnityIntVector3(), to.ToUnityIntVector3(), Color.red, new Vector2(0.1f, 0.1f)); } } catch (ArgumentException) { } }
private void DrawOverlap() { var doors = target as Doors; var go = doors.transform.gameObject; try { var polygon = RoomTemplatesLoader.GetPolygonFromRoomTemplate(doors.gameObject); if (polygon == null) { return; } foreach (var line in polygon.GetLines()) { if (line.Length - 2 * doors.DistanceFromCorners < doors.DoorLength - 1) { continue; } var doorLine = line.Shrink(doors.DistanceFromCorners); var from = doorLine.From; var to = doorLine.To; DrawOutline(new Vector3(Math.Min(from.X, to.X), Math.Min(from.Y, to.Y)), new Vector3(Math.Max(from.X, to.X), Math.Max(from.Y, to.Y)), Color.red); } } catch (ArgumentException) { } }
public Polygon2D(List <Vector2Int> points) { this.points = points; if (!RoomTemplatesLoader.IsClockwiseOriented(points.Select(x => x.ToCustomIntVector2()).ToList())) { this.points.Reverse(); } CheckValidity(); }
private RoomTemplate GetRoomTemplate(GameObject roomTemplatePrefab) { if (prefabToRoomTemplateMapping.ContainsKey(roomTemplatePrefab)) { return(prefabToRoomTemplateMapping[roomTemplatePrefab]); } var roomTemplate = RoomTemplatesLoader.GetRoomTemplate(roomTemplatePrefab); prefabToRoomTemplateMapping.Add(roomTemplatePrefab, roomTemplate); return(roomTemplate); }
private void HandleManualModeInspector() { var doors = target as Doors; var addDoorsNew = GUILayout.Toggle(currentMode == Mode.AddDoors, "Add door positions", GUI.skin.button); var deleteDoorsNew = GUILayout.Toggle(currentMode == Mode.DeleteDoors, "Delete door positions", GUI.skin.button); if (addDoorsNew && currentMode != Mode.AddDoors) { currentMode = Mode.AddDoors; } else if (deleteDoorsNew && currentMode != Mode.DeleteDoors) { currentMode = Mode.DeleteDoors; } else if (!addDoorsNew && !deleteDoorsNew) { currentMode = Mode.Idle; } if (GUILayout.Button("Delete all door positions")) { Undo.RecordObject(target, "Delete all door positions"); doors.DoorsList.Clear(); EditorUtility.SetDirty(target); } // DrawDoorsList(); try { var polygon = RoomTemplatesLoader.GetPolygonFromRoomTemplate(doors.gameObject); var doorPositions = doors.GetDoorMode().GetDoors(polygon); if (doorPositions.Count != doors.DoorsList.Count) { EditorGUILayout.HelpBox( "There seems to be a door of length 1 that is at the corner of the outline, which is currently not supported. Either use outline override to change the outline or remove the door position.", MessageType.Error); } } catch (ArgumentException) { } EditorGUILayout.HelpBox("The visualization of manual doors works differently than that of simple doors. If you want to add, for example, 5 doors of length 1, you have to manually add all 5 doors - not a single door with length 5.", MessageType.Warning); }
public override void OnInspectorGUI() { serializedObject.Update(); var doors = target as Doors; var selectedModeProp = serializedObject.FindProperty(nameof(Doors.SelectedMode)); selectedModeProp.intValue = GUILayout.SelectionGrid(doors.SelectedMode, new[] { "Simple mode", "Specific positions" }, 2); EditorGUILayout.Space(); if (selectedModeProp.intValue == 0) { EditorGUILayout.IntSlider(doorsLength, 1, 10, "Door length"); EditorGUILayout.IntSlider(distanceFromCorners, 0, 10, "Corner distance"); } if (selectedModeProp.intValue == 1) { addSpecificDoorPositions = GUILayout.Toggle(addSpecificDoorPositions, "Add door positions", GUI.skin.button); if (GUILayout.Button("Delete all door positions")) { doorsList.ClearArray(); } try { var polygon = RoomTemplatesLoader.GetPolygonFromRoomTemplate(doors.gameObject); var doorPositions = DoorHandler.DefaultHandler.GetDoorPositions(polygon, doors.GetDoorMode()); if (doorPositions.Count != doors.DoorsList.Count) { EditorGUILayout.HelpBox("There seems to be a door of length 1 that is at the corner of the outline, which is currently not supported. Either use outline override to change the outline or remove the door position.", MessageType.Error); } } catch (Exception) { } } serializedObject.ApplyModifiedProperties(); }
public void OnSceneGUITest(SceneView sceneView) { if (target == null) { #if UNITY_2019_1_OR_NEWER SceneView.duringSceneGui -= OnSceneGUITest; #endif return; } if (PrefabStageUtility.GetCurrentPrefabStage() == null) { #if UNITY_2019_1_OR_NEWER SceneView.duringSceneGui -= OnSceneGUITest; #endif return; } try { var roomTemplate = (RoomTemplate)target; var tilemaps = RoomTemplateUtils.GetTilemaps(roomTemplate.gameObject); var polygon = RoomTemplatesLoader.GetPolygonFromTilemaps(tilemaps); var points = polygon.GetPoints(); Handles.color = Color.yellow; for (int i = 0; i < points.Count; i++) { var point1 = new Vector3(points[i].X, points[i].Y, -1); var point2 = new Vector3(points[(i + 1) % points.Count].X, points[(i + 1) % points.Count].Y, -1); // Handles.DrawLine(point1 + new Vector3(0.5f, 0.5f), point2 + new Vector3(0.5f, 0.5f)); DrawOutline(point1, point2, Color.green); } } catch (ArgumentException) { } }
/// <summary> /// Tries to compute a room template from a given game object and returns the result. /// </summary> /// <param name="roomTemplate"></param> /// <returns></returns> public static ActionResult CheckAll(GameObject roomTemplate) { RoomTemplatesLoader.TryGetRoomTemplate(roomTemplate, out var _, out var result); return(result); }