GS2 Blog

Game Server Services(https://gs2.io/) の最新情報をお届けします

【新機能】GS2-Script によるマイクロサービス間を協調動作できるように

みなさんこんにちは。GS2の丹羽です。

今日は近日公開予定の新機能の案内をしたいと思います。
今回紹介する機能は GS2 にとって今後重要な役割を果たす機能です。

GS2のいろいろなマイクロサービスで発生したイベントをトリガーとして GS2-Script を起動できるようになります。
また、GS2-Script 内で GS2-SDK が利用可能となり、そのイベント内でさらに GS2 の様々なマイクロサービスを呼び出すことが出来るようになります。

例として、GS2-ConsumableItem と GS2-Stamina を使って説明したいと思います。
GS2-ConsumableItem には アイテムの設定値として『アイテムを消費したとき』 をトリガーとして GS2-Script を起動できます。
その際に以下のパラメータが GS2-Script に渡されます。

{
  "itemPoolName": "アイテムプール名",
  "itemName": "アイテム名",
  "userId": "使用者のユーザID",
  "count": "消費数量",
  "accessToken": "アクセストークン"
}

『アイテムを消費したとき』のレスポンスとしては result に消費を許可するかをbool値で返します。
オプションで count を返すことで指定された消費数量を異なる値に変更することも出来ます。

result = {
  permit=true
}

では、さっそくこの仕組みを使用してスタミナを回復するアイテムを実装してみます。
スタミナを回復する『StaminaPotion』というアイテムを作成し、アイテムを消費したときのイベントとして 『UseStaminaPotion』 という GS2-Script を関連づけます。
これで、StaminaPotion を消費したときに GS2-Script が実行されるようになります。

次に 『UseStaminaPotion』というスクリプトに以下の実装をします。

stamina_client = client('stamina')
stamina_client:change_stamina({
  staminaPoolName='stamina-0001',
  variation=10*args.count,
  maxValue=100,
  overflow=false,
  accessToken=args.accessToken
})
result = {
  permit=true
}

これで、『StaminaPotion』を消費したときに GS2-Stamina の 『stamina-0001』のスタミナ値が 消費数量×10 回復します。
※ スタミナの最大値である maxValue を引数で取るようになっていますが、
  GS2-Script 側でスタミナの最大値を取得する GS2-Script を定義でき、こちらを定義した場合は maxValue の指定は不要になります。

では、もうすこしちゃんとエラーハンドリングをして、スタミナの回復に失敗したときにはアイテムを消費しないようにします。

stamina_client = client('stamina')
response = stamina_client:change_stamina({
  staminaPoolName='stamina-0001',
  variation=10*args.count,
  maxValue=100,
  overflow=false,
  accessToken=args.accessToken
})
result = {
  permit=not(response.isError)
}

permit への戻り値に 『stamina_client:change_stamina』の戻り値に含まれるAPIの実行に成功したかを含むことで
何らかの理由でAPIの呼び出しに失敗した場合はアイテムを消費しないようにできます。

『スタミナの回復』 というチートされるとゲームバランスを崩壊されかねない操作を GS2-Script を経由して実行することで、より安全に設計することが出来るようになります。
このように、独自のゲームサーバを持たずとも『高い自由度』で『安全』で『スケールする』サーバプログラム開発を行えるようにしていきます。

それでは、また。

(C) Game Server Services, Inc.