Мультиплеер 🥊🥊
Игра потенциально хорошо ложится на мультиплеер. Зная, что если об этом не подумать в начале разработки, можно зайти в тупик через несколько месяцев, когда нужно будет добавлять других игроков в сессию. Поэтому очень много времени сейчас занял мультиплеер. Весь фокус на него.
Напомню, что архитектура игры предполагает такие слои:
🧑🏫 GameAssets — шаблоны игровых объектов. Из них штампуются GameRuntimeObject.
🔨 GameRuntimeObject — источник истины об игре. Все объекты определяются набором своих компонентов. Эти игровые объекты хранятся в RuntimeStore.
👨🍳 RuntimeStore — слой игры для определённых типов объектов. Например, змейки, карта, предметы и т.д.
🙂 GameRuntimeCommands — команды, которые содержат набор параметров и определяют какое-то сложное поведение или инпуты игрока. Например, "Игрок_1 нажал на Space" или "Создай мага с 30 хп".
🏈 Events — реакция определённых объектов на изменения в других объектах.
Цель архитектуры — сделать создание игровых объектов прозрачным, понятным и ооочень гибким.
Мультиплеер в такой системе важно сделать внешним модулем, чтобы он по минимуму определял то, что как создаются ассеты. Условный моддер или геймдизайнер, не должен думать как там устроена пересылка по сети. Максимум, что от него можно попросить, это навесить NetComponent на объект.
Было принято решение, разработать сетевое взаимодействие через "смотрителя" за состоянием игры (далее репликатор). Ядро игры собирает информацию о том, что изменилось и какие команды созданы, а репликатор затем смотрит на это дело и сам решает, что куда отправить.
Сервер рассылает состояние через изменения (дельты) всех объектов, а Клиенты общаются пересылкой команд на Сервер
Для этой задачи попробовал GPT Codex 5.3. Эта штука пропыхтела и выдала рабочий код для подключения, переподключения, пересылки полного снимка сессии и т.д. Сижу разгребаю это добро🙂и понимаю, что по логике вроде всё отработало, но как же плохо там всё написано с точки зрения смысла. Приходится итеративно критиковать, править, тестить, чинить руками. Повторять до готовности 👨🍳