Возможности каналов
Обзор
На основе каналов можно реализовать различные варианты общения и взаимодействия игроков: чаты и гильдии, списки друзей и ленты активностей, группы, лобби и комнаты. Каналы могут быть настроены достаточно гибко, с их помощью возможно создать пошаговые сражения и даже организовать передачу подарков игрокам.
Возможности применения каналов огромны и зависят только от ваших идей и фантазии
Для начала работы с каналами перейдите в панель управления, выберите добавленную игру. В меню слева выберите Каналы - Добавить канал, подробнее см. в разделе Управление каналами.
Игроки могут самостоятельно создавать каналы. Для этого в панели управления необходимо создать шаблон канала: Каналы - Добавить Шаблон, подробнее см. в разделе Шаблоны:
Рассмотрим концепцию использования каналов на примере:
- 🌳 создания чата локации
- 📢 реализации смены канала
- ⚔️ создания пошаговых сражений
Чат локации
Например, разработчик создал чат с названием Драконий Пик
с идентификатором чата ID: 10
. При заходе в игру каждый игрок подключается к серверу и ждет уведомлений от других игроков или администратора.
SDK делает это автоматически
Если игрок хочет перейти в локацию Драконий Пик
, то это можно реализовать через вступление в канал:
- JavaScript
- Unity
gp.channels.join({ channelId: 10 });
GP_Channels.Join("10");
После того как игрок вступил в канал, он может получать уведомления в этом канале. Присутствие в канале можно использовать как гарантию присутствия игрока на локации в игре. Игрок может поприветствовать других участников чата, отправив сообщение:
- JavaScript
- Unity
gp.channels.sendMessage({
channelId: 10,
text: 'Ребята, всем привет! Тут сильно сложно?',
});
GP_Channels.SendMessage(
channel_ID: 10,
text: "Ребята, всем привет! Тут сильно сложно?"
);
Чтобы остальные игроки могли получить сообщение, на него нужно подписаться. Когда сообщение поступит, оно может быть отрисовано:
- JavaScript
- Unity
// подписка на сообщение
gp.channels.on('event:message', (message) => {
// здесь вы отрисовываете сообщение в чате, пример
mygame.displayMessage(message.player.name, message.text);
});
// подписка на сообщение
private void OnEnable()
{
GP_Channels.OnMessage += OnMessage;
}
// отписка от события
private void OnDisable()
{
GP_Channels.OnMessage += OnMessage;
}
// здесь вы отрисовываете сообщение в чате, пример
private void OnMessage(GP_Data data)
{
var messageData = data.Get<Message_Data>();
Debug.Log("ON MESSAGE EVENT: TEXT: " + messageData.text);
Debug.Log("ON MESSAGE EVENT: PLAYER: NAME: " + messageData.player.name);
}
Смена канала
Повысив уровень, игрок готов перейти в следующую локацию Палата Королей
с идентификатором ID: 11
. Для этого нужно выйти из предыдущего канала Драконий Пик
и вступить в канал Палата Королей
:
- JavaScript
- Unity
// выйти из канала Драконий Пик
gp.channels.leave({ channelId: 10 });
// вступить в канал Палата Королей
gp.channels.join({ channelId: 11 });
// выйти из канала Драконий Пик
GP_Channels.Leave("10");
// вступить в канал Палата Королей
GP_Channels.Join("11");
Пошаговые сражения
Полноценный мультиплеер через каналы сделать не получится, однако можно реализовать пошаговый режим. Идея достаточно проста и заключается в том, чтобы отправлять сообщения в виде лога боя:
> "Игрок 1234" применяет заклинание "Праведный свет" на существо "Зомби 2"
> "Зомби 2" получает 132 урона
> "Зомби 2" атакует "Игрок 1234"
> "Игрок 1234" получает 11 урона
Записи лога боя в таком формате понятны визуально, но с ними может быть тяжело работать в игре. Представим сообщения в виде JSON объектов:
- JavaScript
- Unity
gp.channels.sendMessage({
channelId: 123,
text: JSON.stringify({
type: 'ATTACK',
spell: 'RIGHTEOUS_LIGHT',
target: 'ZOMBIE_2',
}),
});
// структура данных лога боя
[System.Serializable]
public class BattleMove
{
string type;
string spell;
string target;
}
BattleLog log = new BattleLog();
log.type = "ATTACK";
log.spell = "RIGHTEOUS_LIGHT";
log.target = "ZOMBIE_2";
string json = JsonUtility.ToJson(log);
GP_Channels.SendMessage(channel_ID: 123, text: json);
Результат:
> {"type":"ATTACK","spell":"RIGHTEOUS_LIGHT","target":"ZOMBIE_2"}
Чтобы реагировать на получение урона, один из игроков должен взять на себя роль хоста. Обычно эту роль выполняет игрок - владелец канала, именно он будет разыгрывать урон и реакцию монстров.
Для этого подпишемся на сообщения и, если игрок является владельцем канала, то разыграем механику боя:
- JavaScript
- Unity
// подписка на сообщение
gp.channels.on('event:message', (message) => {
// канал боя
if (message.channelId === battleChannel.id) {
// Парсим JSON сообщения
const result = JSON.parse(message.text);
// тип сообщения - атака и владелец канала наш игрок
if (result.type === 'ATTACK' && channel.ownerId === gp.player.id) {
handleAttackMessage(result);
}
// тип сообщения - результат атаки, уведомление для всех, в том числе и владельцу канала
if (result.type === 'ATTACK_RESULT') {
handleAttackResultMessage(result);
}
}
});
// ловим сообщение атаки
function handleAttackMessage(result) {
// получаем тип заклинания
const spell = getSpell(result.spell);
// получаем цель заклинания
const target = getTarget(result.target);
// рассчитываем урон
const damage = spell.damage - target.armor;
// оповещаем всех, что цели был нанесен урон
gp.channels.sendMessage({
channelId: battleChannel.id,
text: JSON.stringify({
type: 'ATTACK_RESULT',
target: 'ZOMBIE_2',
damage: damage,
}),
});
}
// ловим сообщение результата атаки
function handleAttackResultMessage(result) {
// получаем цель заклинания
const target = getTarget(result.target);
// изменяем значение HP цели на урон
target.hp -= result.damage;
}
// структура данных лога боя
[System.Serializable]
public class BattleLog
{
public string type;
public string spell;
public string target;
public int damage = 0;
}
// структура данных цели
public class TargetData
{
public int hp;
public int armor;
}
// структура данных заклинания
public class SpellData
{
public string spellName;
public int damage;
}
// подписка на сообщение
private void OnEnable()
{
GP_Channels.OnMessage += OnMessage;
}
// отписка от события
private void OnDisable()
{
GP_Channels.OnMessage += OnMessage;
}
private void OnMessage(GP_Data data)
{
var messageData = data.Get<Message_Data>();
// канал боя
if(messageData.channelId == battleChannel.id) {
// Парсим JSON сообщения
BattleLog result = JsonUtility.FromJson<BattleLog>(message.text);
// тип сообщения - атака и владелец канала наш игрок
if (result.type == "ATTACK" && messageData.authorId == GP_Player.GetID()) {
HandleAttackMessage(result);
}
// тип сообщения - результат атаки, уведомление для всех, в том числе и владельцу канала
if (result.type == "ATTACK_RESULT") {
HandleAttackResultMessage(result);
}
}
}
// ловим сообщение атаки
private void HandleAttackMessage(BattleLog result)
{
// получаем тип заклинания
SpellData spell = GetSpell(result.spell);
// получаем цель заклинания
TargetData target = GetTarget(result.target);
// рассчитываем урон
int damage = spell.damage - target.armor;
// создаем лог боя
BattleLog log = new BattleLog();
log.type = "ATTACK_RESULT";
log.target = "ZOMBIE_2";
log.damage = damage;
// помещаем лог в JSON
string json = JsonUtility.ToJson(log);
// оповещаем всех, что цели был нанесен урон
GP_Channels.SendMessage(channel_ID: battleChannel.id, text: json);
}
// ловим сообщение результата атаки
private void HandleAttackResultMessage(BattleLog result) {
// получаем цель заклинания
TargetData target = GetTarget(result.target);
// изменяем значение HP цели на урон
target.hp -= result.damage;
}
Оставайтесь на связи
С другими разделами документации вы можете ознакомиться здесь. Для начала работы вы можете ознакомиться с нашими туториалами.
Сообщество GamePush в Telegram
: @gs_community.
Для ваших обращений e-mail
: [email protected]
Желаем вам успехов!