LoginSignup
9
12

More than 3 years have passed since last update.

Game Server Services ことはじめ

Last updated at Posted at 2020-12-21

Game Server Services とは

Game Server Services(GS2) というサービスで、ゲームサーバのSaaSです。

image.png
https://gs2.io

GS2 で出来ること

image.png

ゲームで必要とされるようなサーバ機能が一式用意されています。

image.png

Unity SDK をはじめとした、様々なプログラミング言語のSDKが提供されており、
サーバ機能ごとに直感的なAPIが用意されており、ゲーム内からは必要なタイミングで必要なAPIを呼び出すだけで使用できます。

利用料金

image.png

Individual

過去12か月間の売上高が1000万円未満であれば、無料で使用できます。
ただし、ゲームのタイトル画面にロゴを掲載する必要があります。

Professional

APIを呼び出すたびに 0.02円 がかかります。
100万回呼び出して2万円ということになります。

Enterprise

月間アクティブユーザ一人当たり30円~100円かかります。

登録方法

image.png

メールアドレスと名前、パスワードを入力すると登録できます。
その後メールアドレス宛に認証メールが届くのでURLをクリックすると登録が完了します。

はじめかた

プロジェクトの作成

image.png

はじめにプロジェクトを作成する必要があります。

image.png

プロジェクトの名前と料金プランを選択します。
プロジェクトの名前には英数字しか使用できません。

image.png

プロジェクトをが作成出来たら『管理メニューへ』を選択します。

image.png

ダッシュボードが表示されます。
まずは『はじめかた』を見てみます。

チュートリアル

image.png

開発ドキュメントページに遷移して、チュートリアルが表示されます。
詳細はチュートリアルを読むとして、ざっくり手順を説明します。

クレデンシャルの作成

クレデンシャルとは

クレデンシャルとは、ネットワーク セキュリティの世界で使用された場合には、IDやパスワードをはじめとする、ユーザ等の認証に用いられる情報の総称を意味します。 「クレデンシャル情報」と言う場合もあります。 多くのシステムは、ユーザIDをパスワードを、クレデンシャルとして使用しています。
クレデンシャル - F5 Networks

ようするに、ゲーム内からGS2にアクセスするためのAPIキーです。

GS2 では複数のクレデンシャルを作成できて、クレデンシャルごとに操作可能なAPIを設定できます。
これを使うと、ゲーム内から使用するクレデンシャルと、管理ツールから使用するクレデンシャルで出来ることを分けて、管理ツールはより強力な権限を持たせることができます。

image.png

ユーザの作成

クレデンシャルは Identifier の管理画面から追加することができます。
まずはユーザを作成する必要があります。

image.png

InGame というユーザを作成します。

image.png

ユーザの作成ができました。

image.png

権限の設定

セキュリティポリシーのタブでこのユーザで操作できる権限を設定します。

image.png

セキュリティポリシーは自分で作成することもできますが、基本的な設定は最初から用意されています。
ApplicationAccess の『割り当て』を選択して割り当てます。

image.png

これで、ゲーム内から使用するのに十分な権限のユーザが作成できました。

クレデンシャルを発行

続けて、このユーザ権限でゲーム内からAPIを呼び出すためのクレデンシャルを発行します。

image.png

クレデンシャルタブを選択して『クレデンシャルの新規作成』を選択します。

image.png

InGame ユーザのクレデンシャルを発行するので、そのまま作成をクリックします。

image.png

クライアントIDとクライアントシークレットが発行されました。
ゲーム内にはこの値を埋め込んで使用します。

GS2-Deploy を使ってみる

これまで管理画面でポチポチ登録していましたが、この手順を自動化できます。

テンプレートファイルの説明

自動化するためには、どういう設定が必要かをファイルに記述する必要があります。
このファイルをテンプレートと呼びます。

テンプレートを更新してアップロードすると、前回アップロード時との差分を検出して
増えている項目があれば『作成』
減っている項目があれば『削除』
変わっている項目があれば『変更』
してくれる仕組みが GS2-Deploy です。

これを使いこなせば、いちいち管理画面を触らなくていいだけでなく、
サーバの設定をバージョン管理したり、異なるGS2アカウントやプロジェクトに環境を再構築できます。

GS2TemplateFormatVersion: "2019-05-01"
Description: GS2 SDK identifier template Version 2019-07-10

Globals:
  Alias:
    ApplicationUserName: InGame

