הטמעת מכניקת Gacha/Lootbox במשחק מובייל
תארו לעצמכם: משחק ה-RPG שלכם כמעט מוכן, רק ה-gacha נשאר לשלב, אבל בדיקות משתמשים מראות ששחקנים עוזבים אחרי 50 גלגולים ללא פריט אגדי — שילוב ללא מערכת pity הורג את שימור השחקנים. או גרוע מכך: אתם משחררים עדכון, ולמחרת ה-App Store דוחה אותו — ההסתברויות לא מוצגות. בעיות כאלה עולות כסף: עבודה חוזרת ומודרציה חוזרת יכולות לקחת שבועות, בזמן שמתחרים גונבים לכם את הקהל. אנחנו עוזרים להימנע מכך: תוך 3–4 ימים אנו מקימים gacha בסיסי עם מנגנוני הגנה, תוך 7–10 ימים מערכת מלאה עם באנרים, אנימציות ודוחות לחנות האפליקציות. הניסיון שלנו: מעל 40 פרויקטים, כל אחד עבר את הביקורת בניסיון הראשון. אל תסכנו את השחרור שלכם — צרו קשר לבדיקת המכניקות הנוכחיות שלכם.
מודל הסתברות מתמטי
Gacha בסיסי הוא בחירה אקראית משוקללת ממאגר פרסים. יישום פשוט:
data class GachaItem(val id: String, val rarity: Rarity, val weight: Int)
fun rollGacha(pool: List<GachaItem>): GachaItem {
val totalWeight = pool.sumOf { it.weight }
var random = Random.nextInt(totalWeight)
for (item in pool) {
random -= item.weight
if (random < 0) return item
}
return pool.last()
}דוגמה לחלוקת משקלים:
- נפוץ: משקל 1000 → סיכוי של ~58.8%
- נדיר: משקל 500 → ~29.4%
- אפי: משקל 150 → ~8.8%
- אגדי: משקל 50 → ~2.9%
משקל כולל: 1700. סיכוי לאגדי: 50/1700 ≈ 2.94%.
איך מערכת ה-Pity עובדת
Pity (פרס מובטח) הוא מכניקה שמבטיחה פריט אגדי לאחר N ניסיונות לא מוצלחים. ללא pity, שחקן יכול לקבל רצף של 200 גלגולים ללא פריט אגדי — מתמטית אפשרי, מעשית הרסני לחוויית המשחק.
Soft pity — מהגלגול ה-N, ההסתברות לאגדי עולה. Genshin Impact משתמש בגישה זו: מהגלגול ה-74, הסיכוי ל-5* עולה ב-6% לכל גלגול.
Hard pity — בדיוק בגלגול ה-N, פריט אגדי מובטח. קל יותר ליישום ולהסבר כנה לשחקן.
data class PlayerGachaPity(
val rollsSinceLastLegendary: Int,
val softPityStart: Int = 74,
val hardPityAt: Int = 90
)
fun calculateEffectiveProbability(baseProbability: Float, pity: PlayerGachaPity): Float {
if (pity.rollsSinceLastLegendary >= pity.hardPityAt) return 1.0f
if (pity.rollsSinceLastLegendary >= pity.softPityStart) {
val excess = pity.rollsSinceLastLegendary - pity.softPityStart
return minOf(1.0f, baseProbability + excess * 0.06f)
}
return baseProbability
}המונה של ה-pity נשמר על השרת, לא על הלקוח. מונה בצד הלקוח היה מתאפס בהתקנה מחדש — השחקן מאבד את ה-pity שנצבר, מה שגורם לזעם מוצדק ולחיובים חוזרים.
למה יצירה בצד השרת?
התוצאה של גלגול gacha לא צריכה להיווצר על הלקוח. יצירה בצד השרת מאובטחת פי 100 מאשר בצד הלקוח — כמעט בלתי אפשרי לפרוץ. תהליך:
- הלקוח שולח בקשה
data class GachaItem(val id: String, val rarity: Rarity, val weight: Int) fun rollGacha(pool: List<GachaItem>): GachaItem { val totalWeight = pool.sumOf { it.weight } var random = Random.nextInt(totalWeight) for (item in pool) { random -= item.weight if (random < 0) return item } return pool.last() }עםdata class PlayerGachaPity( val rollsSinceLastLegendary: Int, val softPityStart: Int = 74, val hardPityAt: Int = 90 ) fun calculateEffectiveProbability(baseProbability: Float, pity: PlayerGachaPity): Float { if (pity.rollsSinceLastLegendary >= pity.hardPityAt) return 1.0f if (pity.rollsSinceLastLegendary >= pity.softPityStart) { val excess = pity.rollsSinceLastLegendary - pity.softPityStart return minOf(1.0f, baseProbability + excess * 0.06f) } return baseProbability },POST /gacha/roll, מספר גלגולים, אסימון תשלום - השרת בודק יתרה/עסקה, שולף את מונה ה-pity, מייצר תוצאה באמצעות PRNG מבוסס seed
- השרת רושם את התוצאה, מעדכן את ה-pity, מחזיר
userId+ תוצאות - הלקוח מפעיל אנימציה ומציג תוצאות
ה-seed של ה-PRNG נוצר על השרת; הלקוח לא יכול לחזות או להשפיע על התוצאה.
אנימציית פתיחת פרסים
אנימציית גלגול gacha היא לא רק קישוט; זה רגע משמעותי פסיכולוגית. משך 2–4 שניות, בניית מתח לפני החשיפה. ליישום במובייל אנו משתמשים ב:
- Unity Animator או Spine לאנימציות קלפים/ביצים דו-ממדיות
- Particle System לאפקטים בחשיפת פרסים נדירים
- משוב הפטי (UIImpactFeedbackGenerator ב-iOS, VibrationEffect באנדרואיד) ברגע החשיפה
אנימציות גלגול מרובה (x10) דורשות לוגיקה נפרדת: הצגת כל התוצאות ברצף עם קצב הולך וגדל, נפוצות במהירות, אגדיות עם אפקטים במסך מלא.
דרישות רגולטוריות
ה-App Store דורש הצגת הסתברויות "לפני הרכישה". ל-Google Play דרישה דומה. יישום: מסך "פרטי מאגר Gacha" עם טבלת הסתברויות לפי סוג פרס. המסך נגיש דרך כפתור "i" (מידע) ליד כפתור הגלגול.
| נדירות | הסתברות | הבטחה (hard pity) |
|---|---|---|
| נפוץ | 58.8% | — |
| נדיר | 29.4% | — |
| אפי | 8.8% | 40 גלגולים |
| אגדי | 2.9% | 90 גלגולים |
אילו סוגי באנרים של Gacha קיימים?
| סוג באנר | משך | Rate-up | תאימות ל-pity | הכנסות |
|---|---|---|---|---|
| רגיל | קבוע | לא | כן | יציב |
| Rate-up | 7–14 ימים | כן | כן (עם הבטחה) | גבוה |
| מומלץ | 7–14 ימים | כן | הבטחת 50/50 | מקסימלי |
באנר Rate-up — מאגר זמני עם סיכוי מוגבר לדמות/פריט ספציפי. יוצר דחיפות ושיאי הכנסות. באנר רגיל — מאגר קבוע, מקבל זכיות pity "אבודות" במערכות הבטחה. באנר מומלץ עם הבטחה — אם ה-rate-up לא נופל באגדי הראשון, הבא המובטח יהיה המומלץ (מערכת "50/50").
רשימת בדיקה: מה כלול בעבודה
- ניתוח דרישות ועיצוב מודל מתמטי
- יישום לוגיקה בצד השרת והלקוח (Swift/Kotlin/Flutter)
- שילוב מערכת pity ובאנר rate-up
- עיצוב ממשק משתמש עם הצגת הסתברויות
- יצירת אנימציית פתיחת פרסים (2D/3D)
- בדיקות עומס (500+ גלגולים בו-זמנית)
- הכנת מסמכים להגשה ל-App Store ול-Google Play
- תמיכה לאחר השחרור: ניטור, שיפורים מבוססי מדדים
לוחות זמנים משוערים
Gacha בסיסי עם pity ויצירה בצד השרת — 3–4 ימים. מערכת מלאה עם סוגי באנרים מרובים, ממשק הסתברויות, אנימציות ואנליטיקה — 7–10 ימים. המחיר מחושב באופן אישי — פנו אלינו להערכה.
קבלו ייעוץ — נעזור לעצב מערכת gacha שמייצרת רווח ועוברת מודרציה.







