GS2-Lottery

抽選処理機能

ガチャを実装するための仕組みです。 GS2-Lottery では、通常ガチャとBOXガチャに対応しています。

通常ガチャ

通常ガチャは指定された確率で純粋な抽選を行います。

景品テーブル

景品テーブルとは、ガチャを実行した時に出てくる景品の排出確率を定義したものです。 マスターデータとして定義することになります。

重み

景品テーブルでの確率の設定は、景品ごとの重みを設定します。 具体的には以下のようなテーブルを作成することになります。

重み
景品A1
景品B2
景品C4

これを百分率による確率として解釈すると以下のように解釈できます。

重み確率
景品A114.285%
景品B228.571%
景品C457.143%

百分率ベースで確率を設定する必要がある場合、全てを足して100%になるよう考える必要がありますが 重みベースで確率を設定する場合は、そのような負担をする必要がなくなります。

景品テーブルの入れ子

景品テーブルは、最大5層まで入れ子にすることができます。

具体的な使用方法としては

  • SSRキャラクターの排出確率を3%
  • SRキャラクターの排出確率を7%
  • Rキャラクターの排出確率を90%

という基本指針に基づいて排出キャラクターを設定したい時に便利です。 この場合は2層で、4個の景品テーブルを定義することになります。

レアリティ抽選用景品テーブル

重み景品の種類抽選テーブル名
SSR3景品テーブルの入れ子SSRキャラクター抽選用景品テーブル
SR7景品テーブルの入れ子SRキャラクター抽選用景品テーブル
R90景品テーブルの入れ子Rキャラクター抽選用景品テーブル

SSRキャラクター抽選用景品テーブル

重み景品の種類抽選テーブル名
SSR-00011入手処理SSR-0001 を GS2-Dictionary に記録
SSR-00021入手処理SSR-0002 を GS2-Dictionary に記録
SSR-00031入手処理SSR-0003 を GS2-Dictionary に記録

SRキャラクター抽選用景品テーブル

重み景品の種類抽選テーブル名
SR-00011入手処理SR-0001 を GS2-Dictionary に記録
SR-00021入手処理SR-0002 を GS2-Dictionary に記録
SR-00031入手処理SR-0003 を GS2-Dictionary に記録

Rキャラクター抽選用景品テーブル

重み景品の種類抽選テーブル名
R-00011入手処理R-0001 を GS2-Dictionary に記録
R-00021入手処理R-0002 を GS2-Dictionary に記録
R-00031入手処理R-0003 を GS2-Dictionary に記録

BOXガチャ

BOXガチャはマスターデータで定義された景品を指定された数量をBOXに投入し 抽選処理を行う時にはBOXから景品を取り出していくことで景品の内容を決定します。

つまり、100個の景品のうち1個あたりを入れているBOXを用意した場合、100回以内にかならずあたり景品が抽選されます。

BOXへの景品の投入

BOX内部の景品の設定にも景品テーブルを使用します。 通常抽選モードでは排出の重みを設定しましたが、重みのパラメーターにはBOX内に景品を投入する数量を設定します。

重み
景品A1
景品B2
景品C4

この場合、BOXには最初7個の景品が入っており「景品Aが1個」「景品Bが2個」「景品Cが4個」入っている状態になります。

抽選モデル

抽選モデルでは、景品テーブルのうち抽選APIで使用できる景品テーブルを指定します。 マスターデータとして定義することになります。

上記例で言えば、抽選APIを呼び出した時に いきなり SSRキャラクター抽選用景品テーブル を使って抽選処理が行えてしまうと不安です。

抽選モデルで以下のようなマスターデータを定義しておき

抽選モデル名景品テーブル名
ガチャレアリティ抽選用景品テーブル

抽選処理を呼び出す際には 抽選モデル名に「ガチャ」を指定して抽選することになります。

実装例

抽選を実行

抽選を実行はゲームエンジン用の SDK では処理できません。

GS2-Showcase の商品購入の報酬として抽選を実行するといった方法で実装してください。

排出確率の取得

    var items = await gs2.Lottery.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).ProbabilitiesAsync(
        lotteryName: "lottery-0001"
    ).ToListAsync();
    const auto It = Gs2->Lottery->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        AccessToken
    )->Probabilities(
        "lottery-0001" // lotteryName
    );
    TArray<Gs2::UE5::Lottery::Model::FEzProbabilityPtr> Result;
    for (auto Item : *It)
    {
        if (Item.IsError())
        {
            return false;
        }
        Result.Add(Item.Current());
    }

BOXの中身を取得

    var result = await gs2.Lottery.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).GetBoxAsync(
        prizeTableName: "prizeTable-0001"
    );
    var item = await result.ModelAsync();
    const auto Domain = Gs2->Lottery->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        AccessToken
    )->BoxItems(
        "prizeTable-0001" // prizeTableName
    );
    const auto item = Domain.Model();

BOXのリセット

    var result = await gs2.Lottery.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).ResetBoxAsync(
        prizeTableName: "prizeTable-0001"
    );
    const auto Future = Gs2->Lottery->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        AccessToken
    )->BoxItems(
        "prizeTable-0001" // prizeTableName
    )->ResetBox(
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError()) return false;

その他の機能

景品の排出数量の制限

通常モードで動作させている時に、景品ごとに排出数量の上限を設定できます。 この機能を利用すると Probabilities 関数が応答する確率と実際の確率の齟齬が生じます。 Probabilities を使用して排出確率の表示を行う際には、この機能は利用するべきではありません。

用途として想定されているのは物理景品を配布するための抽選処理です。 確率1%で排出されるギフト券があったとして、ギフト券は100枚しか準備がないケースでこの機能が役立ちます。 ギフト券の排出数量の上限を100に設定し、フェイルオーバー景品にはずれや、異なるあたり景品を設定します。

このように設定することで、すでにギフト券を100枚排出済みの状態で、ギフト券が当選した場合 ギフト券の代わりにフェイルオーバー景品に設定した景品が排出されます。 フェイルオーバー景品に数量制限が設定されている場合は、同様の制限が適用されます。

詳細なリファレンス