Этот туториал — часть серии Начало работы — День 3, Неделя 2.
Проблема: переименованный персонаж оставляет устаревшие следы
Вчера игровые понятия получили свои шаблоны: базовые объекты для Врагов, Персонажей и — новый элемент — Игровые карты. Конкретные объекты — это экземпляры, которые теперь автоматически создаются с нужной структурой
Сегодня другугая страшилка: у Дмитрия, которого вы создали вчера, вы решили поменять имя. Дважды кликаете на имя - одно изменение в дереве проекта - и все готово...
Но что, если его имя набрано вручную в дюжине мест? В описании его фирменной способности, в заметках о том, кому достаётся эта карта, в черновике списка колоды. Ни одно из этих мест не обновится при переименовании, потому что каждое хранит имя как статичную строку. Одна маленькая правка — и у вас устаревший документ и рассогласованная колода; чем больше проект, тем больше устаревших следов оставляет одно переименование.
Решение не в том, чтобы помнить все места, где вы записали имя. Оно в том же приёме, что и для структуры: перестать хранить имена и хранить ссылки.
Карты бывают двух видов: предмет и способность
Прежде чем говорить о ссылке, важный факт дизайна игры, которую мы создаем. Ваши игровые карты будут неодинаковы:
- Карта-предмет - может использовать любой персонаж. Огнетушитель, Банановая кожура - разыгрываются, кем бы их ни держали.
- Карта-способность - принадлежит одному конкретному персонажу. Только Дмитрий применяет свою фирменную способность, значит, эта карта его.
Это «принадлежит» — отношение между двумя элементами. Сегодня мы сделаем его полноценной частью дизайна — и сделаем это на самой карте.
Многоуровневое наследование: Игровая карта → Карта способности
Вчера создав базовый объект Игровая карта, мы определили, что есть у каждой карты: Имя, Стоимость, Урон, Легендарная. Но у нас будет два вида карт с единственным отличием: у карт способностей есть владелец, у предметов его нет.
Это отлично решается базовыми объектами — ведь базовый объект может сам строиться на другом базовом объекте. Отметьте новый базовый объект как экземпляр Игровой карты — и он наследует всю схему карты. Затем мы лишь добавляем одно свойство — Владелец — к уже существующим:
- Имя - Строка (унаследовано)
- Стоимость - Целое число (унаследовано)
- Урон - Число (унаследовано)
- Легендарная - Флажок (унаследовано)
- Владелец - единственное свойство, которое мы добавляем
Назовите этот базовый объект Карта способности. Теперь цепочка читается так: Игровой объект → Игровая карта → Карта способности — каждый уровень наследует всё, что выше, и добавляет своё. Предметы — экземпляры Игровой карты; способности — экземпляры Карты способности.
Владелец - это ссылка, и указывает она только на персонажей
Свойство Владелец — сердце истории. Задайте ему Тип поля Выбор элемента — свойство станет живой ссылкой на другой элемент, а не текстовым значением. И вот приятная деталь: выбор элемента можно ограничить в его настройках. Укажите в параметре свойства ваш базовый объект Персонаж, и меню выбора будет предлагать только персонажей. Не получится сослаться на стену или монету — сам тип свойства указывает, кому карта может принадлежать.

