Содержание
-
- Краткое резюме
- Введение: Восстановление игры и начало мультиплеера
- Создание сообщений для многопользовательской коммуникации
- Запуск игры: переход от лобби к игровому процессу
- Управление камерой в зависимости от команды
- Работа с UI и правами ходов игроков
- Восстановление локальной (однопользовательской) игры
- Итоги текущей реализации и план на следующее видео
- Детальный разбор ключевых моментов
Краткое резюме
В этом видео рассказывается, как добавить поддержку многопользовательской игры в шахматы с использованием сети. Основные задачи: реализовать восстановление локальной игры, создать обмен сообщениями для подключения игроков, назначение команд (белые/черные), и запуск игры при подключении второго игрока. Особое внимание уделяется правильной структуре и сериализации сетевых сообщений, обработке событий на клиенте и сервере, а также переключению камеры в зависимости от команды игрока. Финальная цель — интеграция многопользовательской логики в локальную игру и подготовка к следующему шагу — передаче ходов между игроками.
Введение: Восстановление игры и начало мультиплеера
Видео начинается с объяснения двух основных целей:
- Восстановить локальную игру (один игрок на одном устройстве).
- Организовать многопользовательскую игру с двумя игроками через сеть.
При подключении к онлайн-игре сервер автоматически назначает игроку команду (белые или черные), и камера переключается на сторону игрока. Пока что передача ходов между клиентами не реализована — это будет в следующем видео.
Создание сообщений для многопользовательской коммуникации
Сообщение NetWelcome
Клиент при подключении отправляет на сервер сообщение привествия NetWelcome. Его задача:
- Инициировать подключение.
- Получить от сервера назначение команды (team id: 0 или 1).
Реализация сообщения включает:
- Создание двух конструкторов (для отправки и приема).
- Переопределение методов Serialize и Deserialize для правильного упаковки и распаковки данных.
- В качестве полезных данных передается именно идентификатор команды — целое число.
Важно: при сериализации и десериализации данные должны читаться и записываться в том же порядке, иначе возникает повреждение данных.
Обработка сообщений на сервере и клиенте
- На сервере ведётся учёт количества подключенных игроков.
- При подключении игроку присваивается следующая команда (0, затем 1).
- Сервер отсылает клиенту сообщение с назначенной командой.
- Клиент получает это сообщение, распаковывает и сохраняет свой идентификатор команды.
Взаимодействие с сетевой утилитой
Для корректной работы необходимо в списке operation codes (код операций) NetUtility раскомментировать код для welcome, чтобы система умела правильно распознавать и обрабатывать это сообщение.
Запуск игры: переход от лобби к игровому процессу
Дождавшись подключения второго игрока, сервер рассылает всем клиентам сообщение NetStartGame, сигнализирующее о начале партии.
- Сообщение NetStartGame пустое, только триггер запуска.
- На клиенте при получении этого сообщения запускается игра — меняется камера на позицию, соответствующую команде игрока.
Управление камерой в зависимости от команды
Для более удобного обзора игрового поля камеру перемещают к точкам обзора в зависимости от назначенной команды:
- Создается массив игровых объектов с разными углами камеры: меню, белые, черные.
- Для плавного перехода используется пакет Cinemachine.
- При старте игры для каждого игрока камера переключается на соответствующую позицию.
«Игрок сразу видит свою сторону доски, камера плавно меняется с момента начала игры.»
Работа с UI и правами ходов игроков
Убираем меню из игрового интерфейса
Чтобы убрать меню с экрана после старта игры, добавляется слушатель события StartGame в компонент UI. При старте устанавливается триггер в аниматоре, который скрывает меню.
Ограничение ходов по очереди и команде
- При управлении фигурами проверяется текущая очередь и команда игрока.
- Игрок может делать ход только в свой ход и только своими фигурами.
- Исправлена ошибка, где оба игрока могли управлять белыми фигурами.
Восстановление локальной (однопользовательской) игры
Чтобы сохранить возможность локальной игры:
- В классе Chessboard добавлен приватный булев флаг
localGame
. - Игровой UI через событие сообщает о режиме (локальная или онлайн-игра).
- В режиме локальной игры роль обеих команд одновременно управляется одним игроком.
- При установке флага локальная игра стартует с назначением команды 0, сразу начинается партия.
- При смене ходов в локальном режиме переключается команда для управления.
Итоги текущей реализации и план на следующее видео
- Реализована базовая сетевя логика подключения и назначения команд.
- Добавлены сообщения для начала игры.
- Настроены камеры и UI для корректного отображения в мультиплеере.
- Восстановлена локальная игра через имитацию двух игроков на одном устройстве.
- Исправлена логика управления фигурами по командам.
Остаётся добавить в следующем видео важнейшую часть: передачу ходов между игроками, чтобы при ходе одного игрока состояние обновлялось и на стороне второго.
«Мы создали надежный фундамент для мультиплеера — теперь игра понимает, кто за какую сторону и когда можно начать партию.»
Детальный разбор ключевых моментов
Структура и сериализация сообщений
- Важна правильная последовательность записи и чтения данных: сначала всегда читается operation code (байт), затем полезные данные.
- Используются два конструктора: пустой для получения, и с параметрами для отправки.
- Все сообщения наследуются от общего класса NetMessage, что упрощает обработку.
Назначение команд и учет игроков
- Сервер хранит счетчик игроков, увеличивает на 1 при подключении.
- Команды назначаются по порядку: 0 — первый игрок (белые), 1 — второй (черные).
- Клиент не сообщает серверу свою команду — это прерогатива сервера.
Запуск игры при полном составе игроков
- При достижении 2 игроков сервер автоматически рассылает сообщение запуска игры.
- Используется событие Broadcast для оповещения всех клиентов.
- Камера и UI подстраиваются под полученный team id.
Реализация переключения камер с помощью Cinemachine
- Определены 3 положения камеры: меню, белые, черные.
- В сцене созданы пустые объекты с виртуальными камерами.
- При старте игры камера переключается на нужное положение.
Решение проблем с UI и контролем ходов
- Меню скрывается через анимацию сразу после старта.
- В коде добавлена проверка на текущего игрока и очередность ходов, чтобы не было "перекрытия ходов".
- Логика разделена для локальных и онлайн-игр через boolean
localGame
.
Использование событий и паттерна подписки
- Для обработки сетевых сообщений используются event handler-и (подписка на события).
- Позволяет развязать серверный код от конкретных игровых скриптов.
- Упрощает отслеживание и обработку сообщений в разных частях приложения.
Итоги
Мы познакомились с практической реализацией базового мультиплеера в шахматах:
- Правильное построение сетевых сообщений;
- Асинхронное взаимодействие клиента и сервера;
- Назначение команд и управление очередностью ходов;
- Управление камерой и UI в зависимости от роли игрока;
- Совместное использование кода для локальной и онлайн-игры.
Следующий этап — реализовать передачу ходов, чтобы изменения на доске отражались у обоих игроков в реальном времени.
«Система готова, осталось сделать ход видимым для всех — и игра заиграет полноценным мультиплеером.» 🚀♟️