Сообщения
Сообщения описывают одноразовые действия, которые не нужно хранить и интерполировать как состояние.
Список методов
Действия:
gp.multiplayer.sendMessage()- отправить одноразовое событие другим игрокам. FREE
События:
gp.multiplayer.onMessage()- подписаться на сообщения мультиплеера. FREEgp.multiplayer.offMessage()- отписаться от сообщений мультиплеера. FREE
Используйте сообщения для таких событий, как:
- выстрел игрока;
- взрыв или визуальный эффект;
- эмоция;
- запуск или перезапуск раунда;
- взаимодействие с объектом карты.
Используйте состояние игрока или глобальное состояние, если значение должно сохраняться в последующих снимках.
Получение сообщений
Зарегистрируйте один обработчик и распределяйте сообщения по eventName:
- JavaScript
- Unity
function onMultiplayerMessage({
eventName,
senderId,
data,
timestamp,
}) {
if (eventName === 'shoot') {
createBullet({
ownerId: senderId,
x: data.x,
y: data.y,
direction: data.direction,
});
}
if (eventName === 'emote') {
showEmote(senderId, data.name);
}
}
gp.multiplayer.onMessage(onMultiplayerMessage);
void OnMultiplayerMessage(GP_Data message)
{
Debug.Log(message.Data);
}
GP_Multiplayer.onMessage(OnMultiplayerMessage);
Обработчик получает:
| Поле | Описание |
|---|---|
eventName | Тип сообщения, заданный игрой |
senderId | ID игрока, отправившего сообщение |
data | Произвольные JSON-совместимые данные |
timestamp | Время создания сообщения |
Отправка другим игрокам
Если цель не указана, сообщение отправляется всем остальным игрокам:
- JavaScript
- Unity
gp.multiplayer.sendMessage('shoot', {
x: player.x,
y: player.y,
direction: player.direction,
});
GP_Multiplayer.sendMessage(
"shoot",
new GP_Data(@"{
""x"": 100,
""y"": 200,
""direction"": 1
}")
);
Значение 'all' можно передать явно:
- JavaScript
- Unity
gp.multiplayer.sendMessage(
'roundStarted',
{ round: 2 },
'all',
);
GP_Multiplayer.sendMessage(
"roundStarted",
new GP_Data(@"{ ""round"": 2 }"),
"all"
);
Чтобы отправить сообщение одному игроку, передайте его playerId:
- JavaScript
- Unity
gp.multiplayer.sendMessage(
'privateEmote',
{ name: 'wave' },
targetPlayerId,
);
GP_Multiplayer.sendMessage(
"privateEmote",
new GP_Data(@"{ ""name"": ""wave"" }"),
targetPlayerId
);
Локальная обработка через Echo
По умолчанию отправитель не получает собственное сообщение. Используйте echo: true, чтобы немедленно вызвать тот же локальный обработчик:
- JavaScript
- Unity
gp.multiplayer.sendMessage(
'explosion',
{
x: 320,
y: 180,
radius: 80,
},
{
target: 'all',
echo: true,
},
);
GP_Multiplayer.sendMessage(
"explosion",
new GP_Data(@"{
""x"": 320,
""y"": 180,
""radius"": 80
}"),
new MultiplayerSendMessageOptions
{
target = "all",
echo = true
}
);
Отправитель получает событие локально, не ожидая сетевого обмена. Остальные игроки получают его через мультиплеер обычным способом.
Это удобно, когда все клиенты, включая отправителя, должны выполнить один и тот же обработчик.
Выбор модели авторитетности
Сообщения передают событие, но не проверяют игровые правила. Определите, какой клиент имеет право создавать или подтверждать событие.
Для авторитетных действий пиры могут отправлять запрос, а хост — рассылать подтверждённый результат:
- JavaScript
- Unity
function onMultiplayerMessage({ eventName, senderId, data }) {
if (eventName === 'requestOpenChest' && gp.multiplayer.isHost) {
if (canOpenChest(senderId, data.chestId)) {
openChestInGlobalState(data.chestId);
gp.multiplayer.sendMessage('chestOpened', {
chestId: data.chestId,
playerId: senderId,
});
}
}
}
gp.multiplayer.sendMessage('requestOpenChest', {
chestId: 'chest-7',
});
void RequestOpenChest(string chestId)
{
GP_Multiplayer.sendMessage(
"requestOpenChest",
new GP_Data($@"{{ ""chestId"": ""{chestId}"" }}")
);
}
// На хосте проверьте сообщение из onMessage(), обновите globalState
// и отправьте подтверждённый результат всем игрокам.
Постоянный результат должен находиться в globalState; сообщения представляют запрос и уведомление.
Отписка
Передайте ту же ссылку на функцию, которая использовалась при подписке:
- JavaScript
- Unity
gp.multiplayer.offMessage(onMultiplayerMessage);
GP_Multiplayer.offMessage(OnMultiplayerMessage);
Оставайтесь на связи
С другими документами раздела вы можете ознакомиться здесь. Для начала работы с GamePush ознакомьтесь с нашими туториалами.
Сообщество GamePush в Telegram: @gs_community.
Для ваших обращений e-mail: official@gamepush.com
Желаем вам успехов!