Способность принадлежит одному персонажу? Пусть сама карта скажет, кому - через связь, которая не ломается

Учимся связывать игровые объекты через ссылки, а не названия, чтобы переименование не ломало геймдизайн. Разберём также, как многоуровневое наследование позволяет делать специализированные шаблоны

Этот туториал — часть серии Начало работы — День 3, Неделя 2.

Проблема: переименованный персонаж оставляет устаревшие следы

Вчера игровые понятия получили свои шаблоны: базовые объекты для Врагов, Персонажей и — новый элемент — Игровые карты. Конкретные объекты — это экземпляры, которые теперь автоматически создаются с нужной структурой

Сегодня другугая страшилка: у Дмитрия, которого вы создали вчера, вы решили поменять имя. Дважды кликаете на имя - одно изменение в дереве проекта - и все готово...

Но что, если его имя набрано вручную в дюжине мест? В описании его фирменной способности, в заметках о том, кому достаётся эта карта, в черновике списка колоды. Ни одно из этих мест не обновится при переименовании, потому что каждое хранит имя как статичную строку. Одна маленькая правка — и у вас устаревший документ и рассогласованная колода; чем больше проект, тем больше устаревших следов оставляет одно переименование.

Решение не в том, чтобы помнить все места, где вы записали имя. Оно в том же приёме, что и для структуры: перестать хранить имена и хранить ссылки.

Карты бывают двух видов: предмет и способность

Прежде чем говорить о ссылке, важный факт дизайна игры, которую мы создаем. Ваши игровые карты будут неодинаковы:

  • Карта-предмет - может использовать любой персонаж. Огнетушитель, Банановая кожура - разыгрываются, кем бы их ни держали.
  • Карта-способность - принадлежит одному конкретному персонажу. Только Дмитрий применяет свою фирменную способность, значит, эта карта его.

Это «принадлежит» — отношение между двумя элементами. Сегодня мы сделаем его полноценной частью дизайна — и сделаем это на самой карте.

Многоуровневое наследование: Игровая карта → Карта способности

Вчера создав базовый объект Игровая карта, мы определили, что есть у каждой карты: Имя, Стоимость, Урон, Легендарная. Но у нас будет два вида карт с единственным отличием: у карт способностей есть владелец, у предметов его нет.

Это отлично решается базовыми объектами — ведь базовый объект может сам строиться на другом базовом объекте. Отметьте новый базовый объект как экземпляр Игровой карты — и он наследует всю схему карты. Затем мы лишь добавляем одно свойство — Владелец — к уже существующим:

  • Имя - Строка (унаследовано)
  • Стоимость - Целое число (унаследовано)
  • Урон - Число (унаследовано)
  • Легендарная - Флажок (унаследовано)
  • Владелец - единственное свойство, которое мы добавляем

Назовите этот базовый объект Карта способности. Теперь цепочка читается так: Игровой объект → Игровая карта → Карта способности — каждый уровень наследует всё, что выше, и добавляет своё. Предметы — экземпляры Игровой карты; способности — экземпляры Карты способности.

Владелец - это ссылка, и указывает она только на персонажей

Свойство Владелец — сердце истории. Задайте ему Тип поля Выбор элемента — свойство станет живой ссылкой на другой элемент, а не текстовым значением. И вот приятная деталь: выбор элемента можно ограничить в его настройках. Укажите в параметре свойства ваш базовый объект Персонаж, и меню выбора будет предлагать только персонажей. Не получится сослаться на стену или монету — сам тип свойства указывает, кому карта может принадлежать.

Настройки свойства «Владелец» на базовом объекте «Карта способности»: тип «Выбор элемента» и параметр, указывающий на базовый объект «Персонаж»

Каждая карта способности, порождённая этим базовым объектом, теперь содержит две вещи: полностью унаследованную схему карты и Владельца, которым может быть только персонаж.

Совет: меню выбора умеет не только ограничивать по типу — можно сузить его с помощью условий, отбирая только те элементы, свойства которых удовлетворяют определённым значениям. Например, можно настроить меню выбора так, чтобы оно предлагало только персонажей, у которых Здоровье выше определённого числа. Полный синтаксис условий описан в статье о фильтрах.

Ссылка живёт один раз, на карте

