Інтеграція 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 при istечення токена. Зберігайте 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 тижні. Вартість розраховується індивідуально.







