Мультиплеер
Концепция
- Модуль мультиплеера синхронизирует игру в реальном времени между игроками, находящимися в одном канале GamePush.
- Канал используется как игровая комната. Все игроки, подключившиеся с одинаковым
channelId, попадают в одну мультиплеерную сессию. - Перед подключением к мультиплееру игрок должен стать участником канала.
- SDK автоматически выбирает хоста и переносит эту роль, если текущий хост отключился.
- Состояния игроков, состояние общего мира и одноразовые игровые события синхронизируются отдельно.
- SDK автоматически буферизует и интерполирует обновления состояния.
- Доступны два режима синхронизации:
fastс меньшей задержкой иsmoothс более плавным движением.
📄️ Подключение и жизненный цикл комнаты
Мультиплеер использует канал GamePush как игровую комнату. Все игроки, подключившиеся с одинаковым channelId, попадают в одну мультиплеерную сессию.
📄️ Состояние игрока
Состояние игрока содержит данные, которыми управляет отдельный игрок. Каждый игрок отправляет свои обновления хосту, а хост распространяет итоговую карту состояний по комнате.
📄️ Глобальное состояние
Глобальное состояние содержит общие игровые сущности и значения, которыми управляет только хост:
📄️ Сообщения
Сообщения описывают одноразовые действия, которые не нужно хранить и интерполировать как состояние.
📄️ Мультиплеер в Construct 3
Плагин GamePush для Construct 3 включает движок автосинхронизации поверх мультиплеера GamePush. Вы один раз регистрируете объекты, которые нужно синхронизировать, запускаете авто-синк — и дальше плагин делает всё сам:
Хост и пиры
Мультиплеер использует модель Host/Peer:
- Хост принимает обновления игроков, хранит авторитетное состояние и рассылает снимки остальным игрокам.
- Пиры отправляют хосту состояние своего игрока и получают синхронизированное состояние комнаты.
SDK автоматически выбирает хоста и переносит эту роль, если текущий хост отключился или другой игрок оказался более подходящим.
При выборе хоста учитываются стабильность соединения, время в комнате и пинг. Не назначайте постоянного хоста в коде игры. Проверяйте gp.multiplayer.isHost и обрабатывайте события becameHost и becamePeer.
Выбор хоста происходит после подключения и может занять несколько секунд. Не считайте значение gp.multiplayer.isHost окончательным сразу после выполнения connect().
Выбор механизма синхронизации
Для разных типов данных предусмотрены три механизма:
| Механизм | Для чего использовать | Примеры |
|---|---|---|
| Состояние игрока | Данные, которыми управляет отдельный игрок | Координаты, направление, анимация, здоровье |
| Глобальное состояние | Общие сущности и правила, которыми управляет только хост | Враги, предметы, таймер раунда, общий счёт |
| Сообщения | Одноразовые действия, которые не требуется хранить как состояние | Выстрел, взрыв, эмоция, нажатие кнопки |
Не отправляйте постоянно изменяющиеся координаты через сообщения. Используйте состояние игрока или глобальное состояние, чтобы SDK мог буферизовать и интерполировать значения.
Режимы синхронизации
Режим определяет tick rate и размер буфера интерполяции для состояния игроков и глобального состояния.
Fast
- JavaScript
- Unity
gp.multiplayer.setMode('fast');
GP_Multiplayer.setMode(MultiplayerMode.FAST);
- 60 тиков в секунду;
- буфер интерполяции 50–100 мс;
- меньшая задержка и больший сетевой трафик;
- подходит для экшенов, шутеров и гонок.
Smooth
- JavaScript
- Unity
gp.multiplayer.setMode('smooth');
GP_Multiplayer.setMode(MultiplayerMode.SMOOTH);
- 20 тиков в секунду;
- буфер интерполяции 100–300 мс;
- более плавная работа при нестабильном соединении и меньший сетевой трафик;
- подходит для стратегий, настольных и более медленных игр в реальном времени.
Конфигурация SDK по умолчанию соответствует режиму smooth.
Выбирайте режим до запуска игрового цикла. Режим можно изменить во время подключения, но SDK при этом перезапустит циклы тиков и отправки состояния.
Схемы состояния
Состояние игроков и глобальное состояние используют одинаковые настройки полей:
{
x: { interpolate: true },
hp: { interpolate: false },
color: { readonly: true },
}
interpolate: trueплавно изменяет числовое значение между полученными снимками.interpolate: falseприменяет последнее значение без интерполяции.readonly: trueотмечает начальные данные, которые не должны изменяться последующими обновлениями состояния.
Схемы могут содержать вложенные объекты и массивы объектов:
- JavaScript
- Unity
gp.multiplayer.defineGlobalSchema({
enemies: {
id: { readonly: true },
x: { interpolate: true },
y: { interpolate: true },
hp: { interpolate: false },
},
});
GP_Multiplayer.defineGlobalSchema(new GP_Data(@"{
""enemies"": {
""id"": { ""readonly"": true },
""x"": { ""interpolate"": true },
""y"": { ""interpolate"": true },
""hp"": { ""interpolate"": false }
}
}"));
SDK поддерживает jitter buffer и автоматически интерполирует или кратковременно экстраполирует синхронизируемые числовые поля. Игровой код получает готовое состояние без собственной реализации сетевой интерполяции.
Игровая логика и отрисовка
Используйте onTick() для игровой логики, а requestAnimationFrame() — для отрисовки:
- JavaScript
- Unity
function gameTick(delta) {
updateGame(delta);
}
function render() {
drawGame();
requestAnimationFrame(render);
}
gp.multiplayer.onTick(gameTick);
requestAnimationFrame(render);
void GameTick(float delta)
{
UpdateGame(delta);
}
void OnEnable()
{
GP_Multiplayer.onTick(GameTick);
}
void OnDisable()
{
GP_Multiplayer.offTick(GameTick);
}
void Update()
{
DrawGame();
}
Цикл тиков SDK продолжает работать, когда вкладка браузера находится в фоне. Отрисовку можно оставить привязанной к requestAnimationFrame().
Как начать
- Создайте или выберите канал для игровой комнаты.
- Добавьте всех игроков в канал.
- Подпишитесь на события мультиплеера и подключитесь по ID канала.
- Определите схемы состояния игроков и общего мира.
- Выберите режим синхронизации и запустите игровой цикл.
Перейти к подробной документации по мультиплееру 👇
📄️ Подключение и жизненный цикл комнаты
Мультиплеер использует канал GamePush как игровую комнату. Все игроки, подключившиеся с одинаковым channelId, попадают в одну мультиплеерную сессию.
📄️ Состояние игрока
Состояние игрока содержит данные, которыми управляет отдельный игрок. Каждый игрок отправляет свои обновления хосту, а хост распространяет итоговую карту состояний по комнате.
📄️ Глобальное состояние
Глобальное состояние содержит общие игровые сущности и значения, которыми управляет только хост:
📄️ Сообщения
Сообщения описывают одноразовые действия, которые не нужно хранить и интерполировать как состояние.
📄️ Мультиплеер в Construct 3
Плагин GamePush для Construct 3 включает движок автосинхронизации поверх мультиплеера GamePush. Вы один раз регистрируете объекты, которые нужно синхронизировать, запускаете авто-синк — и дальше плагин делает всё сам:
Оставайтесь на связи
С другими документами раздела вы можете ознакомиться здесь. Для начала работы с GamePush ознакомьтесь с нашими туториалами.
Сообщество GamePush в Telegram: @gs_community.
Для ваших обращений e-mail: official@gamepush.com
Желаем вам успехов!