Здесь игровой дизайн перестаёт дублировать текст. Фирменная способность Дмитрия — Дымовая завеса — экземпляр Карты способности. Откройте её и задайте поле Владелец = Дмитрий. Всё: одна ссылка, хранящаяся ровно там, где ей место, — на карте, которая принадлежит ему.

У связи чёткое направление: карта → персонаж. Второе поле для поддержания на персонаже не нужно, никакой список «какие у неё способности» не требуется держать в синхронности. Персонажу не обязательно знать о карте — карта знает о персонаже.

Карты-предметы, в том же повороте, — экземпляры Игровой карты как есть: они вообще не наследуют поле Владелец, ведь его добавляет только Карта способности. Отсутствие владельца означает «может использовать любой». Разница между двумя видами карт становится данными, а не договорённостью из документа.

Переименование безопасно: ссылка следует за элементом

Теперь повторите утреннюю пугающую сцену. Переименуйте Дмитрия во что-то другое. Карта хранит ссылку на него, а ссылка Владелец указывает на элемент, а не на его заголовок — поэтому каждое место, где показывается ссылка, обновится мгновенно, и Владелец карты теперь покажет новое имя. Без поиска, без правок, без устаревших упоминаний. Переименование остаётся одной правкой.

Что дальше: структуры и перечисления

Связи соединяют элементы, и отношение «карта — персонаж» стало настоящими данными. Но значения внутри элементов — всё ещё обычный текст, и «Защитник», где-то набранный как «защитник», будет молча противоречить себе. Завтра: структуры и перечисления — переиспользуемые формы для данных вроде пары «карта + шанс» на враге и фиксированный словарь для Роли персонажа.

Готовы? Стандартизируйте типы врагов структурами и перечислениями - следующий пост в этой серии.


FAQ

Что такое ссылка на элемент в игровом дизайне?

Ссылка на элемент - это связь от одного элемента к другому, которая указывает на постоянный ID, а не на имя. Когда объект переименовывается или редактируется, каждая ссылка на него обновляется автоматически, и документ остаётся согласованным без ручных правок.

Как связать персонажа с его картами способностей в IMS Creators?

Связь создаётся один раз, на карте. Карта способности несёт свойство Владелец типа Выбор элемента, ограниченное базовым объектом Персонаж. Задайте Владельцу персонажа — и связь существует; второе свойство на стороне персонажа поддерживать не нужно.

Что такое многоуровневое наследование?

Базовый объект, построенный на другом базовом объекте. Потомок наследует всю схему полей родителя и добавляет свои собственные. Цепочка Игровой объект → Игровая карта → Карта способности означает, что карты способностей наследуют Имя, Стоимость, Урон и Легендарную из схемы карты, а затем добавляют Владельца.

Почему ссылка живёт на карте, а не на персонаже?

Потому что способность принадлежит ровно одному персонажу — отношение естественно читается от того, чем владеют. Храня ссылку один раз на карте, вы избавляетесь от скопированных имён, которые ломаются при переименовании, а пустой Владелец — чистый способ сказать «предмет — может использовать любой». Чтобы прочитать связи в обратную сторону — какие карты способностей принадлежат персонажу, — используйте Показать связи и смотрите на обратные ссылки; мы разберём это в одном из следующих постов.

Как сделать, чтобы выбор элемента показывал только персонажей?

Задайте свойству тип Выбор элемента, а в параметрах свойства укажите в Тип ваш базовый объект Персонаж. Меню выбора ограничит варианты персонажами, так что ссылка не сможет случайно указать на посторонний элемент.

Можно ли сузить выбор ещё сильнее - показывать только персонажей, соответствующих определённым свойствам?

Да. Помимо ограничения по типу, к меню выбора можно добавить условия — тогда оно будет предлагать только те элементы, свойства которых совпадают с заданными значениями. Например, только персонажей, у которых Здоровье выше определённого числа. Полный синтаксис условий описан в статье о фильтрах.

Сломает ли переименование элемента мои связи?

Нет. Ссылки хранят ID элемента, а не имя, поэтому переименование автоматически обновляет все места, где на элемент ссылаются. Отображаемые заголовки подставляются сразу же.

Поделиться:
Назад к блогу