はじめに
完全な新機能としてランダムなパラメーターを管理する GS2-Enchant の提供を開始しました
機能追加の背景
ゲームによっては武器やキャラクターに固有のパラメーターを持たせたいことがあります。
このような仕組みを導入することで、プレイヤーにより優れた性能を持つ個体を探す楽しみを提供することができます。
Diablo のようなゲームではこの仕組みをうまく活用しており、同一アイテムでもより高いパラメーターを持つアイテムを求めて敵を倒すゲームサイクルを生み出しています。
しかし、GS2 ではこれまでこの機能に該当する機能の提供がなく、GS2-Inventory にアイテムを追加した時のスクリプトで乱数を求め、GS2-Experience に経験値として格納するといったハックが行われてきました。
今回は、このようなハックを用いなくても、固有のパラメーターを実現できるようにするために新機能の追加が行われました。
追加された機能の詳細
GS2-Enchant は武器やキャラクターに固有のパラメーターを持たせることに最適化されたマイクロサービスです。
《固有のパラメーター》には2つの種類を想定して、設計されています。
- バランスパラメーター
- レアリティパラメーター
バランスパラメーター
ゲームバランスを大きく損なうことなく、ランダム性のある性能を提供したい場合に適しているのがバランスパラメーターです。
バランスパラメーターでは、武器やキャラクターが持つ複数のパラメーターの種類をあらかじめ定めます。
一般的には《攻撃力》《防御力》といったものです。そして、それに加えて《パラメーターの総量》を指定します。
例えば、《パラメーターの総量》を100とした場合、《攻撃力》が抽選の結果60となった場合、《防御力》は40に決定します。
レアリティパラメーター
レアリティパラメーターはゲームバランスをよりダイナミックに表現するために使用します。
武器にごくまれに《攻撃力+2》のような補正値がついているものを提供したい時に使用できます。
レアリティパラメーターは複数付与することができます。
そのため、最初にいくつのパラメーターを付与するのかを抽選することになります。
確率の設定には GS2-Lottery や GS2-Quest といった他のマイクロサービスと同様に重みを設定します。
付与するパラメーターの数 | 重み |
0 | 45 |
1 | 4 |
2 | 1 |
このように設定すると
付与するパラメーターの数 | 重み |
0 | 90% |
1 | 8% |
2 | 2% |
の確率でパラメーターを付与することになります。
次に、付与するパラメーターの種類と確率を設定します。
種類 | 重み |
攻撃力+1 | 45 |
攻撃力+2 | 4 |
攻撃力+3 | 1 |
防御力+1 | 45 |
防御力+2 | 4 |
防御力+3 | 1 |
一点気をつけなければならないのは、複数のパラメーターを付与する時
同じパラメーターは2個付与されませんが、類似するパラメーターが付与される可能性があるということです。
例えば、2個のパラメーターを付与する場合《攻撃力+1》が2つ割り当てられることはありませんが、《攻撃力+1》と《攻撃力+3》が割り当てられることはあり得ます。
再抽選
バランスパラメーターもレアリティパラメーターも再抽選を行うことができます。
一般的に、自由に再抽選ができるわけではなく、ゲーム内で貴重なアイテムを消費したり、ゲーム内通貨を使用して再抽選を行えるようにすることになるでしょう。
さらに、再抽選をする際に全てのパラメーターを再抽選するのではなく、一部のパラメーターはロックして再抽選する仕組みも提供します。
プレイヤーは有力なパラメーターを再抽選の対象外とすることで、より効率的にパラメーターを厳選することが可能となります。
このような操作は、より高いコストを要求するようにすることでゲームバランスを破壊することなく、プレイヤーのストレスを軽減できるでしょう。ここにはマネタイズのチャンスもあります。
パラメーターを追加
レアリティパラメーターでは、パラメーターを追加する機能も用意しています。
特殊なアイテムを使用することで、追加のパラメーターを付与できるようなアイデアで活用してください。
Unity からの使用例
パラメーターの初期化/取得
初めてパラメーターの情報を取得した際にパラメーターの抽選処理が作成されます。
var item = await gs2.Enchant.Namespace( namespaceName: "namespace-0001" ).Me( gameSession: GameSession ).RarityParameterStatus( parameterName: "balance-0001", propertyId: "property-0001" ).ModelAsync();