GS2-Gacha

GS2-Gacha はガチャ機能を提供します。 ガチャ機能を GS2 SDK for Unity から利用する手順を解説します。

ガチャプールを作成する

GS2マネージメントコンソールの GS2-Gacha から新しくガチャプールを作成します。

ガチャプールは複数のガチャを束ねるグループのようなものです。 1つのグループは1つのマスターデータファイルで管理されるようになり、排出確率テーブルを共有することが出来ます。

『ガチャプールの新規作成』をクリックします。

../../../_images/step-00011.png

ガチャプールの名前をつけます。

排出確率を公開するか は、GetProbability() / GetProbabilityDetail() APIを使用して排出確率をクライアントに提供する場合に使用します。 ここでは、『提供しない』『レアリティ毎の排出確率を提供する』『リソース毎の排出確率を提供する』を選択出来ます。

ガチャ一覧の取得を許すか は ListGacha()/GetGacha() APIを使用してガチャプールに存在するガチャの一覧をクライアントに提供するかを指定します。 GS2-Showcase を使用する場合は販売期間や抽選回数を考慮したガチャ一覧を提供出来ますので、ここでは許す必要はありません。 逆に許してしまうと、公開期間や抽選回数を考慮していないガチャの一覧が取得出来てしまうため、好ましくない状態になってしまいます。 ここでは、ガチャのラインナップが固定で、抽選回数などで回数を制限するつもりが無い場合に許す設定にして使用するのがいいでしょう。

抽選実行を制限するか には DoGacha() APIの実行を許可するかどうかを設定します。 ここをスタンプシートのみに制限 に設定することで DoGacha() による抽選処理を制限し、DoGachaByStampSheet() による抽選のみを許可出来ます。 スタンプシートの詳細については こちら をご確認ください。スタンプシートを使用することで、より安全に対価を消費しつつ抽選処理を行うことが出来るようになります。

排出確率テーブルを作成する

排出確率テーブルはガチャで払い出す景品をどのような確率で決定するかを定義します。

作成したガチャプールを選択します。

../../../_images/step-00021.png

下部のタブから『排出確率テーブルマスター』タブを選択し『排出確率テーブルの新規作成』をクリックします。

../../../_images/step-00031.png

排出確率テーブルの名前を設定します。

レアリティを作成する

../../../_images/step-00041.png

排出確率テーブルを作成出来たら、排出確率テーブル一覧の右側にある『詳細』ボタンをクリックします。

../../../_images/step-0005.png

すると、排出確率テーブルのページに遷移します。 画面下部のタブから『レアリティマスター』を選択し、『景品レアリティの新規作成』をクリックします。

../../../_images/step-0006.png

ここでは、この排出確率テーブルで使用するレアリティを登録します。 normal / rare / special_rare / ultra_rare のようにレアリティの名前とそれぞれの排出重みを設定します。 排出重みは合計値を一定にする必要はありません。例えば

  • normal: 4
  • rare: 1

とした場合。normal の排出確率が 80% rare の排出確率が 20% と内部で計算されて使用されます。

景品を作成する

../../../_images/step-0007.png

レアリティマスターの一覧を開くと、再度レアリティ毎の一覧の右側に『詳細』ボタンが表示されますので、クリックします。

../../../_images/step-0008.png

すると、レアリティマスターのページに遷移します。 画面下部のタブから『景品マスタ』を選択し、『景品の新規作成』をクリックします。

ここでもレアリティと同様に、この指定したレアリティとして排出するアイテムのリソースIDと排出重みを登録します。 ここで重みを設定することで、SSRの中でも排出率を変えることが出来ます。

../../../_images/step-0009.png

景品の登録が終わったら、他のレアリティに対しても同様の手順で景品を登録します。

ガチャを作成する

次に、作成した排出確率テーブルを使用したガチャを登録します。 ガチャプールから『ガチャマスター』を選択し、『ガチャの新規作成』を選択します。

../../../_images/step-0010.png

排出確率名リスト にはこのガチャの抽選時に使用する排出確率テーブルを指定します。 ここでは、作成した排出確率テーブルを使って1回だけ抽選する例を示しています。

景品の排出処理に使用する GS2-JobQueue には抽選結果をジョブとして登録するジョブキューを設定します。 ここで JobQueue を設定しない場合は DoGacha() / DoGachaByStampSheet() の戻り値を使用してゲームに結果を反映することになります。 ただし、この方法ではクライアントがリソースの増加処理をすることとなり、セキュリティ面では望ましくありません。 そこで、使用出来るのが GS2-JobQueue です。 GS2-JobQueue の詳細は GS2-JobQueue の解説をご覧いただきたいとおもいますが、ようはGS2-JobQueueを使用すれば 排出結果を GS2-JobQueue を通して GS2-Script を使ってリソースの付与が行えるため、よりセキュアに景品の付与が行えます。

GS2-JobQueue を使用するを選択すると、GS2-JobQueue に指定する GS2-Script を選択出来るようになります。 ここでは、JobQueue のジョブを実行する際に使用する GS2-Script を指定してください。 GS2-Script に引き渡される引数の詳細については GS2-Script のドキュメントに記載されたイベントの種類を参照ください。

