Перейти к основному содержимому

Подключение и жизненный цикл комнаты

Мультиплеер использует канал GamePush как игровую комнату. Все игроки, подключившиеся с одинаковым channelId, попадают в одну мультиплеерную сессию.

Список методов​

Действия:

Свойства:

События:

Выбор канала​

Мультиплеер работает на основе каналов GamePush. Чтобы играть с другими участниками канала, игрок должен состоять в этом канале.

В большинстве игр рекомендуется создавать отдельный канал для каждого лобби или матча. Тогда участники канала соответствуют игрокам, которым разрешён вход в мультиплеерную комнату, а приватность и вместимость канала определяют правила доступа и максимальное количество игроков.

Не используйте большой публичный чат как мультиплеерную комнату. Каждый участник такого канала, подключившийся с его channelId, станет частью одной мультиплеерной сессии.

Создание канала, его вместимость, приватность и управление участниками описаны в разделах Управление каналами и Участники.

Выбор хаба​

Каналы, в том числе комнаты мультиплеера, размещаются на хабах RU, EU, NA и APAC. Чтобы найти существующую комнату перед connect, используйте gp.channels.fetchChannels.

В fetchChannels есть фильтр location, который ограничивает поиск одним хабом. Для поиска настройте фильтр:

  • location: gp.player.location для поиска по хабу, рекомендованному игроку по стране запроса (доступно после синхронизации игрока);
  • location: 'AUTO' — сервер определит подходящий хаб по стране текущего запроса и вернёт его каналы;
  • location: 'RU' для поиска по конкретному хабу RU;
  • без фильтра location для поиска по всем хабам.

Используя этот поиск, разработчик может реализовать подбор матча по региону или экран со списком доступных игроку каналов. Если подходящих комнат нет, игра должна сама решать, что делать дальше: создать комнату, просто сообщить игроку, что комнат нет, или повторить поиск на других хабах.

В настройках шаблона канала в поле «Локация» можно закрепить нужный хаб, и все созданные по этому шаблону каналы будут размещаться на указанном хабе.

Фильтр доступен в JavaScript SDK. См. Получить список каналов.

const { items } = await gp.channels.fetchChannels({
tags: ['lobby'],
location: gp.player.location, // или 'AUTO', 'RU', 'EU', 'NA', 'APAC'
limit: 20,
});

const channel = items.find((item) => item.membersCount < item.capacity) || items[0];

if (!channel) {
throw new Error('No lobby in this region');
}

if (!channel.isJoined) {
await gp.channels.join({ channelId: channel.id });
}

await gp.multiplayer.connect({ channelId: channel.id });

Подключение к комнате​

Подпишитесь на события жизненного цикла, убедитесь, что игрок является участником канала, и подключитесь к комнате:

const channelId = 123;

function onConnect({ success }) {
console.log('Connected:', success);
}

function onDisconnect({ reason }) {
console.log('Disconnected:', reason);
}

gp.multiplayer.on('connect', onConnect);
gp.multiplayer.on('disconnect', onDisconnect);

async function connectToRoom() {
const channel = await gp.channels.fetchChannel({ channelId });

if (!channel.isJoined) {
await gp.channels.join({ channelId });
}

await gp.multiplayer.connect({ channelId });
}

await connectToRoom();
warning

При вступлении в приватный канал может быть создана только заявка. Вызывайте gp.multiplayer.connect() после принятия заявки, когда игрок станет участником канала.

Повторный вызов connect() при активном подключении завершится ошибкой.

Текущее состояние подключения​

Используйте isConnected, чтобы проверить подключение, и isHost, чтобы узнать роль текущего игрока:

gp.multiplayer.isConnected;
gp.multiplayer.isHost;

Хост выбирается асинхронно. Используйте события ролей для запуска и остановки логики хоста:

gp.multiplayer.on('becameHost', startHostLogic);
gp.multiplayer.on('becamePeer', stopHostLogic);

Событие hostMigrated содержит идентификаторы предыдущего и нового хоста:

gp.multiplayer.on('hostMigrated', ({ oldHost, newHost }) => {
console.log(`Host changed from ${oldHost} to ${newHost}`);
});

Подключённые игроки​

gp.multiplayer.connectedPlayers;

Каждый элемент connectedPlayers содержит:

{
playerId: 123,
isHost: false,
ping: 42,
connectionStability: 1,
sessionDuration: 15000,
}

Статистика сети​

SDK предоставляет текущие сетевые показатели:

const {
ping,
bufferSize,
bufferDelay,
} = gp.multiplayer.networkStats;
  • ping — измеренная задержка текущего игрока в миллисекундах.
  • bufferSize — количество снимков в буфере интерполяции.
  • bufferDelay — временной диапазон, покрываемый снимками в буфере.

Эти значения можно использовать в панели отладки и индикаторе качества соединения.

Обработка ошибок​

gp.multiplayer.on('error:connect', (error) => {
console.error('Could not connect to multiplayer:', error);
});

gp.multiplayer.on('error:sendState', (error) => {
console.error('Could not send multiplayer state:', error);
});

gp.multiplayer.on('error:disconnect', (error) => {
console.error('Could not disconnect from multiplayer:', error);
});

Отключение и очистка​

Остановите игровые циклы перед отключением:

async function leaveRoom() {
await gp.multiplayer.disconnect({ channelId });

gp.multiplayer.off('connect', onConnect);
gp.multiplayer.off('disconnect', onDisconnect);
}

Если игрок не подключён, вызов disconnect() ничего не делает.

Оставайтесь на связи​

С другими документами раздела вы можете ознакомиться здесь. Для начала работы с GamePush ознакомьтесь с нашими туториалами.

Сообщество GamePush в Telegram: @gs_community.

Для ваших обращений e-mail: official@gamepush.com

Желаем вам успехов!