Exemple #1
0
 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();
                }
            }
        }