Засев видов
Сервер сам разрешает сражения. Он применяет формулу урона, бросает случайный разброс урона, решает критические удары и определяет IV, характер, пол и шайни каждого пойманного монстра. Чтобы делать всё это, ему нужны базовые характеристики, типы, коэффициент поимки и соотношение полов каждого вашего вида.
Он не получает их от клиента. Клиент, который мог бы присылать собственные характеристики видов, мог бы прислать что угодно, поэтому сервер отказывается читать их из полезной нагрузки сражения. Он читает их из собственного хранилища, которое изначально пусто.
Что будет, если пропустить это
Ничего заметного. И в этом проблема, которую стоит понять прежде всего.
Незасеянный сервер не выдаёт ошибку, не предупреждает и не отказывается начать сражение. Он идёт по цепочке запасных вариантов:
- Хранилище
species_data— засеянные значения, ваши реальные данные. SPECIES_FALLBACK_TABLE— шесть встроенных видов, жёстко заданных в модуле сервера для его собственных тестов.DEFAULT_SPECIES— одна типовая строка характеристик, применяемая ко всем остальным.
Так что незасеянный сервер преспокойно проводит сражения, в которых у каждого вашего существа
одинаковые подставные характеристики. Пол при поимке определяется ровно 50/50
независимо от вида. Эффективность типов разрешается относительно NORMAL. Никто
не получает сообщения об ошибке, потому что с точки зрения сервера ничего
не пошло не так: он спросил хранилище, в хранилище ничего не было, он использовал значение по умолчанию.
Засев — это то, что делает авторитетный сервер авторитетным над вашей игрой, а не над заглушкой.
Две половины и почему они разделены
Засев намеренно разделён на шаг экспорта внутри Unity и шаг засева вне его.
RPC засева (mce_species_seed) — только от сервера к серверу: она отклоняет любой
вызов с пользовательской сессией и требует HTTP-ключ рантайма Nakama. Этот
ключ — учётные данные администратора: тот, у кого он есть, может писать в хранилище любого игрока.
Его нельзя коммитить, нельзя встраивать в сборку и нельзя
вводить в ScriptableObject.
Поэтому Unity, который не может безопасно хранить этот ключ, лишь записывает файл. Скрипт, запущенный из вашего терминала и читающий ключ из окружения, отправляет его.

Вкладка Seeding в Hub — это путь для покупателя для всего ниже: она экспортирует файлы и сообщает, что в данный момент хранит сервер.
Шаг 1 — Экспорт из Unity
Hub: вкладка Online → Species Data → Export Species Seed JSON (или Export seed files на вкладке Seeding, запускающая все экспортёры, включая виды).
Это читает активную базу данных монстров и записывает два файла в SeedData/
в корне вашего проекта — намеренно вне Assets/, чтобы Unity никогда не импортировал
их и они были покрыты .gitignore:
| Файл | Содержимое |
|---|---|
species-seed.json | Полезная нагрузка для отправки |
species-seed.report.txt | Каждая пропущенная запись и каждое значение, которое сервер заменит |
Читайте отчёт. Сервер ограничивает каждую характеристику диапазоном 1–255 и подставляет собственное значение по умолчанию для всего, что выходит за этот диапазон, молча. Если у одного из ваших видов базовая характеристика равна 0, это значение будет заменено на сервере, и отчёт — единственное место во всём конвейере, где вы вообще увидите об этом упоминание.
Записи пропускаются, а не экспортируются, если у них нет номера декса, номер декса совпадает с другой записью, нет форм или нет первого типа. Каждый из таких случаев указан в отчёте по имени.
Экспортируется только базовая форма каждого вида. Сервер хранит данные вида только по номеру декса, поэтому вторая строка для альтернативной формы перезаписала бы первую.