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());
    }

詳細なリファレンス