ガチャシステムは、確率と天井のバランスが重要です。
レアリティ設計と排出確率を実装すれば、公平性が保たれます。
この記事では、実装方法を詳しく解説します。
✨ この記事でわかること
- レアリティ設計の実装
- 排出確率システムの実装
- 天井システムの実装
- 確率表示の実装
- 実装例とコード

ガチャシステムは、レアリティ設計から始めましょう。明確なレアリティ階層が、公平性を保ちます。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
あなたのオリジナルゲーム、今年こそ完成させませんか?
RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。
実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。
ガチャシステムにおけるレアリティ設計の考え方と実装

レアリティ設計は、ガチャシステム全体の基盤となる重要な要素です。
どのアイテムがどれくらいの頻度で排出されるのかを明確に定義することで、プレイヤーにとって「当たり」「外れ」の基準が分かりやすくなり、ガチャ体験の納得感や公平性につながります。
また、排出確率や天井システムは、このレアリティ設計を前提として構築されます。
そのため、最初にレアリティの階層と役割を整理しておくことが重要です。
レアリティ設計の基本的な考え方
一般的なガチャでは、以下のように複数段階のレアリティを設定します。
- ノーマル(Common):最も排出されやすい基本アイテム
- レア(Rare):やや希少で、性能や価値が高い
- スーパーレア(SRare):明確な当たり枠
- 超レア(SSRare):演出付き・目玉となるアイテム
本記事では、学習用・汎用的な構成として、合計100%になるシンプルな確率配分を採用します。
この設計により、後からイベントガチャやピックアップを追加する際も拡張しやすくなります。
レアリティシステムの実装例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
using UnityEngine; public enum Rarity { Common, // ノーマル(70%) Rare, // レア(20%) SRare, // スーパーレア(8%) SSRare // 超レア(2%) } [System.Serializable] public class GachaItem { public string itemID; public string itemName; public Rarity rarity; public float dropRate; // 排出確率 } public class RaritySystem : MonoBehaviour { // レアリティごとの基本排出率 public Dictionary<Rarity, float> baseRates = new Dictionary<Rarity, float> { { Rarity.Common, 0.70f }, { Rarity.Rare, 0.20f }, { Rarity.SRare, 0.08f }, { Rarity.SSRare, 0.02f } }; // ランダム値からレアリティを判定 public Rarity GetRarityByRate(float rate) { if (rate <= baseRates[Rarity.SSRare]) { return Rarity.SSRare; } else if (rate <= baseRates[Rarity.SSRare] + baseRates[Rarity.SRare]) { return Rarity.SRare; } else if (rate <= baseRates[Rarity.SSRare] + baseRates[Rarity.SRare] + baseRates[Rarity.Rare]) { return Rarity.Rare; } else { return Rarity.Common; } } } |
このようにレアリティを明確に定義しておくことで、後続の排出確率システムや天井システムとスムーズに連携できます。

まずはシンプルな構成で実装し、ゲーム性に応じて調整していくのがおすすめです。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
排出確率システムの実装

排出確率システムは、ガチャを引いた際に「どのアイテムが手に入るか」を最終的に決定する処理です。
レアリティ設計で定義した確率をもとに、実際の抽選ロジックを実装する役割を担います。
本記事では、レアリティを先に確率で決定し、その後、同じレアリティ内からアイテムを選択する
シンプルな二段階方式を採用します。
この構成により、確率調整やイベント対応を後から行いやすくなります。
排出確率システムの考え方
ガチャの抽選処理を分解すると、以下の2ステップになります。
- 確率に基づいてレアリティを決定する
- 該当するレアリティの中からアイテムを選択する
今回は理解しやすさを重視し、同じレアリティ内のアイテムは均等確率で抽選します。
個別確率やピックアップを行う場合は、この部分を拡張することで対応できます。
確率計算システムの実装例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
using UnityEngine; using System.Collections.Generic; public class GachaProbabilitySystem : MonoBehaviour { public List<GachaItem> itemPool = new List<GachaItem>(); public RaritySystem raritySystem; public GachaItem DrawItem() { // レアリティを先に確率で決定する float rarityRoll = Random.Range(0f, 1f); Rarity targetRarity = raritySystem.GetRarityByRate(rarityRoll); // 該当するレアリティのアイテムを抽出 List<GachaItem> candidates = itemPool.FindAll( item => item.rarity == targetRarity ); // 該当アイテムが存在しない場合は何も返さない if (candidates.Count == 0) { return null; } // 今回はシンプルに均等確率でアイテムを選択 return candidates[Random.Range(0, candidates.Count)]; } public List<GachaItem> DrawItems(int count) { List<GachaItem> results = new List<GachaItem>(); for (int i = 0; i < count; i++) { results.Add(DrawItem()); } return results; } } |
このように排出確率システムを独立させておくことで、レアリティ設計や天井システムと役割を分離できます。
まずはシンプルな構成で実装し、ゲーム性に応じて段階的に拡張していくのがおすすめです。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
天井システムの実装

天井システムは、ガチャを引くたびに「次こそは当たるかもしれない」という期待感を高めるための仕組みです。
単なる救済措置ではなく、プレイヤーのモチベーションを維持する重要な要素となります。
一定回数ガチャを引くと、必ず高レアリティのアイテムが排出されることで、「どれだけ回せばゴールに到達するか」が明確になります。

この“見えるゴール”が、ガチャ体験の安心感とワクワク感を生み出します。
天井システムの考え方
天井システムでは、ガチャを引いた回数をカウントし、設定した回数に到達した時点で特定のレアリティ以上のアイテムを保証します。
- 通常時は確率に基づいて抽選
- 外れが続くほど天井に近づく
- 天井到達時は確定演出を用意できる
本記事では、分かりやすい例として100回で超レア(SSRare)を確定するシンプルな天井システムを実装します。
天井管理システムの実装例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
using UnityEngine; using System.Collections.Generic; public class PitySystem : MonoBehaviour { public GachaProbabilitySystem gachaSystem; public int pityCounter = 0; // 現在のガチャ回数 public int pityThreshold = 100; // 天井回数 public Rarity guaranteedRarity = Rarity.SSRare; public GachaItem DrawWithPity() { // ガチャを引くたびにカウントを増やす pityCounter++; // 天井に到達した場合 if (pityCounter >= pityThreshold) { pityCounter = 0; // 天井到達後はリセット // 保証されたレアリティのアイテムを抽出 List<GachaItem> guaranteedItems = gachaSystem.itemPool.FindAll( item => item.rarity == guaranteedRarity ); if (guaranteedItems.Count > 0) { // 天井到達時は確定排出 return guaranteedItems[Random.Range(0, guaranteedItems.Count)]; } } // 通常のガチャ処理 GachaItem result = gachaSystem.DrawItem(); // 高レアリティが出た場合は期待値をリセット if (result != null && result.rarity >= Rarity.SRare) { pityCounter = 0; } return result; } // 次の天井までの残り回数を取得 public int GetRemainingPity() { return pityThreshold - pityCounter; } } |
このように天井システムを実装することで、ガチャを引くたびに「ゴールが近づいている」感覚を演出できます。
UI上で残り回数を表示したり、演出を追加することで、さらにワクワク感を高めることも可能です。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
確率表示の実装

確率表示は、ガチャシステムにおいてユーザーの信頼を守るために欠かせない要素です。
どれほど内部ロジックが正しくても、排出確率が分からなければ、ユーザーは不安や不信感を抱いてしまいます。
また、ストア規約や法的な観点からも、ガチャの排出確率を明示することが求められるケースがあります。
そのため確率表示は、単なるUIではなく、ガチャ体験の安心感を支える仕組みとして実装する必要があります。
確率表示システムの考え方
本記事では、レアリティ設計で定義した基本排出確率をそのまま表示します。
天井システムやイベント補正などは含めず、「通常時の基準となる確率」を明確にする構成です。
このように基準値を表示しておくことで、後から確率変動が発生する場合でも、どこが変わっているのかを説明しやすくなります。
確率表示システムの実装例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
using UnityEngine; using TMPro; public class ProbabilityDisplay : MonoBehaviour { public TextMeshProUGUI probabilityText; public RaritySystem raritySystem; // 基本排出確率を画面に表示する public void UpdateProbabilityDisplay() { string displayText = "排出確率(通常時):\n"; // レアリティごとの基本確率を表示 displayText += $"ノーマル: {raritySystem.baseRates[Rarity.Common] * 100:F1}%\n"; displayText += $"レア: {raritySystem.baseRates[Rarity.Rare] * 100:F1}%\n"; displayText += $"スーパーレア: {raritySystem.baseRates[Rarity.SRare] * 100:F1}%\n"; displayText += $"超レア: {raritySystem.baseRates[Rarity.SSRare] * 100:F1}%"; // UIテキストに反映 probabilityText.text = displayText; } // イベント時など、詳細表示用に拡張することも可能 public void ShowDetailedProbability() { // 天井・ピックアップ確率などを追加表示する想定 } } |
このように確率表示を実装しておくことで、ユーザーは「どのレアリティがどれくらいの確率で出るのか」を事前に理解したうえでガチャを引けるようになります。
さらに、天井システムやイベントガチャと組み合わせることで、「今はどんな状態なのか」を視覚的に伝えることも可能になります。

ここまで理解できれば、ガチャ体験全体を設計する視点が身につきます。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
実装例:完全なガチャシステム

ここまで紹介したレアリティ設計、排出確率、天井システム、確率表示を統合すると、本格的なガチャシステムの完成形を作ることができます。
各システムが連動することで、単なる抽選ではなく、プレイヤーにワクワク感と納得感を提供できるガチャ体験が実現します。
本章では、学習用にシンプルに統合したサンプルコードを紹介します。

これを理解すれば、カスタムガチャやイベントガチャの設計も可能になります。
統合ガチャシステムの実装例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
using UnityEngine; public class CompleteGachaSystem : MonoBehaviour { [Header("ガチャの各システム")] public RaritySystem raritySystem; // レアリティ設計 public GachaProbabilitySystem probabilitySystem; // 排出確率システム public PitySystem pitySystem; // 天井システム public ProbabilityDisplay probabilityDisplay; // 確率表示 // 初期化処理:確率表示を更新 public void InitializeGacha() { // UIに確率を表示 probabilityDisplay.UpdateProbabilityDisplay(); // その他の初期化処理もここで追加可能 } // 実際にガチャを引くメソッド public GachaItem PerformGacha() { // 天井システムを通してアイテムを取得 GachaItem result = pitySystem.DrawWithPity(); // 必要に応じてここで演出やログ表示も追加可能 return result; } } |
この完成形では、各システムが役割ごとに分かれているため、保守や拡張が容易です。
たとえば、イベント用ガチャの追加や確率調整も、既存の構造を大きく変えずに実装できます。
ここまで理解すると、単なる「ガチャの実装」ではなく、プレイヤー体験全体を設計する視点が身につきます。
- レアリティ設計で期待値をコントロール
- 天井システムでワクワク感を演出
- 確率表示で信頼性を保証
これらを統合することで、ゲーム全体の面白さにも直結するのです。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
よくある質問(FAQ)

Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
あなたのオリジナルゲーム、今年こそ完成させませんか?
RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。
実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。
まとめ

ガチャシステムは、レアリティ設計から始めましょう。
明確なレアリティ階層が、公平性を保ちます。
✅ 今日から始める3ステップ
- ステップ1:レアリティシステムを実装する(所要2時間)
- ステップ2:排出確率システムを実装する(所要2時間)
- ステップ3:天井システムを実装する(所要2時間)
本格的にUnityを学びたい方は、Unity入門の森で実践的なスキルを身につけましょう。
あなたのペースで、少しずつ進めていけば大丈夫です。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる



コメント