Video Thumbnail

♟️ Chess Multiplayer - Synchronized Start - 3/4 [Unity tutorial 2021][C#]

Mercenary Camp42:02
https://www.youtube.com/watch?v=CVqRyPn9vkY

Содержание

Краткое резюме

В этом видео рассказывается, как добавить поддержку многопользовательской игры в шахматы с использованием сети. Основные задачи: реализовать восстановление локальной игры, создать обмен сообщениями для подключения игроков, назначение команд (белые/черные), и запуск игры при подключении второго игрока. Особое внимание уделяется правильной структуре и сериализации сетевых сообщений, обработке событий на клиенте и сервере, а также переключению камеры в зависимости от команды игрока. Финальная цель — интеграция многопользовательской логики в локальную игру и подготовка к следующему шагу — передаче ходов между игроками.


Введение: Восстановление игры и начало мультиплеера

Видео начинается с объяснения двух основных целей:

  1. Восстановить локальную игру (один игрок на одном устройстве).
  2. Организовать многопользовательскую игру с двумя игроками через сеть.

При подключении к онлайн-игре сервер автоматически назначает игроку команду (белые или черные), и камера переключается на сторону игрока. Пока что передача ходов между клиентами не реализована — это будет в следующем видео.


Создание сообщений для многопользовательской коммуникации

Сообщение 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 в зависимости от роли игрока;
  • Совместное использование кода для локальной и онлайн-игры.

Следующий этап — реализовать передачу ходов, чтобы изменения на доске отражались у обоих игроков в реальном времени.

«Система готова, осталось сделать ход видимым для всех — и игра заиграет полноценным мультиплеером.» 🚀♟️