Проблема с Undo.RecordObject (EditorGUI)

Программирование на Юнити.

Проблема с Undo.RecordObject (EditorGUI)

Сообщение LoveUnity 17 авг 2020, 17:51

Хочу воспользоваться Undo.RecordObject, но оно не работает, например после необходимых изменений мною отрисованных handle, в соответствии с моим кодом, в редакторе всё-равно в меню edit показывает последнее событие Undo Selection change, хотя должно быть указанное мною в коде, например Undo MovePoint. Проблема в том, что теряется фокус с объекта, на котором висит кастомный эдитор, когда я кликаю в поле Scene view (при зажатой клавише начинает появляться рамка для выделения объектов, при этом в иерархии выделение с объекта снимается и все мои отрисованные Handles пропадают).
Синтаксис:
Используется csharp
HandleUtility.AddDefaultControl(GUIUtility.GetControlID(FocusType.Passive));

Код выше помогает не снимать фокус с объекта, но ctrl+z всё равно не работает.
В коде ошибок точно нет, и в аналогичном проекте с таким же кодом, и без использования FocusType.Passive все работает нормально.
Может в самом редакторе должна быть какая-то настройка, кто в курсе?
Вот код эдитора:
Синтаксис:
Используется csharp
using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(PathCreator))]
public class PathEditor : Editor
{
        private PathCreator creator;
        private Path path;

        private void OnSceneGUI()
        {
                Input();
                Draw();
        }

        void Input()
        {
                Event guiEvent = Event.current;
                Vector2 mousePos = HandleUtility.GUIPointToWorldRay(guiEvent.mousePosition).origin;

                if (guiEvent.type == EventType.MouseDown && guiEvent.button == 0 && guiEvent.shift)
                {
                        Undo.RecordObject(creator, "Add segment");
                        path.AddSegment(mousePos);
                }
        }

        private void Draw()
        {
                for (int i = 0; i < path.NumSegments; i++)
                {
                        Vector2[] points = path.GetPointsInSegment(i);
                        Handles.color = Color.black;
                        Handles.DrawLine(points[1], points[0]);
                        Handles.DrawLine(points[2], points[3]);
                        Handles.DrawBezier(points[0], points[3], points[1], points[2], Color.green, null, 2);
                }

                Handles.color = Color.red;

                for (int i = 0; i < path.NumPoints; i++)
                {
                        Vector2 newPos = Handles.FreeMoveHandle(path[i], Quaternion.identity, .1f, Vector2.zero, Handles.CylinderHandleCap);

                        if (path[i] != newPos)
                        {
                                Undo.RecordObject(creator, "MovePoint");
                                path.MovePoint(i, newPos);
                        }
                }
        }

        private void OnEnable()
        {
                creator = (PathCreator)target;

                if (creator.path == null)
                {
                        creator.CreatePath();
                }

                path = creator.path;
        }
}
 

Вод видео, как снимается фокус с объекта:
Аватара пользователя
LoveUnity
UNец
 
Сообщения: 13
Зарегистрирован: 22 дек 2019, 07:03

Re: Проблема с Undo.RecordObject (EditorGUI)

Сообщение LoveUnity 22 авг 2020, 16:34

Решено. Добавил в OnSceneGUI() следующую строчку:
Синтаксис:
Используется csharp
HandleUtility.AddDefaultControl(0);

Я в коде FocusType пробовал ставить Passive, а надо было Native, либо просто ноль писать.
Но всё равно странно, у парня с тутора и без этой строчки всё работало, ну да ладно.
Аватара пользователя
LoveUnity
UNец
 
Сообщения: 13
Зарегистрирован: 22 дек 2019, 07:03


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17