YAML (YAML Ain't Markup Language) — это человекочитаемый формат сериализации данных, который широко применяется в геймдеве для описания конфигураций, диалогов, уровней и баланса. В отличие от JSON, YAML опирается на отступы и допускает комментарии, что делает его удобным для геймдизайнеров и сценаристов, не знакомых с программированием.
Разработка игр требует частой итерации над контентом: параметры оружия, характеристики врагов, ветки диалогов, настройки уровней. Хранить эти данные в коде неудобно, а JSON получается многословным. YAML решает обе проблемы.
Простейший YAML-документ описывает пары ключ-значение. Отступы задаются пробелами, табуляция запрещена.
weapon: name: "Меч рассвета" damage: 42 rarity: legendary two_handed: false
Здесь weapon — это словарь с четырьмя полями. Строки можно брать в кавычки, но при отсутствии спецсимволов они не обязательны.
Списки обозначаются дефисом. В игровых конфигурациях так удобно перечислять предметы, способности или точки спавна.
loot_table:
- id: potion_health
weight: 50
- id: sword_iron
weight: 30
- id: amulet_rare
weight: 5
Каждый элемент списка может быть как скаляром, так и полноценным словарём. Комбинируя списки и словари, можно описывать сколь угодно сложные структуры.
Сценаристы часто предпочитают YAML за возможность писать реплики без экранирования кавычек и переносов строк. Многострочный текст задаётся символом | или >.
npc_blacksmith:
greeting: |
Приветствую, странник.
Мои клинки не ржавеют.
quest:
id: forge_blade
objective: "Принеси 5 кусков руды"
reward: 200_gold
Числовые характеристики удобно выносить в отдельные файлы, чтобы геймдизайнер мог править их без пересборки проекта. YAML поддерживает якоря и ссылки, что позволяет переиспользовать общие блоки.
base_enemy: &base health: 100 speed: 2.5 damage: 10 goblin:Конструкция &base создаёт якорь, а *base — ссылку на него. Слияние << подмешивает поля базового словаря, что сокращает дублирование.
Подводные камни
- Отступы — невидимая ошибка. Смешение табов и пробелов ломает парсинг.
- Неоднозначные типы — строка no может быть прочитана как булево false, поэтому важные строки лучше брать в кавычки.
- Производительность — YAML медленнее бинарных форматов, поэтому крупные массивы данных (например, тайлы карты) обычно хранят иначе.
- Безопасность — при загрузке недоверенных файлов используйте безопасный режим парсера.
Практический пример на Python
Ниже — минимальный загрузчик игрового конфига, который читает YAML и превращает его в структуру данных для движка.
import yaml def load_config(path: str) -> dict: with open(path, "r", encoding="utf-8") as f: data = yaml.safe_load(f) if not isinstance(data, dict): raise ValueError("Корневой элемент должен быть словарём") return data config = load_config("enemies.yaml") for enemy_id, params in config.items(): print(enemy_id, params["health"], params["damage"])Функция safe_load не выполняет произвольный код и подходит для игровых ресурсов, которые могут редактироваться вручную. Обработка ошибок типа ValueError защищает от неожиданной структуры файла.
Итог
YAML занимает нишу между строгим JSON и свободным текстом: он достаточно формален для машинной обработки и достаточно человечен для ручного редактирования. В разработке игр это качество особенно ценно, поскольку над контентом работают не только программисты, но и дизайнеры, сценаристы и художники. Освоив базовый синтаксис, якоря и слияния, команда получает удобный инструмент для описания игрового мира без лишних промежуточных редакторов и скриптов.