Resources:
  IdentifierApplicationUser:
    Type: GS2::Identifier::User
    Properties:
      Name: ${ApplicationUserName}

  IdentifierApplicationUserAttachPolicy:
    Type: GS2::Identifier::AttachSecurityPolicy
    Properties:
      UserName: ${ApplicationUserName}
      SecurityPolicyId: grn:gs2::system:identifier:securityPolicy:ApplicationAccess
    DependsOn:
      - IdentifierApplicationUser

  IdentifierApplicationIdentifier:
    Type: GS2::Identifier::Identifier
    Properties:
      UserName: ${ApplicationUserName}
    DependsOn:
      - IdentifierApplicationUser

Outputs:
  ApplicationClientId: !GetAttr IdentifierApplicationIdentifier.Item.ClientId
  ApplicationClientSecret: !GetAttr IdentifierApplicationIdentifier.ClientSecret

こんな感じの yaml ファイルで設定を定義します。

GS2TemplateFormatVersion: "2019-05-01"
Description: GS2 SDK identifier template Version 2019-07-10

この辺はおまじないです。

Globals:
  Alias:
    ApplicationUserName: InGame

作成するユーザ名の定数を宣言しています。

  IdentifierApplicationUser:
    Type: GS2::Identifier::User
    Properties:
      Name: ${ApplicationUserName}

名前が ApplicationUserName(InGame) のユーザを作成するという設定です。

  IdentifierApplicationUserAttachPolicy:
    Type: GS2::Identifier::AttachSecurityPolicy
    Properties:
      UserName: ${ApplicationUserName}
      SecurityPolicyId: grn:gs2::system:identifier:securityPolicy:ApplicationAccess
    DependsOn:
      - IdentifierApplicationUser

ApplicationAccess のセキュリティポリシーを割り当てる設定です。
DependsOn でユーザの作成より後に実行するようにしています。


  IdentifierApplicationIdentifier:
    Type: GS2::Identifier::Identifier
    Properties:
      UserName: ${ApplicationUserName}
    DependsOn:
      - IdentifierApplicationUser

InGameユーザのクレデンシャルを発行する設定です。
こちらも、DependsOn でユーザの作成より後に実行するようにしています。

Outputs:
  ApplicationClientId: !GetAttr IdentifierApplicationIdentifier.Item.ClientId
  ApplicationClientSecret: !GetAttr IdentifierApplicationIdentifier.ClientSecret

クライアントIDとクライアントシークレットの値を保存します。
ここで指定しているパスは、クレデンシャルの新規作成API の戻り値の値です。

GS2-Deploy にアップロードしてみる

サイドメニューから 管理>Deploy を選択します。

image.png

続けて『スタックの新規作成』を選択します。

image.png

スタック名に適当に名前を付けて、テンプレートデータに先ほどの yaml ファイルを指定します。

image.png

しばらく待つと作成が完了します。

image.png

アウトプットタブを選択すると、クレデンシャルの内容が確認できます。

image.png

GS2-Account でアカウントを作ってみる

アカウントを作成するためには、アカウントのネームスペースと、アカウントの認証に使用する暗号カギを作成する必要があります。

GS2-Deploy でアカウントの初期設定をする

以下のテンプレートを GS2-Deploy でデプロイします。

GS2TemplateFormatVersion: "2019-05-01"
Description: GS2-Account initialize template Version 2010-06-26

Globals:
  Alias:
    AccountNamespaceName: game-0001
    KeyNamespaceAccountAuthentication: account-encryption-key-namespace
    KeyAccountAuthentication: account-encryption-key

Resources:
  KeyNamespaceAccountAuthentication:
    Type: GS2::Key::Namespace
    Properties:
      Name: ${KeyNamespaceAccountAuthentication}

  KeyAccountAuthentication:
    Type: GS2::Key::Key
    Properties:
      NamespaceName: ${KeyNamespaceAccountAuthentication}
      Name: ${KeyAccountAuthentication}
    DependsOn:
      - KeyNamespaceAccountAuthentication

  AccountNamespace:
    Type: GS2::Account::Namespace
    Properties:
      Name: ${AccountNamespaceName}

Outputs:
  AccountNamespaceName: !GetAttr AccountNamespace.Item.Name
  KeyAccountAuthenticationKeyId: !GetAttr KeyAccountAuthentication.Item.KeyId

image.png

できました。

SDK のダウンロード

まずは Unity 向けのSDKをダウンロードします。

unitypackage を実行

image.png

unitypackage を実行してアセットをインポートします。

インストーラーを実行

image.png

