Game Server Services とは
Game Server Services(GS2) というサービスで、ゲームサーバのSaaSです。
GS2 で出来ること
ゲームで必要とされるようなサーバ機能が一式用意されています。
Unity SDK をはじめとした、様々なプログラミング言語のSDKが提供されており、
サーバ機能ごとに直感的なAPIが用意されており、ゲーム内からは必要なタイミングで必要なAPIを呼び出すだけで使用できます。
利用料金
Individual
過去12か月間の売上高が1000万円未満であれば、無料で使用できます。
ただし、ゲームのタイトル画面にロゴを掲載する必要があります。
Professional
APIを呼び出すたびに 0.02円 がかかります。
100万回呼び出して2万円ということになります。
Enterprise
月間アクティブユーザ一人当たり30円~100円かかります。
登録方法
メールアドレスと名前、パスワードを入力すると登録できます。
その後メールアドレス宛に認証メールが届くのでURLをクリックすると登録が完了します。
はじめかた
プロジェクトの作成
はじめにプロジェクトを作成する必要があります。
プロジェクトの名前と料金プランを選択します。
プロジェクトの名前には英数字しか使用できません。
プロジェクトをが作成出来たら『管理メニューへ』を選択します。
ダッシュボードが表示されます。
まずは『はじめかた』を見てみます。
チュートリアル
開発ドキュメントページに遷移して、チュートリアルが表示されます。
詳細はチュートリアルを読むとして、ざっくり手順を説明します。
クレデンシャルの作成
クレデンシャルとは
クレデンシャルとは、ネットワーク セキュリティの世界で使用された場合には、IDやパスワードをはじめとする、ユーザ等の認証に用いられる情報の総称を意味します。 「クレデンシャル情報」と言う場合もあります。 多くのシステムは、ユーザIDをパスワードを、クレデンシャルとして使用しています。
クレデンシャル - F5 Networks
ようするに、ゲーム内からGS2にアクセスするためのAPIキーです。
GS2 では複数のクレデンシャルを作成できて、クレデンシャルごとに操作可能なAPIを設定できます。
これを使うと、ゲーム内から使用するクレデンシャルと、管理ツールから使用するクレデンシャルで出来ることを分けて、管理ツールはより強力な権限を持たせることができます。
ユーザの作成
クレデンシャルは Identifier の管理画面から追加することができます。
まずはユーザを作成する必要があります。
InGame というユーザを作成します。
ユーザの作成ができました。
権限の設定
セキュリティポリシーのタブでこのユーザで操作できる権限を設定します。
セキュリティポリシーは自分で作成することもできますが、基本的な設定は最初から用意されています。
ApplicationAccess の『割り当て』を選択して割り当てます。
これで、ゲーム内から使用するのに十分な権限のユーザが作成できました。
クレデンシャルを発行
続けて、このユーザ権限でゲーム内からAPIを呼び出すためのクレデンシャルを発行します。
クレデンシャルタブを選択して『クレデンシャルの新規作成』を選択します。
InGame ユーザのクレデンシャルを発行するので、そのまま作成をクリックします。
クライアント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 を選択します。
続けて『スタックの新規作成』を選択します。
スタック名に適当に名前を付けて、テンプレートデータに先ほどの yaml ファイルを指定します。
しばらく待つと作成が完了します。
アウトプットタブを選択すると、クレデンシャルの内容が確認できます。
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
できました。
SDK のダウンロード
まずは Unity 向けのSDKをダウンロードします。
unitypackage を実行
unitypackage を実行してアセットをインポートします。
インストーラーを実行
メニューに Game Server Services が増えるので 『インストーラー』 を選択します。
インストールを実行します。
なんか出てくるのでしばらく待ちます。
ログインボタンが出てきますが、そっと閉じます。
アカウントを作成するコードを記述
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を作ってみようと思います。