GS2-Mission
ミッション・実績機能
ゲーム内の蓄積した行動に基づいて、プレイヤーに報酬を与えるための仕組みです。 一般的に 実績・トロフィー・ミッション と呼ばれる機能を実現するための機能です。
ミッションカウンター
プレイヤーの行動に基づく回数を数えるためのエンティティです。 「クエストをクリアした回数」「キャラクターを強化した回数」「ガチャを引いた回数」といったゲーム内の行動回数をカウントするためのカウンターを用意します。
カウンターにはスコープを設定できます。 スコープには以下の値を設定可能です。
スコープの種類 | スコープの内容 |
---|---|
リセットしない | ゲームプレイ開始からの総計 |
毎日X時にリセット | 当日実行した回数 |
毎週X曜日X時にリセット | 今週実行した回数 |
毎月X日X時にリセット | 今月実行した回数 |
カウンターの値は各スコープで管理され、ミッションの達成条件には各スコープの値を利用できます。
ミッションタスク
プレイヤーに提示する目標を定義するマスターデータです。
「ミッションカウンター」 と 「スコープ」 と「目標値」、そしてその目標を達成した時に得られる「報酬」を設定します。 たとえば以下のような設定ができます。
ミッションカウンター | スコープの種類 | 目標値 | 報酬 |
---|---|---|---|
クエストをクリアした回数 | 毎日X時にリセット | 10 | アイテムA |
クエストをクリアした回数 | 毎週X曜日X時にリセット | 50 | アイテムB |
キャラクターを強化した回数 | 毎日X時にリセット | 5 | アイテムC |
ミッショングループ
複数のミッションタスクを束ねるエンティティです。 ミッショングループには報酬の受け取りフラグのリセット周期を設定できます。
ミッションカウンター | スコープの種類 | 目標値 | 報酬 |
---|---|---|---|
クエストをクリアした回数 | 毎日X時にリセット | 10 | アイテムA |
キャラクターを強化した回数 | 毎日X時にリセット | 5 | アイテムC |
これらのミッションタスクを一つのミッショングループに関連付けて、ミッショングループの報酬の受け取りフラグのリセット周期にも「毎日X時にリセット」を設定することで ミッションタスクを毎日達成すると、毎日報酬を受け取れるようになります。
実装例
ミッションカウンターを上昇
ミッションカウンターを上昇はゲームエンジン用の SDK では処理できません。
GS2-Quest のクリア報酬や、GS2-Lottery の抽選報酬としてカウンターを上昇するといった方法で実装してください。
ミッションタスクの達成状況・報酬受け取り情報を取得
var item = await gs2.Mission.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).Complete(
missionGroupName: "mission-group-0001"
).ModelAsync();
const auto Domain = Gs2->Mission->Namespace(
"namespace-0001" // namespaceName
)->Me(
AccessToken
)->Complete(
"mission-group-0001" // missionGroupName
);
const auto item = Domain.Model();
ミッション達成報酬を受け取り
var result = await gs2.Mission.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).Complete(
missionGroupName: "mission-group-0001"
).ReceiveRewardsAsync(
missionTaskName: "mission-task-0001"
);
const auto Domain = Gs2->Mission->Namespace(
"namespace-0001" // namespaceName
)->Me(
AccessToken
)->Complete(
"mission-group-0001" // missionGroupName
);
const auto Future = Domain->ReceiveRewards(
"mission-task-0001"
);
Future->StartSynchronousTask();
if (Future->GetTask().IsError()) return false;
ミッションカウンターの値を取得
var item = await gs2.Mission.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).Counter(
counterName: "quest_complete"
).ModelAsync();
const auto Domain = Gs2->Mission->Namespace(
"namespace-0001" // namespaceName
)->Me(
AccessToken
)->Counter(
"quest_complete" // counterName
);
const auto item = Domain.Model();
ミッションの目標値を取得
var items = await gs2.Mission.Namespace(
namespaceName: "namespace-0001"
).MissionGroupModel(
missionGroupName: "mission-group-0001"
).MissionTaskModelsAsync(
).ToListAsync();
const auto Domain = Gs2->Mission->Namespace(
"namespace-0001" // namespaceName
)->MissionGroupModel(
"mission-group-0001" // missionGroupName
);
const auto It = Domain->MissionTaskModels(
);
TArray<Gs2::UE5::Mission::Model::FEzMissionTaskModelPtr> Result;
for (auto Item : *It)
{
if (Item.IsError())
{
return false;
}
Result.Add(Item.Current());
}