ארכיטקטורת מערכת יצירה למשחקי מובייל
אנו מתכננים מערכות יצירה מאפס. טעויות נפוצות: קידוד מתכונים בצורה קשיחה, הסתמכות על אימות בצד הלקוח, והתעלמות מהתקדמות לא מקוונת. במהלך השנים, יישמנו יצירה למשחקים עם למעלה מ-10 מיליון התקנות. כאן אנו חולקים פתרונות ארכיטקטוניים שחוסכים עד 40% מזמן האינטגרציה.
מערכת יצירה היא מכניקה לשילוב משאבים לקבלת פריטים. במשחקי מובייל, היא נעה מפשוטה (5 אבנים → 1 יהלום) למורכבת (שרשרת של 10 מתכונים עם תחנות והסתברויות שונות). סכמת נתונים נכונה משפיעה על ביצועים והגנה מפני רמאות. לדוגמה, במשחק תפקידים עם 50 מתכונים ו-4 תחנות, ללא אימות שרת הרמאות מגיעה ל-90%.
במקום לאחסן מתכונים בקוד, אנו מעבירים אותם לקונפיגורציות — Remote Config או Addressables. זה מאפשר שינויי איזון ללא עדכון האפליקציה: הגדלת זמן היצירה של חרב נדירה מ-10 ל-15 שניות בכמה קליקים. אימות שרת מפחית את סיכון הרמאות ב-90% למשחקים ממונטיזציה. עלות הפיתוח של מערכת יצירה מחושבת באופן אישי, אך החיסכון התקציבי מארכיטקטורה חכמה יכול להגיע ל-30%. להלן, אנו מפרקים רכיבים מרכזיים באמצעות דוגמאות Unity ו-PlayFab.
למה לאחסן מתכונים כנתונים?
מתכונים מאוחסנים בנוחות כנתונים, לא כלוגיקה. זה מאפשר הוספת מתכונים ללא עדכון אפליקציה — דרך 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 | מזהה הפריט המתקבל |
| ingredients | רשימת מרכיבים עם כמות ודגל צריכה |
| craftingTime | זמן יצירה בשניות (0 — מיידי) |
| successRate | הסתברות להצלחה מ-0 עד 1 |
רשימת המתכונים נטענת בעת ההפעלה מ-ScriptableObject או דרך Addressables.LoadAssetAsync<CraftingDatabase>. לאיזון ללא עדכון, Remote Config מאחסן JSON עם עקיפות. דוגמה: הגדלנו את זמן יצירת החרב מ-10 ל-15 שניות כשהאיזון השתנה.
יישום בדיקת מרכיבים ואימות שרת
האימות הוא דו-צדדי: לקוח לחוויית משתמש (שגיאה מיידית), שרת נגד רמאות. לוגיקת הלקוח ב-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% |
| רב-שלבית | שרשרת יצירות מפריטי ביניים | גבוהה | פלדה מעפרה ופחם → חרב |
קטגוריית היצירה נבחרת לפי ז'אנר. משחקי תפקידים מתאימים לרב-שלבית ומתוזמנת, משחקי קז'ואל מתאימים למיידית והסתברותית.
שלבי פיתוח למערכת יצירה
- ניתוח — הגדרת מכניקות, בניית אב טיפוס.
- עיצוב נתונים — מתכונים, מלאי, משבצות, חוקי שרת.
- יישום — כתיבת CraftingManager, אימות, טיימרים, ממשק משתמש.
- אינטגרציית שרת — PlayFab Cloud Script לאימות.
- בדיקות — עומס, רמאות, תרחישים לא מקוונים.
- פריסה — פרסום תוך עמידה בהנחיות סקירת חנות.
דוגמת מקרה אמיתי
למשחק תפקידים עם 50 מתכונים ו-4 תחנות, יישמנו שרשרת יצירה רב-שלבית. השתמשנו ב-PlayFab לאימות שרת. זמני היצירה נעו בין 10 שניות ל-24 שעות. אימות השרת הפחית את הרמאות לאפס. הפרויקט ארך שבועיים.מה כלול בפיתוח מערכת יצירה
- עיצוב סכמת נתונים למתכונים ומלאי.
- יישום CraftingManager עם בדיקות והסתברויות.
- מערכת יצירה מתוזמנת עם התקדמות לא מקוונת.
- התראות Push מקומיות להשלמת יצירה.
- אימות בצד השרת דרך PlayFab / GameSparks.
- ממשק משתמש: ספר מתכונים, משבצות יצירה, פס התקדמות.
- אירועי אנליטיקה לאיזון פופולריות מתכונים.
לוחות זמנים לפיתוח
יצירה בסיסית (מיידית, ללא טיימרים): 3–5 ימים. מערכת מלאה עם טיימרים, משבצות, אימות שרת וממשק משתמש: 1.5–3 שבועות. העלות מחושבת באופן אישי לאחר הערכת גודל המלאי ומספר המתכונים. אנו מבטיחים פעולה יציבה ועמידה בהנחיות סקירת חנות.
למומחים שלנו יש ניסיון של 10+ שנים בפיתוח מובייל — אנו נתחשב בניואנסים של חתימת קוד ואישורים לפרסום. אנו נעריך את הפרויקט שלך ונציע את הפתרון האופטימלי. בקש פיתוח מערכת יצירה וקבל ארכיטקטורה חזקה. צור קשר לייעוץ.







