Архітектура системи крафтингу для мобільної гри
Проєктуємо систему крафтингу з нуля. Типові помилки: зберігати рецепти в коді, довіряти клієнтській валідації, ігнорувати офлайн-прогресію. За довгі роки ми реалізували крафтинг для ігор із сукупною аудиторією понад 10 млн встановлень. Ділимося архітектурними рішеннями, які економлять до 40% часу при інтеграції.
Система крафтингу — механіка комбінування ресурсів для отримання предметів. У мобільних іграх вона варіюється від простої (5 каменів → 1 алмаз) до складної (ланцюжок із 10 рецептів з різними станціями та ймовірностями). Від правильної схеми даних залежить продуктивність і захист від зламу. Наприклад, у RPG з 50 рецептами та 4 станціями без серверного контролю читерство сягає 90%.
Замість зберігання рецептів у коді виносимо їх у конфіги — Remote Config або Addressables. Це змінює баланс без оновлення застосунку: збільшити час крафту рідкісного меча з 10 до 15 секунд за пару кліків. А серверна перевірка знижує ризик читерства в 10 разів для ігор з монетизацією. Вартість розробки системи крафтингу починається від $1500 для базового варіанту, а економія бюджету завдяки грамотній архітектурі може сягати $2000 на складних проектах. Нижче розберемо ключові компоненти на прикладах з Unity та PlayFab.
PlayFab Cloud Script використовується для серверної валідації, що дозволяє зменшити кількість порушень у 10 разів порівняно з клієнтською логікою.
Чому рецепти варто зберігати як дані?
Рецепти зручно зберігати як дані, а не як логіку. Це дозволяє додавати рецепти без оновлення застосунку — через Remote Config або Addressables. Використовуємо структуру:
[Serializable]
public class CraftingRecipe
{
public string recipeId;
public string resultItemId;
public int resultQuantity;
public List<Ingredient> ingredients;
public float craftingTime; // секунди, 0 = миттєво
public float successRate; // 0.0-1.0, 1.0 = завжди
public string requiredStation; // "forge", "alchemy_table", null = скрізь
public int requiredLevel;
}
[Serializable]
public class Ingredient
{
public string itemId;
public int quantity;
public bool consumed; // false = інструмент, не витрачається
}
| Параметр | Опис |
|---|---|
| recipeId | Унікальний ідентифікатор рецепту |
| resultItemId | ID предмету-результату |
| ingredients | Список інгредієнтів з кількістю та прапорцем витрати |
| craftingTime | Час крафту в секундах (0 — миттєвий) |
| successRate | Ймовірність успіху від 0 до 1 |
Список рецептів завантажується при старті з ScriptableObject або через Addressables.LoadAssetAsync<CraftingDatabase>. Для балансування без оновлення — Remote Config зберігає JSON з overrides. Приклад: збільшили час крафту меча з 10 до 15 секунд, якщо баланс змістився.
Реалізація перевірки інгредієнтів та серверного контролю
Перевірка двостороння: на клієнті для UX (миттєва помилка), на сервері для захисту від зламу. Клієнтська логіка в CraftingManager:
public class CraftingManager : MonoBehaviour
{
public static CraftingManager Instance { get; private set; }
private CraftingDatabase _database;
private InventoryManager _inventory;
public CraftingResult TryCraft(string recipeId, string stationId = null)
{
var recipe = _database.GetRecipe(recipeId);
if (recipe == null) return CraftingResult.InvalidRecipe;
// Перевірка станції
if (!string.IsNullOrEmpty(recipe.requiredStation) && recipe.requiredStation != stationId)
return CraftingResult.WrongStation;
// Перевірка рівня
if (PlayerData.Level < recipe.requiredLevel)
return CraftingResult.LevelTooLow;
// Перевірка наявності інгредієнтів
foreach (var ingredient in recipe.ingredients)
{
if (_inventory.GetCount(ingredient.itemId) < ingredient.quantity)
return CraftingResult.MissingIngredients;
}
// Ймовірність успіху
bool success = Random.value <= recipe.successRate;
// Списуємо лише витратні інгредієнти
foreach (var ingredient in recipe.ingredients.Where(i => i.consumed))
_inventory.Remove(ingredient.itemId, ingredient.quantity);
if (success)
_inventory.Add(recipe.resultItemId, recipe.resultQuantity);
// Аналітика
GameAnalytics.NewDesignEvent($"Crafting:Result:{recipeId}", success ? 1 : 0);
return success ? CraftingResult.Success : CraftingResult.Failed;
}
}
Для ігор з монетизацією обов'язкова серверна валідація через PlayFab Cloud Script:
// PlayFab Cloud Script
handlers.CraftItem = function(args) {
var recipeId = args.recipeId;
var recipe = getRecipeFromCatalog(recipeId);
// Перевіряємо інвентар на сервері
var inventory = server.GetUserInventory({ PlayFabId: currentPlayerId });
for (var ingredient of recipe.ingredients) {
var count = countItem(inventory, ingredient.itemId);
if (count < ingredient.quantity) {
return { success: false, error: "insufficient_items" };
}
}
// Списуємо та нараховуємо на сервері
for (var ingredient of recipe.ingredients.filter(i => i.consumed)) {
server.RevokeInventoryItems({ ... });
}
server.GrantItemsToUser({ itemIds: [recipe.resultItemId], ... });
return { success: true, resultItemId: recipe.resultItemId };
};
Серверна перевірка запобігає читерству: клієнт може зламати, сервер — ні.
Як організувати крафтинг з таймером та офлайн-прогресію?
Для механіки «запустив і повернись через годину» використовуємо об'єкт слоту:
public class CraftingSlot
{
public string recipeId;
public DateTime completionTime;
public bool isComplete => DateTime.UtcNow >= completionTime;
}
public void StartCrafting(string recipeId, int slotIndex)
{
var recipe = _database.GetRecipe(recipeId);
_craftingSlots[slotIndex] = new CraftingSlot
{
recipeId = recipeId,
completionTime = DateTime.UtcNow.AddSeconds(recipe.craftingTime)
};
// Зберігаємо в PlayerPrefs або Cloud Save
SaveCraftingState();
// Плануємо локальний пуш
NotificationManager.ScheduleLocal(
$"Крафтинг завершено: {recipe.resultItemId}",
recipe.craftingTime
);
}
Стан слотів потрібно персистити. При повторному вході DateTime.UtcNow порівнюється з completionTime: якщо минуло — крафт завершено. Так таймер працює в офлайні.
Типи крафту
| Тип крафту | Опис | Складність | Приклад |
|---|---|---|---|
| Миттєвий | Інгредієнти одразу конвертуються в результат | Низька | 5 каменів → 1 алмаз |
| З таймером | Запуск крафту, очікування завершення | Середня | Створення зілля 30 хв |
| Ймовірнісний | Результат залежить від шансу | Середня | Перетворення руди з шансом 70% |
| Багаторівневий | Ланцюжок крафтів із проміжних предметів | Висока | Сталь із руди та вугілля → меч |
Категорія крафту обирається під жанр. Для RPG підходять багаторівневі та таймерні, для казуальних — миттєві та ймовірнісні.
Етапи розробки системи крафтингу
- Аналіз — визначаємо механіки, будуємо прототип.
- Проєктування даних — рецепти, інвентар, слоти, серверні правила.
- Реалізація — пишемо CraftingManager, валідацію, таймери, UI.
- Інтеграція сервера — PlayFab Cloud Script для валідації.
- Тестування — навантаження, читерство, офлайн-сценарії.
- Деплой — публікація з дотриманням Store Review Guidelines.
Приклад реального кейсу
Для RPG з 50 рецептами та 4 станціями реалізували багаторівневий ланцюжок крафтів. Використали PlayFab для серверної валідації. Час крафту — від 10 секунд до 24 годин. Серверна перевірка знизила читерство до нуля. Проєкт зайняв 2 тижні.Що входить у роботу
- Проєктування схеми даних рецептів та інвентарю.
- Реалізація CraftingManager з перевірками та ймовірностями.
- Система крафтингу з таймерами та офлайн-прогресією.
- Локальні пуш-сповіщення про завершення крафту.
- Серверна валідація через PlayFab / GameSparks.
- UI: рецептбук, слоти крафтингу, прогрес-бар.
- Аналітичні події для балансування популярності рецептів.
- Документація архітектури та інтеграції.
- Надання доступів до серверних конфігів.
- Навчання команди замовника роботі з системою.
- Технічна підтримка на етапі впровадження.
Терміни розробки
Базовий крафтинг (миттєвий, без таймерів): 3–5 днів. Повна система з таймерами, слотами, серверною валідацією та UI: 1,5–3 тижні. Вартість розраховується індивідуально після оцінки обсягу інвентарю та кількості рецептів. Гарантуємо стабільну роботу та дотримання Store Review Guidelines.
Наші спеціалісти мають 10+ років досвіду в мобільній розробці — врахуємо нюанси код-сайнінгу та сертифікатів для публікації. Оцінимо проєкт і запропонуємо оптимальне рішення. Замовте систему крафтингу під ключ – виконаємо за 3-5 днів базовий варіант. Пишіть для обговорення – отримайте надійну архітектуру.







