Реалізація Gacha/Lootbox механики мобільної гри
Gacha — один з найбільш прибуткових механізмів у мобільних грах та одночасно один з найбільш регульованих. Apple з 2022 року вимагає розкриття вероятностей для всіх lootbox-механік. У ряді країн (Бельгія, Нідерланди) gacha з реальними грошима приравнюється до азартних ігор. Правильна реалізація — це баланс привабливої механіки, математично чесних вероятностей та юридичної прозорості.
Математична модель вероятностей
Базова 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()
}
Приклад розподілу ваг:
- Common: weight 1000 → ~58.8% шанс
- Rare: weight 500 → ~29.4%
- Epic: weight 150 → ~8.8%
- Legendary: weight 50 → ~2.9%
Сумарна вага: 1700. Шанс legendary: 50/1700 ≈ 2.94%.
Pity-система: обов'язкова для чесної механіки
Pity (гарантована награда) — механіка, яка гарантує legendary після N неудачних спроб. Без pity у гравця може бути streak з 200 роллів без legendary — математично можливо, практично розрушує досвід.
Soft pity — починаючи з N-го ролла вероятність legendary поступово ростет. Genshin Impact використовує цей підхід: з 74-го ролла шанс 5* починає рости на 6% кожен ролл.
Hard pity — ровно на N-му ролле legendary гарантирован. Простіша реалізація та чесніша комунікація гравцю.
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, що викликає справедливе обурення та чарджбеки.
Серверна генерація результатів
Результат гача-ролла неможна генерувати на клієнті. Схема:
- Клієнт відправляє запрос
POST /gacha/rollзuserId,gachaPoolId, кількістю роллів, токеном оплати - Сервер перевіряє баланс/транзакцію, отримує pity-счетчик, генерує результат з seeded PRNG
- Сервер записує результат, оновлює pity, повертає
rollId+ результати - Клієнт відображає анімацію та показує результати
Seed для PRNG генерується на сервері, клієнт не може передбачити або вплинути на результат.
Анімація відкриття
Анімація gacha-ролла — не просто прикрашання, це психологічно значимий момент. Тривалість 2–4 секунди, нарастаючий саспенс перед reveal. Для мобільної реалізації використовуємо:
- Unity Animator або Spine для 2D-анімацій карт/яєць
- Particle System для ефектів при reveal рідких наград
- Haptic feedback (
UIImpactFeedbackGeneratorна iOS,VibrationEffectна Android) у момент reveal
Multi-pull анімації (x10 ролл) вимагають окремої логіки: показуємо усі результати послідовно з зростаючим темпом, common швидко, legendary — з полноэкранним ефектом.
Регуляторні вимоги
App Store (з 2022): застосунки з lootbox повинні відображати вероватности «перед покупкою». Це не опціональна фіча — це обов'язкова умова, порушення якої веде до rejection при ревью.
Google Play: аналогічна вимога з 2024 року. Вероватности мають бути доступні в інтерфейсі до підтвердження покупки.
Реалізація: екран «Детали гача-пула» з таблицею вероватностей по типам наград. Цей екран відкривається кнопкою «i» (інформація) рядом з кнопкою ролла.
| Редкість | Вероватність | Гарантія (hard pity) |
|---|---|---|
| Common | 58.8% | — |
| Rare | 29.4% | — |
| Epic | 8.8% | 40 роллів |
| Legendary | 2.9% | 90 роллів |
Типи gacha-пулів
Rate-up banner — тимчасовий пул з підвищеним шансом конкретного персонажу/предмету. Обмежений за часом (7–14 днів). Створює urgency та піки доходу.
Standard banner — постійний пул без rate-up. Приймає «втрачені» pity-перемоги у грах з системою «гарантований featured 50/50».
Featured banner з guarantee — якщо rate-up не випав на 1-му legendary, наступний legendary guaranteed буде featured. «50/50 система» — добре комунікується гравцям та створює справедливе очікування.
Терміни реалізації: базовий gacha з pity та серверною генерацією — 3–4 дні. Повна система з кількома типами баннерів, UI вероватностей, анімаціями та аналітикою — 7–10 днів.







