Интеграция PlayFab для серверной части мобильной игры
PlayFab — BaaS (Backend as a Service) от Microsoft, заточенный под игры. Предоставляет игровой бэкенд «из коробки»: аутентификация, инвентарь, валюта, магазин, лидерборды, матчмейкинг, Push-уведомления, серверная логика через Cloud Script. Для мобильных игр без собственного backend-разработчика PlayFab закрывает 80% потребностей.
Главный риск при интеграции — не технический. PlayFab предоставляет инструменты, но если архитектура данных спроектирована неправильно (название Title Data, структура Player Data, схема Catalog), потом это переделывается болезненно. На старте стоит потратить время на проектирование.
Инициализация SDK
using PlayFab;
using PlayFab.ClientModels;
public class PlayFabManager : MonoBehaviour
{
public static PlayFabManager Instance { get; private set; }
public string PlayFabId { get; private set; }
void Awake()
{
PlayFabSettings.staticSettings.TitleId = "YOUR_TITLE_ID";
}
// Анонимная авторизация через Device ID
public void LoginAnonymous(Action onSuccess, Action<string> onError)
{
#if UNITY_IOS
PlayFabClientAPI.LoginWithIOSDeviceID(new LoginWithIOSDeviceIDRequest
{
DeviceId = SystemInfo.deviceUniqueIdentifier,
CreateAccount = true,
InfoRequestParameters = new GetPlayerCombinedInfoRequestParams
{
GetPlayerProfile = true,
GetUserInventory = true,
GetUserVirtualCurrency = true
}
}, result => {
PlayFabId = result.PlayFabId;
ApplyPlayerData(result.InfoResultPayload);
onSuccess?.Invoke();
}, error => onError?.Invoke(error.GenerateErrorReport()));
#elif UNITY_ANDROID
PlayFabClientAPI.LoginWithAndroidDeviceID(new LoginWithAndroidDeviceIDRequest
{
AndroidDeviceId = SystemInfo.deviceUniqueIdentifier,
CreateAccount = true,
InfoRequestParameters = new GetPlayerCombinedInfoRequestParams
{
GetPlayerProfile = true,
GetUserInventory = true,
GetUserVirtualCurrency = true
}
}, result => {
PlayFabId = result.PlayFabId;
ApplyPlayerData(result.InfoResultPayload);
onSuccess?.Invoke();
}, error => onError?.Invoke(error.GenerateErrorReport()));
#endif
}
}
InfoRequestParameters при логине — важная оптимизация: получаем инвентарь и валюту одним запросом вместо трёх отдельных вызовов после авторизации.
Инвентарь и Catalog
PlayFab Catalog определяет все предметы в игре. Каждый предмет (CatalogItem) имеет ID, цены в виртуальных валютах, стек (stackable/non-stackable), и кастомные данные (CustomData):
{
"ItemId": "sword_legendary",
"DisplayName": "Легендарный меч",
"VirtualCurrencyPrices": { "GO": 500 },
"Consumable": { "UsageCount": null },
"CustomData": "{\"damage\": 150, \"speed\": 0.8, \"rarity\": \"legendary\"}"
}
Покупка предмета из магазина:
PlayFabClientAPI.PurchaseItem(new PurchaseItemRequest
{
ItemId = "sword_legendary",
VirtualCurrency = "GO", // Gold
Price = 500,
CatalogVersion = "v1"
}, result => {
// result.Items — добавленные предметы
InventoryManager.Instance.RefreshFromPlayFab(result.Items);
}, error => Debug.LogError(error.GenerateErrorReport()));
PlayFab автоматически списывает валюту и добавляет предмет в инвентарь игрока — транзакция атомарна на стороне сервера.
Виртуальные валюты
PlayFab поддерживает до 10 валют на Title. Настраиваем в Game Manager: GO (Gold), GE (Gems), EN (Energy). Пополнение:
// Через Cloud Script — только сервер может начислять валюту
// Клиент вызывает функцию:
PlayFabClientAPI.ExecuteCloudScript(new ExecuteCloudScriptRequest
{
FunctionName = "AddDailyReward",
FunctionParameter = new { rewardType = "daily_login" }
}, result => {
var newBalance = JsonUtility.FromJson<CurrencyResult>(result.FunctionResult.ToString());
CurrencyManager.Instance.UpdateBalance(newBalance);
}, error => { });
Прямое начисление валюты через клиентский API (AddUserVirtualCurrency) возможно, но для production отключают — иначе любой сможет добавить себе золото через перехват запроса.
Player Data и Title Data
Player Data — данные конкретного игрока (прогресс, настройки, сохранения):
// Сохранение прогресса
PlayFabClientAPI.UpdateUserData(new UpdateUserDataRequest
{
Data = new Dictionary<string, string>
{
{ "current_level", currentLevel.ToString() },
{ "inventory_preset", JsonUtility.ToJson(inventoryPreset) }
},
Permission = UserDataPermission.Public // видно другим игрокам (для профиля)
}, null, null);
Title Data — глобальные данные игры, одинаковые для всех (баланс-таблицы, конфигурация событий, строки локализации). Кэшируются на клиенте:
PlayFabClientAPI.GetTitleData(new GetTitleDataRequest
{
Keys = new List<string> { "balance_config", "event_schedule" }
}, result => {
var balanceJson = result.Data["balance_config"];
BalanceManager.Instance.ApplyConfig(balanceJson);
}, null);
Cloud Script: серверная логика
PlayFab Cloud Script — серверные JavaScript-функции. Критические операции (выдача наград, обработка крафтинга, верификация покупок) должны идти через Cloud Script:
// Handlers.js на PlayFab
handlers.CompleteDailyQuest = function(args, context) {
var questId = args.questId;
var playerId = context.playerId;
// Проверяем, что квест реально выполнен
var playerData = server.GetUserData({ PlayFabId: playerId, Keys: ["daily_quests"] });
var quests = JSON.parse(playerData.Data["daily_quests"].Value);
var quest = quests.find(q => q.id === questId);
if (!quest || !quest.isCompleted || quest.rewardClaimed) {
return { success: false, error: "invalid_quest_state" };
}
// Выдаём награду
server.AddUserVirtualCurrency({
PlayFabId: playerId,
VirtualCurrency: "GO",
Amount: quest.reward
});
// Помечаем как выданную
quest.rewardClaimed = true;
server.UpdateUserData({
PlayFabId: playerId,
Data: { "daily_quests": JSON.stringify(quests) }
});
return { success: true, reward: quest.reward };
};
Матчмейкинг
PlayFab Matchmaking (Multiplayer Servers) позволяет создавать тикеты поиска с правилами:
PlayFabMultiplayerAPI.CreateMatchmakingTicket(new CreateMatchmakingTicketRequest
{
Creator = new MatchmakingPlayer
{
Entity = new EntityKey { Id = entityId, Type = "title_player_account" },
Attributes = new MatchmakingPlayerAttributes
{
DataObject = new { rating = playerRating, region = playerRegion }
}
},
GiveUpAfterSeconds = 30,
QueueName = "ranked_1v1"
}, result => {
StartPollingTicket(result.TicketId);
}, error => { });
Правила матчмейкинга (skill range, region preference, latency) настраиваются в Game Manager без изменений кода.
Что входит в работу
- Настройка PlayFab Title: валюты, Catalog, Title Data
- Интеграция SDK (Unity / iOS / Android)
- Аутентификация: Device ID, Email, платформенные аккаунты (Google Play / Game Center)
- Player Data: сохранение и загрузка прогресса
- Инвентарь и магазин с виртуальными валютами
- Cloud Script для критических операций (награды, крафт, квесты)
- Лидерборды и статистика
- Push-уведомления через PlayFab
Сроки
Базовая интеграция (авторизация + инвентарь + лидерборды): 5–7 дней. Полный игровой бэкенд (квесты, крафт, магазин, матчмейкинг): 3–6 недель. Стоимость рассчитывается индивидуально.







