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

Давайте отметим этот элемент как «шаблон». Нажмите три вертикальные точки в правой части шапки элемента и отметьте Является шаблоном. Отметка необязательна - наследование работает и без неё: экземпляры базового объекта получают его поля в любом случае. Однако, помимо смысловой нагрузки, она имеет практическое применение при отслеживании прогресса работы над игрой: в облачной версии отмеченный шаблон не показывается в списке задач.
Теперь щёлкните правой кнопкой по шаблону и выберите Создать экземпляр. IMS Creators создаст новый игровой объект с четырьмя уже определёнными полями - Здоровье, Скорость, Урон, Размер. Назовите его Громила и заполните: Здоровье = 200, Скорость = 15, Урон = 15, Размер = 3. Тяжёлый медленный враг, готов.

А что делать с существующими врагами? Пересоздавать их не нужно. Откройте настройки врага через три вертикальные точки в правой части шапки элемента и найдите поле Тип - оно указывает, от чего элемент наследует. Выберите базовый объект врага, который только что создали, и текущий объект сразу станет экземпляром Врага: появятся общие поля, он будет обновляться вслед за категорией. Все уже введённые значения сохранятся - вы изменяете только схему, существующие данные не теряются.
Игровой объект → Персонаж → Конкретный персонаж
Тот же паттерн для вашей команды. Создайте базовый объект для персонажа, отметьте его шаблоном и задайте поля, которые есть у каждого персонажа:
- Здоровье - Целое число (запас прочности в целых единицах)
- Выносливость - Число (сколько сил осталось до того, как персонаж замедлится)
- Роль - Строка (пока просто строка текста - фиксированный словарь появится на этой неделе)
Создайте экземпляр и назовите его Дмитрий. Поля появятся сами сразу, вам остаётся заполнить только значения: Здоровье = 120, Выносливость = 30, Роль = "Разведчик". А Хлоя, которая живёт в проекте с первой недели, может присоединиться к категории Персонажей без пересоздания: укажите её Тип на базовый объект Персонаж в настройках.
Игровой объект → Игровая карта → Конкретная карта
Колода - новый элемент структуры вашей игры. На первой неделе предметы и способности были просто разрозненными идеями; на этой неделе они становятся игровыми картами - набором карт, которые персонажи разыгрывают и сбрасывают. Каждая карта, какого бы типа она ни была, содержит одни и те же базовые поля:
- Имя - Строка
- Стоимость - Целое число (энергия на разыгрывание карты)
- Урон - Число (удар, который наносит карта)
- Легендарная - Флажок (редкость)
Отметьте базовый объект шаблоном, затем создавайте экземпляры. Легендарная карта Огнетушитель: Имя = Огнетушитель, Стоимость = 6, Урон = 4, Легендарная = да. Стартовая Банановая кожура: Стоимость = 1, Урон = 1, Легендарная = нет. Две карты, одна схема, ноль повторного ввода имён полей.
Если в будущем у каждой карты должно появиться поле Описание, вы добавляете его один раз в базовый объект. Каждый существующий и будущий экземпляр автоматически получает новое поле, изменение распространяется мгновенно - именно ради этого стоит настроить общую схему.
Результат: настроили один раз, пользуйтесь постоянно
Базовый объект определяет, что есть у каждого врага, у каждого персонажа, у каждой карты. Экземпляр - просто одна конкретная версия шаблона.
Практическая выгода: добавление следующего врага, следующего персонажа, следующей карты - заполнение готовой формы. Если что-то нужно изменить, вы правите один раз в базовом объекте, и каждый экземпляр изменяется вслед за ним.
Дальше: научимся связывать карты и персонажей
Шаблоны определили структуру категорий, но карты и персонажи пока по-прежнему в отдельных списках. Завтра появится важное различие: карты будут двух видов - предметы, которые может использовать любой персонаж, и способности, которые принадлежат конкретному персонажу. Мы отразим это различие в геймдизайне с помощью ещё одного уровня наследования и добавим ссылки от каждой карты способности к её владельцу.
Готовы избавиться от рутины при работе с данными? Скачайте IMS Creators, откройте ims.cr5.space/desktop, отметьте один игровой объект шаблоном и создайте первый экземпляр. Несколько минут настройки базового объекта - и добавление следующего элемента займёт две минуты вместо десяти.
Готовы? Свяжите персонажей со способностями, чтобы переименования не ломались - следующий пост в этой серии.
FAQ
Что такое базовый объект в IMS Creators?
Базовый объект - это обычный игровой объект, который используется для порождения новых объектов. Он определяет схему полей - имена и типы, - а любые значения, которые он хранит, становятся значениями по умолчанию для его экземпляров. Новые игровые объекты, созданные из базового, автоматически наследуют его поля.
Как отметить игровой объект как базовый (шаблон)?
Откройте игровой объект, нажмите три вертикальные точки в правой части шапки элемента и включите переключатель Является шаблоном. Обычный шаблон остаётся в дереве проекта как любой другой объект. (Отдельная секция Базовые объекты - для внутренних корневых шаблонов приложения, а не для тех, что вы отмечаете сами.) Главная роль флага - вывести определение категории из отслеживания прогресса: в облачной версии оно не показывается в списке задач, оставляя его для настоящего контента. Создавать экземпляры можно в любом случае.
Как создать экземпляр базового объекта?
Щёлкните правой кнопкой по базовому объекту (или по любому игровому объекту - шаблону или нет) и выберите Создать экземпляр. Появится новый игровой объект с той же схемой полей, унаследованной от базового, готовый к заполнению значений. Отметка шаблоном не обязательна - она лишь убирает элемент из отслеживания прогресса.
Можно ли превратить существующий элемент в экземпляр?
Да. Откройте настройки элемента через три вертикальные точки в правой части шапки элемента, найдите поле Тип и укажите в нём базовый объект. Элемент сразу унаследует общую схему и будет вести себя как любой другой экземпляр - без пересоздания.
Могу ли я добавить кастомное поле в один экземпляр?
Да. Экземпляры наследуют схему базового, но вы можете добавить дополнительные поля к конкретному экземпляру, не затрагивая остальные.
Это то же самое, что дублирование элемента?
Нет. Дублирование копирует элемент с текущими значениями. Создание экземпляра наследует схему полей от базового объекта - вы получаете ту же структуру, но с заполняемыми значениями по умолчанию. Экземпляр остаётся связанным со своим базовым объектом, поэтому изменения схемы автоматически будет распространяться на него.
Где живут базовые объекты в проекте?
Обычные шаблоны - это обычные файлы игровых объектов на диске, и они остаются в дереве проекта как любые другие объекты - внутренне помеченные как шаблоны (isAbstract: true в JSON). Существует также отдельная секция Базовые объекты в приложении (видна в настройках), но она для внутренних корневых шаблонов, которые предоставляет само приложение, а не для тех, что вы отмечаете сами.