TerraForge — безопасное клонирование UI New World
✅ Reproduced 🧪 Case study WorldBox 0.51.2
TerraForge нужно было добавить собственный пресет генератора в ванильную сетку New World, не заменяя стандартные пресеты.
Финальный результат выглядел просто: ещё одна ячейка.
Путь к ней простым не был.
Как мы нашли нужный Grid
Заголовок раздела «Как мы нашли нужный Grid»Исследование прошло через несколько неправильных предположений:
- поиск предполагаемого контейнера
Content; - определение по геометрии;
- wrapper-aware scanner;
- runtime-логирование родителей кнопок;
- обнаружение активного родителя
Grid, в котором было 16 прямых Button.
После этого появилась стабильная точка, куда можно было добавить 17-ю ячейку.
Небезопасный подход
Заголовок раздела «Небезопасный подход»Первая прямая реализация клонировала активную ванильную ячейку пресета.
Во время Instantiate скопированный компонент ButtonClickMaptemplate проходил Unity lifecycle и падал внутри ButtonClickMaptemplate.Awake() с NullReferenceException.
Даже после вставки скопированный EventTrigger продолжал ссылаться на ванильное поведение tooltip и мог позже вызвать сломанный путь showTooltip().
Unity-объект может выглядеть как удобный визуальный prefab, но внутри содержать компоненты, которые ожидают очень конкретный ванильный контекст инициализации.
Копируя GameObject, мы копируем и эти предположения.
Рабочий подход
Заголовок раздела «Рабочий подход»В TerraForge сработала более безопасная схема:
- временно деактивировать исходную ванильную ячейку;
- создать clone, пока источник неактивен;
- удалить из clone
ButtonClickMaptemplate; - удалить скопированный
EventTrigger; - сохранить визуальные
Button, изображения и layout-компоненты; - добавить собственный обработчик клика TerraForge;
- передать продолжение обычной генерации уже корректно инициализированной ванильной кнопке;
- активировать безопасный clone.
Так появился 17-й пресет без прежних крашей Awake() и tooltip.
Общее правило
Заголовок раздела «Общее правило»При клонировании ванильного UI разделяйте визуальную структуру и поведенческие компоненты.
Нельзя считать ванильный MonoBehaviour безопасным для копирования только потому, что оригинальный объект уже нормально работает на экране.
Что зависит от версии
Заголовок раздела «Что зависит от версии»Конкретные имена объектов, иерархия и набор компонентов могут измениться. Сам паттерн переиспользуемый, но наблюдение Grid = 16 buttons подтверждено только на тестируемой версии WorldBox.