GS2-Grade
キャラクターや装備の育成には短期成長目標としてのレベルアップとは別にグレードアップを用意することが一般的な仕様です。 グレードアップすることによって、レベルキャップを引き上げることができ、キャラクターや装備をより強力に育成することが可能となります。
グレードアップの方法はいくつかの方法が考えられ、育成素材を消費することでグレードアップできるものや、同種のキャラクターや装備を合成することでグレードアップできるものもあります。 GS2-Grade は方法については問わず、グレードごとのレベルキャップを設定することで、GS2-Experienceのレベルキャップの運用をより簡易に実装できるようにすることを目的としています。
グレード
グレードごとに GS2-Experience のランクキャップに設定する値を定義できます。
グレードの初期値
プロパティIDが正規表現にマッチするかによって初期グレードの値を設定できます。 例えば、GS2-Inventory の ItemModel の名前が SSR から始まる場合はグレード3、SR から始まる場合はグレード2で開始するようにすることで ItemModel の種類によって初期のランクキャップを変えることが可能です。
グレード引き上げ素材判定
グレードアップの方法として「同種のキャラクターや装備を合成する」ケースで、素材として使用しようとしているリソースが「同種のキャラクターや装備」であるかを判定する処理をサポートする機能が用意されています。 グレードのプロパティIDから正規表現によって、パラメーターを取り出して正規表現を構築し、素材として使用しようとしているリソースのプロパティIDがマッチするかを判定することで実現します。
例えば、GS2-Inventory の ItemSet が同種の ItemModel によるものかを判定する場合は以下のように正規表現を設定します。
propertyIdRegex: grn:gs2:{region}:{ownerId}:inventory:namespace-0001:user:(.*):inventory:character:item:(.*):.*
gradeUpPropertyIdRegex: grn:gs2:{region}:{ownerId}:inventory:namespace-0001:user:$1:inventory:character:item:$2:.*
これで、propertyIdRegex を使用して「ユーザーID」と「ItemModel の名前」を取り出します。 ユーザーIDが「user-0001」、ItemModel の名前が「item-0001」、ItemSet の名前が「item-set-0001」だとすれば、ItemSetのGRN(プロパティID)は
grn:gs2:{region}:{ownerId}:inventory:namespace-0001:user:user-0001:inventory:character:item:item-0001:item-set-0001
となり、gradeUpPropertyIdRegex の置換後の値が
gradeUpPropertyIdRegex: grn:gs2:{region}:{ownerId}:inventory:namespace-0001:user:user-0001:inventory:character:item:item-0001:.*
となります。 これによって、同種のアイテムを素材に指定することができる ような表現が可能となります。
実装例
グレードの加算
グレードの加算はゲームエンジン用の SDK では処理できません。
GS2-Exchange で強化素材の消費や、GS2-Enhance 強化報酬としてグレードを加算するようにしてください。
グレードの一覧を取得
var items = await gs2.Grade.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).StatusesAsync(
gradeName: "grade-0001"
).ToListAsync();
const auto It = Gs2->Grade->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
)->Statuses(
"grade-0001" // gradeName
);
TArray<Gs2::UE5::Grade::Model::FEzStatusPtr> Result;
for (auto Item : *It)
{
if (Item.IsError())
{
return false;
}
Result.Add(Item.Current());
}
グレードの取得
var item = await gs2.Grade.Namespace(
namespaceName: "namespace-0001"
).GradeModel(
gradeName: "grade-0001"
).ModelAsync();
const auto Future = Gs2->Grade->Namespace(
"namespace-0001" // namespaceName
)->GradeModel(
"grade-0001" // gradeName
)->Model();
Future->StartSynchronousTask();
if (Future->GetTask().IsError())
{
return false;
}
GS2-Experience のランクキャップを同期
グレードが変化したら、GS2-Experience にランクキャップへの反映は自動的に行われます。 ただし、グレードモデルを更新して特定グレードにおけるランクキャップの値を更新した際には以下の同期APIを明示的に呼び出すことで、更新後のランクキャップを適用することができます。
var result = await gs2.Grade.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).Status(
gradeName: "grade-0001",
propertyId: "property-0001"
).ApplyRankCapAsync(
);
var item = await result.ModelAsync();
const auto Future = Gs2->Grade->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
)->Status(
"grade-0001", // gradeName
"property-0001" // propertyId
)->ApplyRankCap(
);
Future->StartSynchronousTask();
if (Future->GetTask().IsError())
{
return false;
}
// obtain changed values / result values
const auto Future2 = Future->GetTask().Result()->Model();
Future2->StartSynchronousTask();
if (Future2->GetTask().IsError())
{
return Future2->GetTask().Error();
}
const auto Result = Future2->GetTask().Result();