Подключение и жизненный цикл комнаты
Мультиплеер использует канал 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
- 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();
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
- Unity
gp.multiplayer.isConnected;
gp.multiplayer.isHost;
GP_Multiplayer.isConnected;
GP_Multiplayer.isHost;
Хост выбирается асинхронно. Используйте события ролей для запуска и остановки логики хоста:
- JavaScript
- Unity
gp.multiplayer.on('becameHost', startHostLogic);
gp.multiplayer.on('becamePeer', stopHostLogic);
GP_Multiplayer.on("becameHost", StartHostLogic);
GP_Multiplayer.on("becamePeer", StopHostLogic);
Событие hostMigrated содержит идентификаторы предыдущего и нового хоста:
- JavaScript
- Unity
gp.multiplayer.on('hostMigrated', ({ oldHost, newHost }) => {
console.log(`Host changed from ${oldHost} to ${newHost}`);
});
void OnHostMigrated(GP_Data data)
{
Debug.Log("Host migrated: " + data.Data);
}
GP_Multiplayer.on("hostMigrated", OnHostMigrated);
Подключённые игроки
- JavaScript
- Unity
gp.multiplayer.connectedPlayers;
GP_Data connectedPlayers = GP_Multiplayer.connectedPlayers;
Debug.Log(connectedPlayers.Data);
Каждый элемент connectedPlayers содержит:
{
playerId: 123,
isHost: false,
ping: 42,
connectionStability: 1,
sessionDuration: 15000,
}
Статистика сети
SDK предоставляет текущие сетевые показатели:
- JavaScript
- Unity
const {
ping,
bufferSize,
bufferDelay,
} = gp.multiplayer.networkStats;
GP_Data networkStats = GP_Multiplayer.networkStats;
Debug.Log(networkStats.Data);
ping— измеренная задержка текущего игрока в миллисекундах.bufferSize— количество снимков в буфере интерполяции.bufferDelay— временной диапазон, покрываемый снимками в буфере.
Эти значения можно использовать в панели отладки и индикаторе качества соединения.
Обработка ошибок
- JavaScript
- 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);
});
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
- Unity
async function leaveRoom() {
await gp.multiplayer.disconnect({ channelId });
gp.multiplayer.off('connect', onConnect);
gp.multiplayer.off('disconnect', onDisconnect);
}
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
Желаем вам успехов!