Подключение и жизненный цикл комнаты
Мультиплеер использует канал 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- обрабатывать ошибки мультиплеера.
Выбор канала
Технически для мультиплеера можно использовать любой канал, если:
- все игроки являются участниками канала;
- в канале есть свободные места;
- заявки на вступление в приватный канал уже приняты;
- все игроки подключаются с одинаковым
channelId.
В большинстве игр рекомендуется создавать отдельный канал для каждого лобби или матча. Тогда участники канала соответствуют игрокам, которым разрешён вход в мультиплеерную комнату, а приватность и вместимость канала определяют правила доступа и максимальное количество игроков.
Не используйте большой публичный чат как мультиплеерную комнату. Каждый участник такого канала, подключившийся с его channelId, станет частью одной мультиплеерной сессии.
Создание канала, его вместимость, приватность и управление участниками описаны в разделах Управление каналами и Участники.
Подключение к комнате
Подпишитесь на события жизненного цикла, убедитесь, что игрок является участником канала, и подключитесь к комнате:
- 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
Желаем вам успехов!