Перейти к содержимому

TerraForge — безопасное клонирование UI New World

✅ Reproduced 🧪 Case study WorldBox 0.51.2

TerraForge нужно было добавить собственный пресет генератора в ванильную сетку New World, не заменяя стандартные пресеты.

Финальный результат выглядел просто: ещё одна ячейка.

Путь к ней простым не был.

Исследование прошло через несколько неправильных предположений:

  1. поиск предполагаемого контейнера Content;
  2. определение по геометрии;
  3. wrapper-aware scanner;
  4. runtime-логирование родителей кнопок;
  5. обнаружение активного родителя Grid, в котором было 16 прямых Button.

После этого появилась стабильная точка, куда можно было добавить 17-ю ячейку.

Первая прямая реализация клонировала активную ванильную ячейку пресета.

Во время Instantiate скопированный компонент ButtonClickMaptemplate проходил Unity lifecycle и падал внутри ButtonClickMaptemplate.Awake() с NullReferenceException.

Даже после вставки скопированный EventTrigger продолжал ссылаться на ванильное поведение tooltip и мог позже вызвать сломанный путь showTooltip().

Unity-объект может выглядеть как удобный визуальный prefab, но внутри содержать компоненты, которые ожидают очень конкретный ванильный контекст инициализации.

Копируя GameObject, мы копируем и эти предположения.

В TerraForge сработала более безопасная схема:

  1. временно деактивировать исходную ванильную ячейку;
  2. создать clone, пока источник неактивен;
  3. удалить из clone ButtonClickMaptemplate;
  4. удалить скопированный EventTrigger;
  5. сохранить визуальные Button, изображения и layout-компоненты;
  6. добавить собственный обработчик клика TerraForge;
  7. передать продолжение обычной генерации уже корректно инициализированной ванильной кнопке;
  8. активировать безопасный clone.

Так появился 17-й пресет без прежних крашей Awake() и tooltip.

При клонировании ванильного UI разделяйте визуальную структуру и поведенческие компоненты.

Нельзя считать ванильный MonoBehaviour безопасным для копирования только потому, что оригинальный объект уже нормально работает на экране.

Конкретные имена объектов, иерархия и набор компонентов могут измениться. Сам паттерн переиспользуемый, но наблюдение Grid = 16 buttons подтверждено только на тестируемой версии WorldBox.