../../../_images/step-0011.png

ここでは、作成した排出確率テーブルを使って10回抽選する例を示しています。 抽選タイミング毎の排出確率テーブルを個別に指定することが出来ます。

10回のうち1回だけ異なる排出確率テーブルを設定することが出来、 これによって、10連ガチャではSR以上確定。というような、10回中1回だけ異なる排出確率テーブルを設定することが出来ます。

ガチャマスター情報をエクスポートする

../../../_images/step-0012.png

『マスターデータをエクスポート』をクリックします。

すると、JSON ファイルがダウンロードされます。

ショーケースマスタ情報を反映する

../../../_images/step-0013.png

『有効なマスターデータ』タブで『マスターデータをアップロード』をクリックします。

../../../_images/step-0014.png

先ほどダウンロードしたJSONファイルをアップロードします。 ここでマスターデータをアップロードすることで、実際にゲームクライアントからアクセスした時の陳列棚が更新されます。

../../../_images/step-0015.png

これで、GS2マネージメントコンソールでおこなう準備は完了です。

ガチャ機能を実装する

ここからは Unity での実装になります。

まずはログイン処理を実装する必要があります。ログインして Gs2.GameSession を取得するまでの手順は GS2-Auth をご参照ください。

ここからはログインが完了している前提で説明を進めます。

ガチャ情報を取得(非推奨)

gs2.Gacha.ListGachas(
    result => {
        if(result.Error != null) throw r.Error;
        // ガチャリストの取得に成功
        EzGachaList gachas = result.Result;
        foreach (var item : gachas)
        {
            Debug.Log("ガチャの名前: " + item.Name);
            Debug.Log("メタデータ: " + item.Meta);
            Debug.Log("抽選回数: " + item.DrawCount);
        }
    },
    session,            // GS2 ログインセッション
    GachaPoolName       // GS2-Gacha で作成したガチャプール名
);
gs2.Gacha.GetGacha(
    result => {
        if(result.Error != null) throw r.Error;
        // ガチャの取得に成功
        EzGacha gacha = result.Result;
        Debug.Log("ガチャの名前: " + gacha.Name);
        Debug.Log("メタデータ: " + gacha.Meta);
        Debug.Log("抽選回数: " + gacha.DrawCount);
    },
    session,            // GS2 ログインセッション
    GachaPoolName,      // GS2-Gacha で作成したガチャプール名
    GachaName           // GS2-Gacha で作成したガチャ名
);

これらのAPIはガチャプールの設定で『ガチャ一覧の取得を許すか』で『許す』を設定した場合にのみ使用出来ます。 GS2としては本APIを使用せず GS2-Showcase にガチャを陳列して販売することをおすすめします。

ガチャを抽選する(非推奨)

gs2.Gacha.DoGacha(
    result => {
        if(result.Error != null) throw result.Error;
        EzPrizeList prizes = result.Result;
        foreach (var item : prizes)
        {
            Debug.Log("排出されたリソースID: " + item.ResourceId);
        }
    },
    session,            // GS2 ログインセッション
    GachaPoolName,      // GS2-Gacha で作成したガチャプール名
    GachaName           // GS2-Gacha で作成したガチャ名
);

これらのAPIはガチャプールの設定で『抽選実行を制限するか』で『制限しない』を設定した場合にのみ使用出来ます。 GS2としては本APIを使用せず GS2-Showcase にガチャを陳列して、購入処理として抽選することをおすすめします。

ガチャの排出確率を取得する

gs2.Gacha.GetGachaProbability(
    result => {
        if(result.Error != null) throw result.Error;
        EzGachaProbabilityList probabilities = result.Result;
        foreach (var item : probabilities)
        {
            Debug.Log("レアリティ名: " + item.Name);
            Debug.Log("排出確率: " + item.Rate);        // 0.0f〜1.0f
        }
    },
    session,            // GS2 ログインセッション
    GachaPoolName,      // GS2-Gacha で作成したガチャプール名
    GachaName,          // GS2-Gacha で作成したガチャ名
    1                   // 何回目の抽選における排出確率を取得するか
);

gs2.Gacha.GetGachaProbabilityDetail(
    result => {
        if(result.Error != null) throw result.Error;
        EzGachaProbabilityDetailList probabilities = result.Result;
        foreach (var item : probabilities)
        {
            Debug.Log("レアリティ名: " + item.RarityName);
            Debug.Log("リソースID: " + item.ResourceId);
            Debug.Log("排出確率: " + item.Rate);        // 0.0f〜1.0f
        }
    },
    session,            // GS2 ログインセッション
    GachaPoolName,      // GS2-Gacha で作成したガチャプール名
    GachaName,          // GS2-Gacha で作成したガチャ名
    1                   // 何回目の抽選における排出確率を取得するか
);

排出確率を公開するか でレアリティ毎を選択した場合に前者が、リソース毎を選択した場合に両方が呼び出せるようになります。