Каждая карта способности, порождённая этим базовым объектом, теперь содержит две вещи: полностью унаследованную схему карты и Владельца, которым может быть только персонаж.
Совет: меню выбора умеет не только ограничивать по типу — можно сузить его с помощью условий, отбирая только те элементы, свойства которых удовлетворяют определённым значениям. Например, можно настроить меню выбора так, чтобы оно предлагало только персонажей, у которых
Здоровьевыше определённого числа. Полный синтаксис условий описан в статье о фильтрах.
Ссылка живёт один раз, на карте
Здесь игровой дизайн перестаёт дублировать текст. Фирменная способность Дмитрия — Дымовая завеса — экземпляр Карты способности. Откройте её и задайте поле Владелец = Дмитрий. Всё: одна ссылка, хранящаяся ровно там, где ей место, — на карте, которая принадлежит ему.
У связи чёткое направление: карта → персонаж. Второе поле для поддержания на персонаже не нужно, никакой список «какие у неё способности» не требуется держать в синхронности. Персонажу не обязательно знать о карте — карта знает о персонаже.
Карты-предметы, в том же повороте, — экземпляры Игровой карты как есть: они вообще не наследуют поле Владелец, ведь его добавляет только Карта способности. Отсутствие владельца означает «может использовать любой». Разница между двумя видами карт становится данными, а не договорённостью из документа.
Переименование безопасно: ссылка следует за элементом
Теперь повторите утреннюю пугающую сцену. Переименуйте Дмитрия во что-то другое. Карта хранит ссылку на него, а ссылка Владелец указывает на элемент, а не на его заголовок — поэтому каждое место, где показывается ссылка, обновится мгновенно, и Владелец карты теперь покажет новое имя. Без поиска, без правок, без устаревших упоминаний. Переименование остаётся одной правкой.
Что дальше: структуры и перечисления
Связи соединяют элементы, и отношение «карта — персонаж» стало настоящими данными. Но значения внутри элементов — всё ещё обычный текст, и «Защитник», где-то набранный как «защитник», будет молча противоречить себе. Завтра: структуры и перечисления — переиспользуемые формы для данных вроде пары «карта + шанс» на враге и фиксированный словарь для Роли персонажа.
Готовы? Стандартизируйте типы врагов структурами и перечислениями - следующий пост в этой серии.
FAQ
Что такое ссылка на элемент в игровом дизайне?
Ссылка на элемент - это связь от одного элемента к другому, которая указывает на постоянный ID, а не на имя. Когда объект переименовывается или редактируется, каждая ссылка на него обновляется автоматически, и документ остаётся согласованным без ручных правок.
Как связать персонажа с его картами способностей в IMS Creators?
Связь создаётся один раз, на карте. Карта способности несёт свойство Владелец типа Выбор элемента, ограниченное базовым объектом Персонаж. Задайте Владельцу персонажа — и связь существует; второе свойство на стороне персонажа поддерживать не нужно.
Что такое многоуровневое наследование?
Базовый объект, построенный на другом базовом объекте. Потомок наследует всю схему полей родителя и добавляет свои собственные. Цепочка Игровой объект → Игровая карта → Карта способности означает, что карты способностей наследуют Имя, Стоимость, Урон и Легендарную из схемы карты, а затем добавляют Владельца.
Почему ссылка живёт на карте, а не на персонаже?
Потому что способность принадлежит ровно одному персонажу — отношение естественно читается от того, чем владеют. Храня ссылку один раз на карте, вы избавляетесь от скопированных имён, которые ломаются при переименовании, а пустой Владелец — чистый способ сказать «предмет — может использовать любой». Чтобы прочитать связи в обратную сторону — какие карты способностей принадлежат персонажу, — используйте Показать связи и смотрите на обратные ссылки; мы разберём это в одном из следующих постов.
Как сделать, чтобы выбор элемента показывал только персонажей?
Задайте свойству тип Выбор элемента, а в параметрах свойства укажите в Тип ваш базовый объект Персонаж. Меню выбора ограничит варианты персонажами, так что ссылка не сможет случайно указать на посторонний элемент.
Можно ли сузить выбор ещё сильнее - показывать только персонажей, соответствующих определённым свойствам?
Да. Помимо ограничения по типу, к меню выбора можно добавить условия — тогда оно будет предлагать только те элементы, свойства которых совпадают с заданными значениями. Например, только персонажей, у которых Здоровье выше определённого числа. Полный синтаксис условий описан в статье о фильтрах.
Сломает ли переименование элемента мои связи?
Нет. Ссылки хранят ID элемента, а не имя, поэтому переименование автоматически обновляет все места, где на элемент ссылаются. Отображаемые заголовки подставляются сразу же.