GS2-Showcase

GS2-Showcase はショップ機能を提供します。 ショップ機能を GS2 SDK for Unity から利用する手順を解説します。

スタミナプールを作成する

GS2マネージメントコンソールの GS2-Showcase から新しくショーケースを作成します。

ショーケースは商品を陳列する棚のようなものです。

../../../_images/step-000110.png

『ショーケースの新規作成』をクリックします。

../../../_images/step-000210.png

ショーケースの名前をつけます。

商品を作成する

作成したショーケースを選択します。

../../../_images/step-00038.png

下部のタブから『商品マスタ』タブを選択し『商品の新規作成』をクリックします。

../../../_images/step-00048.png

商品の種類には陳列する商品の種類を選択してください。

入手数量には商品を購入した際に、その商品を何個入手出来るかを入力してください。

商品の対価の種類には商品の購入時に使用する通貨の種類を選択してください。

価格には商品の対価で設定した通貨を消費する量を設定してください。

(必要であれば)商品グループを作成する

商品グループとは、商品グループ内で最も優先度が高く、購入可能な1つの商品だけが陳列される仕組みです。

たとえば、初回のみ半額で購入出来る商品を用意する場合は、値段に半額の値を設定した商品(GS2-Limitと連携して回数制限を設定)と、通常価格の商品を作成します。

この2つの商品を商品グループに設定します。この際に 半額に設定した商品の方の優先度を高く設定する必要があります。

商品を陳列する

作成したショーケースを選択します。

../../../_images/step-00052.png

下部のタブから『陳列商品マスタ』タブを選択し『陳列商品を追加』をクリックします。

../../../_images/step-00062.png

商品の種類で『商品』か『商品グループ』かを設定し、陳列する商品または商品グループを設定します。

商品の公開期間 には GS2-Schedule のイベントを設定することで、イベント期間中のみ販売することができます。

ショーケースマスタ情報をエクスポートする

../../../_images/step-00072.png

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

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

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

../../../_images/step-00082.png

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

../../../_images/step-00092.png

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

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

ショップ機能を実装する

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

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

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

現在の販売商品一覧を取得

gs2.Showcase.DescribeSalesItems (
    result => {
        if(result.Error != null) throw result.Error;
        // 商品リストの取得に成功
        foreach (var item : result.Result)
        {
            Debug.Log("商品の種類: " + item.ItemType);
            Debug.Log("数量: " + item.ItemAmount);
            Debug.Log("通貨の種類: " + item.CurrencyType);
            Debug.Log("販売価格: " + item.Price);
        }
    },
    session,            // GS2 ログインセッション
    ShowcaseName,       // GS2-Showcase で作成したショーケース名
);

gs2.Showcase.DescribeSalesItems() で現在購入可能な商品一覧を取得できます。

実装サンプル

public class GameLogic : MonoBehaviour {

    private const string ClientId = "your client id";
    private const string ClientSecret = "your client secret";

    private const string ShowcaseName = "stamina-0001";

    Gs2.Client gs2;
    Gs2.GameSession session;

    void Start () {
        // GS2 Client を初期化
        gs2 = new Gs2.Client (new Gs2.Profile ()
            .WithClientId (ClientId)
            .WithClientSecret (ClientSecret));

        StartCoroutine (Login ());
    }

    IEnumerator Login() {
        // GS2-Account を利用して認証します
        string gameName = "game-0001";
        string keyName = "account";
        string userId = "user";
        string password = "password";
        string authenticationToken = null;
        yield return gs2.Account.Authentication (
            result => {
                if(result.Error != null) throw result.Error;
                authenticationToken = result.Result;
            },
            gameName,
            keyName,
            userId,
            password);

        // GS2-Account の認証情報を利用して GS2 にログインします
        yield return gs2.Auth.Login (
            result => {
                if(result.Error != null) throw result.Error;
                session = result.Result;
            },
            userId,
            keyName,
            authenticationToken);

        StartCoroutine (GetSalesItems ());
    }

    IEnumerator GetSalesItems() {
        // 販売中の商品一覧を取得する
        yield return gs2.Showcase.DescribeSalesItems (
              result => {
                  if(result.Error != null) throw result.Error;
                  // 商品リストの取得に成功
                  foreach (var item : result.Result)
                  {
                      Debug.Log("商品ID: " + item.Id);
                      Debug.Log("商品の種類: " + item.ItemType);
                      Debug.Log("数量: " + item.ItemAmount);
                      Debug.Log("通貨の種類: " + item.CurrencyType);
                      Debug.Log("販売価格: " + item.Price);
                  }
              },
              session,            // GS2 ログインセッション
              ShowcaseName,       // GS2-Showcase で作成したショーケース名
          );
    }

    void Update () {

    }
}

商品を購入

gs2.Showcase.BuyItem (
    result => {
        if(result.Error != null) throw result.Error;
        // 商品の購入に成功
        var stampSheet = result.Result; // スタンプシート
    },
    session,            // GS2 ログインセッション
    ShowcaseName,       // GS2-Showcase で作成したショーケース名
    itemId,             // DescribeSalesItems() で取得した商品ID
    KeyName             // 購入処理で使用する GS2-Key 暗号鍵名
);

gs2.Showcase.BuyItem() で商品を購入処理を開始できます。 商品の購入処理を開始する準備が整ったらスタンプシートがコールバックで返ります。

スタンプラリーを実行

stampSheet.OnCompleteTasks += () =>
{
    Debug.Log("購入した商品の種類: " + stampSheet.Item.ItemType);
    Debug.Log("入手した数量: " + stampSheet.Item.ItemAmount);
}

