Подключение и жизненный цикл комнаты
Мультиплеер использует канал GamePush как игровую комнату. Все игроки, подключившиеся с одинаковым channelId, попадают в одну мультиплеерную сессию.
Список методов
Действия:
gp.multiplayer.connect()- подключиться к мультиплеерной комнате. +1 Requestgp.multiplayer.disconnect()- отключиться от текущей комнаты. +1 Request
Свойства:
gp.multiplayer.isConnected- проверить, подключён ли игрок. FREEgp.multiplayer.isHost- проверить, является ли текущий игрок хостом. FREEgp.multiplayer.connectedPlayers- получить список подключённых игроков. FREEgp.multiplayer.networkStats- получить текущие показатели сети. FREE
События:
connectиdisconnect- отслеживать жизненный цикл подключения.playerJoinedиplayerLeft- отслеживать участников комнаты.becameHost,becamePeerиhostMigrated- отслеживать смену роли хоста.error:connect,error:sendStateиerror:disconnect- обрабатывать ошибки мультиплеера.
Выбор канала
Мультиплеер работает на основе каналов 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 });
Подключение к комнате
Подпишитесь на события жизненного цикла, убедитесь, что игрок является участником канала, и подключитесь к комнате:
- JavaScript
- Construct 3
- Unity
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();
Легенда
System
GP_Channels
System›Системный объект Construct 3
GP_Channels›Плагин GamePush Channels
const int channelId = 123;
void OnConnect(GP_Data data)
{
Debug.Log("Connected: " + data.Data);
}
void OnDisconnect(GP_Data data)
{
Debug.Log("Disconnected: " + data.Data);
}
async void ConnectToRoom()
{
GP_Multiplayer.on("connect", OnConnect);
GP_Multiplayer.on("disconnect", OnDisconnect);
await GP_Multiplayer.connect(new MultiplayerChannelQuery
{
channelId = channelId
});
}
При вступлении в приватный канал может быть создана только заявка. Вызывайте gp.multiplayer.connect() после принятия заявки, когда игрок станет участником канала.
Повторный вызов connect() при активном подключении завершится ошибкой.
Текущее состояние подключения
Используйте isConnected, чтобы проверить подключение, и isHost, чтобы узнать роль текущего игрока:
- JavaScript
- Construct 3
- Unity
gp.multiplayer.isConnected;
gp.multiplayer.isHost;
Легенда
GP_Channels
GP_Channels›Плагин GamePush Channels
GP_Multiplayer.isConnected;
GP_Multiplayer.isHost;
Хост выбирается асинхронно. Используйте события ролей для запуска и остановки логики хоста:
- JavaScript
- Construct 3
- Unity
gp.multiplayer.on('becameHost', startHostLogic);
gp.multiplayer.on('becamePeer', stopHostLogic);
Легенда
GP_Channels
GP_Channels›Плагин GamePush Channels
GP_Multiplayer.on("becameHost", StartHostLogic);
GP_Multiplayer.on("becamePeer", StopHostLogic);
Событие hostMigrated содержит идентификаторы предыдущего и нового хоста:
- JavaScript
- Construct 3
- Unity
gp.multiplayer.on('hostMigrated', ({ oldHost, newHost }) => {
console.log(`Host changed from ${oldHost} to ${newHost}`);
});
Легенда
GP_Channels
GP_Channels›Плагин GamePush Channels
void OnHostMigrated(GP_Data data)
{
Debug.Log("Host migrated: " + data.Data);
}
GP_Multiplayer.on("hostMigrated", OnHostMigrated);
Подключённые игроки
- JavaScript
- Construct 3
- Unity
gp.multiplayer.connectedPlayers;
Легенда
System
Text
GP_Channels
System›Системный объект Construct 3
Text — Объект Text (Текст)
GP_Channels›Плагин GamePush Channels
GP_Data connectedPlayers = GP_Multiplayer.connectedPlayers;
Debug.Log(connectedPlayers.Data);
Каждый элемент connectedPlayers содержит:
{
playerId: 123,
isHost: false,
ping: 42,
connectionStability: 1,
sessionDuration: 15000,
}
Статистика сети
SDK предоставляет текущие сетевые показатели:
- JavaScript
- Construct 3
- Unity
const {
ping,
bufferSize,
bufferDelay,
} = gp.multiplayer.networkStats;
Легенда
System
Text
System›Системный объект Construct 3
Text — Объект Text (Текст)
GP_Data networkStats = GP_Multiplayer.networkStats;
Debug.Log(networkStats.Data);
ping— измеренная задержка текущего игрока в миллисекундах.bufferSize— количество снимков в буфере интерполяции.bufferDelay— временной диапазон, покрываемый снимками в буфере.
Эти значения можно использовать в панели отладки и индикаторе качества соединения.
Обработка ошибок
- JavaScript
- Construct 3
- Unity
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);
});
Легенда
GP_Channels
Text
GP_Channels›Плагин GamePush Channels
Text — Объект Text (Текст)
void OnMultiplayerError(GP_Data error)
{
Debug.LogError(error.Data);
}
GP_Multiplayer.on("error:connect", OnMultiplayerError);
GP_Multiplayer.on("error:sendState", OnMultiplayerError);
GP_Multiplayer.on("error:disconnect", OnMultiplayerError);
Отключение и очистка
Остановите игровые циклы перед отключением:
- JavaScript
- Construct 3
- Unity
async function leaveRoom() {
await gp.multiplayer.disconnect({ channelId });
gp.multiplayer.off('connect', onConnect);
gp.multiplayer.off('disconnect', onDisconnect);
}
Легенда
Button
GP_Channels
System
GamePush
Button — Объект Button (Кнопка)
GP_Channels›Плагин GamePush Channels
System›Системный объект Construct 3
GamePush›Плагин GamePush
async void LeaveRoom()
{
await GP_Multiplayer.disconnect(new MultiplayerChannelQuery
{
channelId = channelId
});
GP_Multiplayer.off("connect", OnConnect);
GP_Multiplayer.off("disconnect", OnDisconnect);
}
Если игрок не подключён, вызов disconnect() ничего не делает.
Оставайтесь на связи
С другими документами раздела вы можете ознакомиться здесь. Для начала работы с GamePush ознакомьтесь с нашими туториалами.
Сообщество GamePush в Telegram: @gs_community.
Для ваших обращений e-mail: official@gamepush.com
Желаем вам успехов!