GS2-Gold

ゴールドの管理を GS2 SDK for Unity から利用する手順を解説します。

ゴールドを作成する

GS2マネージメントコンソールの GS2-Gold から新しくゴールドを作成します。

ゴールドは複数のアカウントのメッセージをまとめて管理する単位です。

../../../_images/step-00012.png

『ゴールドの新規作成』をクリックします。

../../../_images/step-00022.png

ゴールドの名前をつけます。

サービスクラスは想定されるアクセス数に応じたサイズを選択します。

残高最大値には、各ウォレットに保有できる残高の最大値を入力します。

入手量の制限タイプには、一定期間内の入手量を制限するかどうかを指定します。

「なし」以外を指定した場合、残高上限とは別に、各ウォレットにおける一定の期間内の合計入手量に制限をかけることができます。

「毎日」では、毎日指定の時刻を通過するごとに合計入手量のカウントがリセットされます。

「毎週」では、指定の曜日の指定の時刻を通過するごとに合計入手量のカウントがリセットされます。

「毎月」では、指定の日にちの指定の時刻を通過するごとに合計入手量のカウントがリセットされます。

時刻の指定は、 UTC でおこないます。

月末日を超える日にちを指定した場合、月末日を指定したものとして扱われます。

したがって、たとえば毎月1日の午前5時に合計入手量のカウントをリセットしたい場合、

  • 入手量の制限タイプに「毎日」
  • リセットの日にちに「31」
  • リセットの時刻に「20」

と指定します。

連携用URL はメッセージ開封時にサーバに通知してほしい場合、URLを指定します。

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

ゴールド処理を実装

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

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

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

ウォレットの情報を取得

gs2.Gold.Get(
    result =>
    {
        if(result.Error != null) throw result.Error;
        // 取得に成功するとウォレットの状態を取得できます
        var wallet = result.Result;
        Debug.Log("BalanceMax:    " + wallet.Balance);
        Debug.Log("LatestGainMax: " + wallet.LatestGain);
    },
    session,            // GS2 のログインセッション
    GOLD_NAME);         // GS2-Gold に作成したゴールド名

gs2.Gold.GetSettings(
    result =>
    {
        if (result.Error != null) throw result.Error;
        // 取得に成功するとゴールドごとのウォレットの設定を取得できます
        var walletSettings = result.Result;
        Debug.Log("Balance:       " + walletSettings.BalanceMax);
        Debug.Log("LatestGain:    " + walletSettings.LatestGainMax);
        Debug.Log("ResetType:     " + walletSettings.ResetType);
    },
    session,            // GS2 のログインセッション
    GOLD_NAME);         // GS2-Gold に作成したゴールド名

gs2.Gold.Get() は、ウォレットに保持されている残高などの状態を取得します。

gs2.Gold.GetSettings() は、ウォレットに保持できる残高の最大値などの設定を取得します。

ウォレットの設定は、通例、ウォレットの状態より変化の頻度が低く、また変更が運営の直接の管理下にあることが多いと予想されますので、そのような場合にはログイン直後に一度だけ取得をおこない、以降はその値を保持するような設計をおすすめします。

実装サンプル

public class GameLogic : MonoBehaviour {

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

    private const string GOLD_NAME = "gold-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 GAME_NAME = "game-0001";
        string KEY_NAME = "account";
        string USER_ID = "user";
        string PASSWORD = "password";
        string authenticationToken = null;
        yield return gs2.Account.Authentication(
            result => {
                if(result.Error != null) throw result.Error;
                authenticationToken = result.Result;
            },
            GAME_NAME,
            KEY_NAME,
            USER_ID,
            PASSWORD);

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

        StartCoroutine(GetWalletSettings());
    }

    IEnumerator GetWalletSettings() {
        // ゴールドのウォレット設定を取得します
        yield return gs2.Gold.GetSettings(
            result =>
            {
                if (result.Error != null) throw result.Error;
                // 取得に成功するとゴールドごとのウォレットの設定を取得できます
                var walletSettings = result.Result;
                Debug.Log("BalanceMax:    " + walletSettings.BalanceMax);
                Debug.Log("LatestGainMax: " + walletSettings.LatestGainMax);
                Debug.Log("ResetType:     " + walletSettings.ResetType);
            },
            session,            // GS2 のログインセッション
            GOLD_NAME);         // GS2-Gold に作成したゴールド名

        StartCoroutine(GetWallet());
    }

    IEnumerator GetWallet() {
        // ユーザーのウォレットを取得します
        yield return gs2.Gold.Get(
            result =>
            {
                if(result.Error != null) throw result.Error;
                // 取得に成功するとウォレットの状態を取得できます
                var wallet = result.Result;
                Debug.Log("Balance:       " + wallet.Balance);
                Debug.Log("LatestGain:    " + wallet.LatestGain);
            },
            session,                    // GS2 のログインセッション
            GOLD_NAME);         // GS2-Gold に作成したゴールド名
    }

    void Update() {

    }
}

ウォレット残高を消費

gs2.Gold.Withdraw(
    r => {
        if(r.Error != null) throw r.Error;
    },
    session,            // GS2 のログインセッション
    GOLD_NAME,          // GS2-Gold に作成したゴールド名
    375);               // 消費する残高の量

gs2.Gold.Withdraw() でウォレットから残高を引き出し、消費します。

ウォレットに十分な残高がない場合は処理に失敗し、 result.Error に失敗の内容が通知されます。

また、マネージメントコンソールで開封通知を有効にしている場合は、ここで 連携用URL が呼び出されます。

連携用URL の呼び出しに失敗すると開封に失敗し、 result.Error に失敗の内容が通知されます。

実装サンプル

public class GameLogic : MonoBehaviour {

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

    private const string GOLD_NAME = "gold-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 GAME_NAME = "game-0001";
        string KEY_NAME = "account";
        string USER_ID = "user";
        string PASSWORD = "password";
        string authenticationToken = null;
        yield return gs2.Account.Authentication(
            result => {
                if(result.Error != null) throw result.Error;
                authenticationToken = result.Result;
            },
            GAME_NAME,
            KEY_NAME,
            USER_ID,
            PASSWORD);

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

        StartCoroutine(WithdrawFromWallet());
    }

    IEnumerator WithdrawFromWallet() {
        // ウォレットから残高を消費します
        yield return gs2.Gold.Withdraw(
            r => {
                if(r.Error != null) throw r.Error;
            },
            session,            // GS2 のログインセッション
            GOLD_NAME,          // GS2-Gold に作成したゴールド名
            375);               // 消費する残高の量
    }

    void Update() {

    }
}