stampSheet.RunTask (
    result => {
        if(result.Error != null) throw result.Error;
        // 全てのタスクを完了
    },
    session,            // GS2 ログインセッション
    KeyName,            // 購入処理で使用する GS2-Key 暗号鍵名
    new BuyConfig
    {
        StaminaMaxValue = 50,
    }                   // 購入時に使用するオプション値(詳細は後述)
);

このAPIはスタンプシートに記録されたタスクを実行します。 エラーが発生した場合は、再度 RunTask を呼び出すことでリトライすることが出来ます。

タスクの進行状況は stampSheet.OnDoneTask や stampSheet.CompleteTasks でハンドリング出来ます。

RunTask の中では購入する商品や、消費する対価にあわせて GS2 の各サービスのAPIを呼び出します。 対価がリアルマネーで 商品が GS2-Money の課金通貨 を購入する場合は、動作中のOSにあわせたストアへの接続をおこない、 ストアが発行したレシートを検証し、課金通貨を付与する。といった一連の動作も自動的に処理されます。

実装サンプル

public class GameLogic : MonoBehaviour {

    private const string CLIENT_ID = "your client id";
    private const string CLIENT_SECRET = "your client secret";

    private const string STAMINA_POOL_NAME = "stamina-0001";

    Gs2.Client gs2;
    Gs2.GameSession session;

    void Start () {
        // GS2 Client を初期化
        gs2 = new Gs2.Client (new Gs2.Profile ()
            .WithClientId (CLIENT_ID)
            .WithClientSecret (CLIENT_SECRET));

        StartCoroutine (Login ());
    }

    IEnumerator Login() {
        // GS2-Account を利用して認証します
        string gameName = "game-0001";
        string keyName = "account";
        string userId = "user";
        string password = "password";
        string authenticationToken = null;
        yield return gs2.Account.Authentication (
            result => {
                if(result.Error != null) throw result.Error;
                authenticationToken = result.Result;
            },
            gameName,
            keyName,
            userId,
            password);

        // GS2-Account の認証情報を利用して GS2 にログインします
        yield return gs2.Auth.Login (
            result => {
                if(result.Error != null) throw result.Error;
                session = result.Result;
            },
            userId,
            keyName,
            authenticationToken);

        StartCoroutine (BuyItem ());
    }

    IEnumerator BuyItem() {
        EzItemList items = null;
        // 販売中の商品一覧を取得する
        yield return gs2.Showcase.DescribeSalesItems (
              result => {
                  if(result.Error != null) throw result.Error;
                  // 商品リストの取得に成功
                  foreach (var item : result.Result)
                  {
                      Debug.Log("商品ID: " + item.Id);
                      Debug.Log("商品の種類: " + item.ItemType);
                      Debug.Log("数量: " + item.ItemAmount);
                      Debug.Log("通貨の種類: " + item.CurrencyType);
                      Debug.Log("販売価格: " + item.Price);
                  }
                  items = result.Result;
              },
              session,            // GS2 ログインセッション
              ShowcaseName,       // GS2-Showcase で作成したショーケース名
          );

        yield return gs2.Showcase.BuyItem (
              result => {
                  if(result.Error != null) throw result.Error;
                  // 商品の購入に成功
                  var item = result.Result;
                  Debug.Log("購入した商品の種類: " + item.ItemType);
                  Debug.Log("入手した数量: " + item.ItemAmount);
              },
              session,            // GS2 ログインセッション
              ShowcaseName,       // GS2-Showcase で作成したショーケース名
              items[0].Id,        // 購入する商品ID
              KeyName,            // 購入処理で使用する GS2-Key 暗号鍵名
              new BuyConfig
              {
                  StaminaMaxValue = 50,
              }                   // 購入時に使用するオプション値(詳細は後述)
          );
    }

    void Update () {

    }
}

設定可能な BuyConfig

BuyConfig は購入処理の過程で必要となる設定値を格納します。 以下の値が設定可能です。

GS2-Money

int ChargeMoneySlot

課金通貨を加算する際に使用するウォレットのスロット番号を指定します。

Gs2.Gs2Showcase.Resolver.MoneySlotResolver ChargeMoneySlotResolver

課金通貨を加算する際に使用するウォレットのスロット番号を応答するリゾルバを設定します。 リゾルバは購入処理を実行している EzItem インスタンスを受け取れます。

int ConsumeMoneySlot

課金通貨を消費する際に使用するウォレットのスロット番号を指定します。

Gs2.Gs2Showcase.Resolver.MoneySlotResolver ConsumeMoneySlotResolver

課金通貨を消費する際に使用するウォレットのスロット番号を応答するリゾルバを設定します。 リゾルバは購入処理を実行している EzItem インスタンスを受け取れます。

int MoneySlot

ChargeMoneySlot / ConsumeMoneySlot にまとめて同じ値を設定します。

Gs2.Gs2Showcase.Resolver.MoneySlotResolver MoneySlotResolver

ChargeMoneySlotResolver / ConsumeMoneySlotResolver にまとめて同じ値を設定します。

GS2-Stamina

bool StaminaOverflow

スタミナを加算する際に最大値を超えて加算を行うか指定します。

Gs2.Gs2Showcase.Resolver.MoneySlotResolver RecoveryStaminaOverflowResolver

スタミナを加算する際に最大値を超えて加算を行うかを応答するリゾルバを設定します。 リゾルバは購入処理を実行している EzItem インスタンスを受け取れます。

bool StaminaMaxValue

スタミナの最大値を指定します。

Gs2.Gs2Showcase.Resolver.MoneySlotResolver StaminaMaxValueResolver

スタミナの最大値を応答するリゾルバを設定します。 リゾルバは購入処理を実行している EzItem インスタンスを受け取れます。