GS2 Blog

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

GS2-Exchange にコスト上昇型交換レート機能を追加しました

はじめに

GS2-Exchange は《対価》と《報酬》を交換するためのマイクロサービスです。
一般的な使用方法としては「《強化素材★1 x 10》と《強化素材★2 x 1》を交換する」というような交換レートを定義して、ゲーム内から呼び出せるようにする役割があります。

機能追加の背景

今回は交換するたびにコストが上昇していくパターンをネイティブでサポートしました。
これまで、同様の実装をしようと思うと以下のようなパターンが考えられました。

GS2-Exchange を使用する場合

複数の交換レートを用意し、それぞれに回数制限を設定します。

1段階目の交換レート

対価
  • GS2-Limit の交換回数カウンターを最大値1で1上昇させる
  • GS2-Inventory から 強化素材★1 を 10 個消費する
報酬
  • GS2-Inventory に 強化素材★2 を 1 加算する

2段階目の交換レート

対価
  • GS2-Limit の交換回数カウンターを最大値2で1上昇させる
  • GS2-Inventory から 強化素材★1 を 20 個消費する
報酬
  • GS2-Inventory に 強化素材★2 を 1 加算する

GS2-Showcase を使用する場合

GS2-Showcase の SalesItemGroup を使用する方法も考えられます。
SalesItemGroup はグループに登録した商品のうち、先頭から順番に購入可能なものが実際に陳列される機能です。

SalesItemGroup の設定

1つ目の商品

対価
  • GS2-Limit の交換回数カウンターを最大値1で1上昇させる
  • GS2-Inventory から 強化素材★1 を 10 個消費する
報酬
  • GS2-Inventory に 強化素材★2 を 1 加算する

2つ目の商品

対価
  • GS2-Limit の交換回数カウンターを最大値2で1上昇させる
  • GS2-Inventory から 強化素材★1 を 20 個消費する
報酬
  • GS2-Inventory に 強化素材★2 を 1 加算する

いずれの方法も実現可能でしたが、どちらにも共通する問題点としてコスト上昇の段階が多い場合にマスターデータが肥大化するという問題がありました。
インフレ系ゲームではゆうに100段階を超える成長段階があり、成長させるたびに成長に必要なコストが増えるのが一般的です。

GS2-Exchange の 《コスト上昇型交換レート》 はこのような仕様を、より簡単に満たせるように設計されています。

追加された機能の詳細

《コスト上昇型交換レート》は通常の交換レートモデルに加えて、いくつかのパラメーターが追加されています。
《calculateType》はコスト上昇の計算式を選択します。

  • linear
  • power
  • gs2_script

が設定可能です。

linear

コストが線形に上昇するケースで使用できます。
このモードを利用する場合、追加で2つのパラメーターを必要とします。

  • baseValue
  • coefficientValue
baseValue + (coefficientValue * 交換回数)

という計算式で求めた値を、consumeActions に設定した交換に必要な数量にかけます。

power

コストが非線形に上昇するケースで使用できます。
このモードを利用する場合、追加で1つのパラメーターを必要とします。

  • coefficientValue
coefficientValue * (交換回数 + 1) ^ 2

という計算式で求めた値を、consumeActions に設定した交換に必要な数量にかけます。

gs2_script

コストの計算をより柔軟な計算式をもとに行いたい場合に使用します。
linear と同じ実装をする場合は以下のスクリプトを定義します。

currentExchangeCount = args.currentExchangeCount
quantity = quantity

cost = 100
for i = 1 , quantity do
	cost = cost + (i + currentExchangeCount - 1) * 50
end

result = {
    cost=cost
}

Unity からの使用例

    var result = await gs2.Exchange.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Exchange(
    ).IncrementalExchangeAsync(
        rateName: "rate-0001",
        count: 1,
    );
(C) Game Server Services, Inc.