Интеграция Nakama для серверной части мобильной игры
Nakama — open-source игровой бэкенд от Heroic Labs. Закрывает большую часть серверной инфраструктуры для мобильных игр: аккаунты, социальные функции, leaderboards, матчмейкинг, real-time матчи, хранилище данных. Альтернатива кастомному бэкенду на Go/Node.js для команд, которые хотят быстро запустить мобильную игру без написания серверного кода с нуля.
Подключение клиента
Nakama SDK доступен для Unity, Godot, Unreal, и как REST/WebSocket API для нативного мобильного (iOS Swift SDK, Android Kotlin SDK).
На Unity:
var client = new Client("http", "127.0.0.1", 7350, "defaultkey");
var socket = Socket.From(client);
// Аутентификация через device ID
var session = await client.AuthenticateDeviceAsync(
SystemInfo.deviceUniqueIdentifier,
username: null,
create: true
);
await socket.ConnectAsync(session);
Session автоматически обновляется через client.SessionRefreshAsync при истечении токена. Refresh token хранить в PlayerPrefs или Keychain/Keystore — не в plain SharedPreferences без шифрования.
Хранилище и профиль игрока
Nakama Storage Engine — документное хранилище с управлением доступом:
var writeObject = new WriteStorageObject {
Collection = "player_data",
Key = "inventory",
Value = JsonWriter.ToJson(inventory),
PermissionRead = 1, // Только владелец читает
PermissionWrite = 1 // Только владелец пишет
};
await client.WriteStorageObjectsAsync(session, new[] { writeObject });
Leaderboard с еженедельным reset — одна строка создания через Nakama Console или API. Запись результата: client.WriteLeaderboardRecordAsync(session, "weekly_score", score: 1500). Список лидеров с пагинацией: client.ListLeaderboardRecordsAsync.
Real-time матчи
Nakama поддерживает два типа матчей: relayed (сервер пересылает сообщения между клиентами, логика на клиенте) и authoritative (серверная логика на Lua или TypeScript).
Authoritative матч — кастомный модуль на TypeScript:
const matchInit = (ctx: nkruntime.Context, logger: nkruntime.Logger,
nk: nkruntime.Nakama, params: {[key: string]: string}): {
state: nkruntime.MatchState, tickRate: number, label: string
} => {
return { state: { players: {} }, tickRate: 10, label: "game_room" };
};
const matchLoop = (ctx: nkruntime.Context, logger: nkruntime.Logger,
nk: nkruntime.Nakama, dispatcher: nkruntime.MatchDispatcher,
tick: number, state: nkruntime.MatchState,
messages: nkruntime.MatchMessage[]): nkruntime.MatchState | null => {
// Обработка входящих сообщений, обновление состояния
for (const msg of messages) {
// валидация хода, обновление state
}
dispatcher.broadcastMessage(1, JSON.stringify(state), null, null);
return state;
};
tickRate: 10 — 10 тиков в секунду. Для пошаговых игр можно снизить до 1-2.
Матчмейкинг
var ticket = await client.AddMatchmakerAsync(
session,
query: "+properties.skill:>1200",
minCount: 2,
maxCount: 4,
stringProperties: new Dictionary<string, string> { ["mode"] = "deathmatch" },
numericProperties: new Dictionary<string, double> { ["skill"] = 1500 }
);
socket.ReceivedMatchmakerMatched += matched => {
// Получили матч, подключаемся
socket.JoinMatchAsync(matched.MatchId);
};
Матчмейкер Nakama использует запросы в стиле Bleve Search. +properties.skill:>1200 — найти игроков со скиллом выше 1200. Можно добавить географическую фильтрацию через +properties.region:eu.
Сроки
Базовая интеграция Nakama (аутентификация, хранилище, leaderboard): 3-5 дней. Полноценная система с authoritative матчами, матчмейкингом и социальными функциями: 2-4 недели. Стоимость рассчитывается индивидуально.