メニューに Game Server Services が増えるので 『インストーラー』 を選択します。

image.png

インストールを実行します。

image.png

なんか出てくるのでしばらく待ちます。

image.png

ログインボタンが出てきますが、そっと閉じます。

アカウントを作成するコードを記述

using System;
using System.Collections;
using System.Collections.Generic;
using Gs2.Core;
using Gs2.Unity.Gs2Account.Model;
using Gs2.Unity.Gs2Account.Result;
using Gs2.Unity.Util;
using UnityEngine;

public class Gs2AccountSample2 : MonoBehaviour
{
    // GS2-Identifier で発行したクライアントID
    public string clientId;

    // GS2-Identifier で発行したクライアントシークレット
    public string clientSecret;

    // アカウントを作成する GS2-Account のネームスペース名
    public string accountNamespaceName;

    // アカウントの認証結果に付与する署名を計算するのに使用する暗号鍵
    public string accountEncryptionKeyId;

    void Start()
    {
        StartCoroutine(Create());
    }

    public IEnumerator Create()
    {
        // GS2 SDK のクライアントを初期化

        Debug.Log("GS2 SDK のクライアントを初期化");

        var profile = new Gs2.Unity.Util.Profile(
            clientId: clientId,
            clientSecret: clientSecret,
            reopener: new Gs2BasicReopener()
        );

        {
            AsyncResult<object> asyncResult = null;

            var current = profile.Initialize(
                r => { asyncResult = r; }
            );

            yield return current;

            // コルーチンの実行が終了した時点で、コールバックは必ず呼ばれています

            // クライアントの初期化に失敗した場合は終了
            if (asyncResult.Error != null)
            {
                OnError(asyncResult.Error);
                yield break;
            }
        }

        var gs2 = new Gs2.Unity.Client(profile);

        // アカウントを新規作成

        Debug.Log("アカウントを新規作成");

        EzAccount account = null;

        {
            AsyncResult<EzCreateResult> asyncResult = null;

            var current = gs2.Account.Create(
                r => { asyncResult = r; },
                accountNamespaceName
            );

            yield return current;

            // コルーチンの実行が終了した時点で、コールバックは必ず呼ばれています

            // アカウントが作成できなかった場合は終了
            if (asyncResult.Error != null)
            {
                OnError(asyncResult.Error);
                yield break;
            }

            // 作成したアカウント情報を取得
            account = asyncResult.Result.Item;
        }

        // GS2 SDK の終了処理

        Debug.Log("GS2 SDK の終了処理");

        {
            // ゲームを終了するときなどに呼び出してください。
            // 頻繁に呼び出すことは想定していません。
            var current = profile.Finalize();

            yield return current;
        }
    }

    private void OnError(Exception e)
    {
        Debug.Log(e.ToString());
    }
}

クライアントの初期化

        // GS2 SDK のクライアントを初期化

        Debug.Log("GS2 SDK のクライアントを初期化");

        var profile = new Gs2.Unity.Util.Profile(
            clientId: clientId,
            clientSecret: clientSecret,
            reopener: new Gs2BasicReopener()
        );

        {
            AsyncResult<object> asyncResult = null;

            var current = profile.Initialize(
                r => { asyncResult = r; }
            );

            yield return current;

            // コルーチンの実行が終了した時点で、コールバックは必ず呼ばれています

            // クライアントの初期化に失敗した場合は終了
            if (asyncResult.Error != null)
            {
                OnError(asyncResult.Error);
                yield break;
            }
        }

        var gs2 = new Gs2.Unity.Client(profile);

クライアントIDとクライアントシークレットを使用して初期化を行います。

アカウントの新規作成

        // アカウントを新規作成

        Debug.Log("アカウントを新規作成");

        EzAccount account = null;

        {
            AsyncResult<EzCreateResult> asyncResult = null;

            var current = gs2.Account.Create(
                r => { asyncResult = r; },
                accountNamespaceName
            );

            yield return current;

            // コルーチンの実行が終了した時点で、コールバックは必ず呼ばれています

            // アカウントが作成できなかった場合は終了
            if (asyncResult.Error != null)
            {
                OnError(asyncResult.Error);
                yield break;
            }

            // 作成したアカウント情報を取得
            account = asyncResult.Result.Item;
        }

gs2.Account.Create を呼び出すとアカウントを作成できます。

次回予告

導入手順だけで結構な量になってしまいました。
次回はアイテムの所持状況の管理APIを作ってみようと思います。

Game Server Services で所持品を管理

9
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
12