public void OnEnable() { doorsLength = serializedObject.FindProperty(nameof(Doors.DoorLength)); distanceFromCorners = serializedObject.FindProperty(nameof(Doors.DistanceFromCorners)); doorsList = serializedObject.FindProperty(nameof(Doors.DoorsList)); addSpecificDoorPositions = false; hasFirstPoint = false; hasSecondPoint = false; highlightInfo = null; SceneView.RepaintAll(); }
private void HandleAddDoors() { var doors = target as Doors; var gameObject = doors.transform.gameObject; var e = Event.current; var grid = gameObject.GetComponentInChildren <Grid>(); // Make sure that the current active object in the inspector is not deselected Selection.activeGameObject = gameObject; var controlId = GUIUtility.GetControlID(FocusType.Passive); HandleUtility.AddDefaultControl(controlId); // Compute tile position below the mouse cursor var tilePosition = GetCurrentTilePosition(); switch (e.type) { case EventType.MouseDown: if (e.button == 0) { firstPoint = tilePosition; hasFirstTile = true; hasSecondTile = false; e.Use(); } break; case EventType.MouseUp: if (e.button == 0) { if (hasFirstTile) { hasSecondTile = true; } e.Use(); } break; } // If we have the first tile, we can show how would the door look like if we released the mouse button if (hasFirstTile) { var from = firstPoint; var to = tilePosition; if (from.x != to.x && from.y != to.y) { to.x = from.x; } GridUtils.DrawRectangleOutline(grid, from, to, Color.red, new Vector2(0.1f, 0.1f)); // If we also have the second tile, we can complete the door if (hasSecondTile) { hasFirstTile = false; hasSecondTile = false; var newDoorInfo = new DoorInfoEditor() { From = from, To = to, }; if (!doors.DoorsList.Contains(newDoorInfo)) { Undo.RecordObject(target, "Added door position"); doors.DoorsList.Add(newDoorInfo); EditorUtility.SetDirty(target); } } SceneView.RepaintAll(); } }
private void DrawSpecifPositions() { var doors = target as Doors; foreach (var door in doors.DoorsList) { DrawOutline(door.From, door.To, Color.red); } if (highlightInfo != null) { DrawOutline(highlightInfo.From, highlightInfo.To, Color.yellow); } if (deleteDoorPositions) { var go = doors.transform.gameObject; var e = Event.current; Selection.activeGameObject = go; var mouseWorldPosition = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition).origin; mouseWorldPosition -= doors.transform.position; mouseWorldPosition.z = 0; mouseWorldPosition.x = (float)Math.Floor(mouseWorldPosition.x); mouseWorldPosition.y = (float)Math.Floor(mouseWorldPosition.y); var controlId = GUIUtility.GetControlID(FocusType.Passive); HandleUtility.AddDefaultControl(controlId); if (e.type == EventType.MouseUp) { for (int i = doors.DoorsList.Count - 1; i >= 0; i--) { var door = doors.DoorsList[i]; var orthogonalLine = new OrthogonalLine(door.From.RoundToUnityIntVector3(), door.To.RoundToUnityIntVector3()); if (orthogonalLine.Contains(mouseWorldPosition.RoundToUnityIntVector3()) != -1) { Undo.RecordObject(target, "Deleted door position"); doors.DoorsList.RemoveAt(i); EditorUtility.SetDirty(target); } } Event.current.Use(); } } if (addSpecificDoorPositions) { var go = doors.transform.gameObject; var e = Event.current; Selection.activeGameObject = go; var mouseWorldPosition = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition).origin; mouseWorldPosition -= doors.transform.position; mouseWorldPosition.z = 0; mouseWorldPosition.x = (float)Math.Floor(mouseWorldPosition.x); mouseWorldPosition.y = (float)Math.Floor(mouseWorldPosition.y); var controlId = GUIUtility.GetControlID(FocusType.Passive); HandleUtility.AddDefaultControl(controlId); switch (e.type) { case EventType.MouseDown: if (e.button == 0) { firstPoint = mouseWorldPosition; hasFirstPoint = true; hasSecondPoint = false; Event.current.Use(); } break; case EventType.MouseUp: if (e.button == 0) { if (hasFirstPoint) { hasSecondPoint = true; } Event.current.Use(); } break; } if (hasFirstPoint) { highlightInfo = null; var from = firstPoint; var to = mouseWorldPosition; if (from.x != to.x && from.y != to.y) { to.x = from.x; } DrawOutline(from, to, Color.yellow, false); if (hasSecondPoint) { hasFirstPoint = false; hasSecondPoint = false; var newDoorInfo = new DoorInfoEditor() { From = from, To = to, }; if (!doors.DoorsList.Contains(newDoorInfo)) { Undo.RecordObject(target, "Added door position"); doors.DoorsList.Add(newDoorInfo); EditorUtility.SetDirty(target); } } SceneView.RepaintAll(); } } }