はじめに
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, );