перемещаю Actor's, компоненты акторов, в основном это статик меши. Изменяю их Location, rotation, scale. Удаляю их и сравню новые.
Задача следующая, нужно организовать две кнопки "Вернуть изменения на шаг назад" (хотя бы до 20 шагов) и шаги вперед.
Как лучше это сделать в теории?
Мб создать массив трансформов , в него записывать изменения и по ним скакать?
Других вариантов нет в природе. По-любому надо сохранять
Ты undo/redo что ли решил изобрести? xD
Только я думаю не массив трансформов, а массив акторов создать, чтобы можно было с резервного актора спаунить удаленный меш
Есть пример как это грамотно сделать?
Оптимизация минус?
Конечно, нажать Ctrl + Z 20 раз. Я просто вопрос твой не очень понял. Ты действительно просто хочешь вернуться в истории изменений на n шагов назад?
У тебя плюсовый проект?
Блупринты
Там проект в одну сцену
В любом случае грамотно будет заносить в массив только то, что действительно необходимо
Скорее всего на блюпринтах так сделать не получится. Может быть в 5-ке, конечно, в какой-то подсистеме есть какие-то блюпринтовые функции для отмены действий на N шагов назад, но надо искать (хотя подозреваю, что их всё же нет). В коде такое сделать несложно. Тут есть пара вариантов: 1. Ты просто пользуешься Undo History и руками отменяешь действия 2. Создаёшь EditorUtilityWidget, в котором в ручном режиме вызываешь методы BeginTransaction и EndTransaction. Это не поможет тебе вернуться на какое-то определённое количество шагов назад, но зато позволит откатиться в строго определённое состояние. Ну т.е. задумывал ты масштабное редактирование объектов, вызываешь BeginTransaction, закончил редактирование - вызываешь EndTranscation. Если что-то не получилось - в буффере отмены у тебя будет твоё действие, оно разом отменит изменения
Вообще у меня был вариант подвязаться на какие-нибудь редакторские делегаты, типа перемещения, помещения на сцену и т.д. Но во-первых, оно всё-равно как-то в голове не укладывается зачем это мудрить, если можно Ctrl + Z нажать. А во-вторых, вообще сходу не ясно что там вынесено в блюпринты, а проверять всё времени не хватит. Ну и интуиция мне подсказывает, что чуваку реально какой-то снапшот во времени был важнее вот этого вот всего и просто транзакции идеально подойдут. Но может я и ошибаюсь :)
А кроме шуток, кстати, вполне себе идея - если тебя интересуют только определённые свойства определённых акторов, то вполне можно сделать как ты сказал, этакий свой кастомный буфер истории. Только всё-равно не ясно нафиг оно вообще понадобилось, пока это делаешь, уже 10 раз бы кубики руками расставил 😆
На счет глобального изменения и записи положения всех акторов разом на сцене задумывался. Но и отказался от этой затеи. В моем случае в проекте реализован режим редактора, где игрок сам может на подготовленную сцену расставить заготовки акторов (стены, мебель и прочее). То есть игрок сам контролирует расположения объектов на сцене. А значит на каждое изменение повешу событие записи в класс событий (буть это transform, или удаление/создание актора). На блупринтах думаю это можно сделать. Но тут загвоздка. Если все изменения записывать в массив transform, то привязать его к определенному актору проблема. Если через массив акторов это так понимаю нужно заспаунить 20 акторов (при условии n=20 шагов) и при каждом событии вносить в них изменения. В принципе реализуемо. Еще вариант создать структуру и записывать все события в нее..
Через структуру все гуд работает 👍 Еще вопрос из теории, как организовать свойство похожее на Surface Snapping при перемещении актора по сцене? В общем при перемещении меша мышью он беспрепядственно проваливается сквозь остальные меши. Можно как нибудь это исправить?
включить surface snapping попробовать)
еще можешь просто заранее подумать про единые размеры, которые кратны размерности в анриле, и ставить все по сетке просто
Подскажите как его включить на игровом уровне? Вот я спауню куб, начинаю его перемещать и он проваливается сквозь остальные меши. Коллизия есть на всех объектах.
что знач на игровом уровне. в рантайме с симуляцией физики?
Без физики, физика не нужна в моем случае. Вот допустим есть комната и мне нужно спаунить объект и допустим прилепить его на стену, на потолок
Обсуждают сегодня