GS2-Mission SDK for Game Engine API リファレンス

ゲームエンジン向け GS2-Mission SDK の モデルの仕様 と API のリファレンス

モデル

EzComplete

ミッションの達成状況

特定のミッショングループに対するユーザーのミッション達成状況と報酬受け取り状況を追跡します。達成済みタスク名と報酬受け取り済みタスク名を別々のリストで管理し、達成されたタスクと実際に報酬が受け取られたタスクを区別します。

有効化条件必須デフォルト値の制限説明
missionGroupNamestring
~ 128文字ミッショングループ名
この達成状況レコードが属するミッショングループの名前です。ユーザーごと・ミッショングループごとに1つの達成状況レコードが存在します。
completedMissionTaskNamesList<string>[]0 ~ 1000 items達成済みのタスク名リスト
ユーザーが達成した(達成条件を満たした)ミッションタスクの名前です。カウンターが目標値に達するか検証アクションが成功した時点でこのリストに追加されます。報酬の受け取りの有無は問いません。
receivedMissionTaskNamesList<string>[]0 ~ 1000 items報酬の受け取り済みのタスク名リスト
ユーザーが達成報酬を受け取り済みのミッションタスクの名前です。報酬を受け取るには、タスクが達成済みリストに含まれている必要があります。

EzCounter

カウンター

カウンターはミッションの進行状況をゲームプレイヤー毎に保持するエンティティです。
カウンターの値は関連付けられたタスクの期間ごとに集計されます。

そのため、1つのカウンターは複数の値を持ちます。
例えば、クエストのクリア回数カウンターであれば、今月のクリア回数、今週のクリア回数、今日のクリア回数、といった具合です。

有効化条件必須デフォルト値の制限説明
namestring
~ 128文字カウンターモデル名
このカウンターインスタンスの基となるカウンターモデルの名前です。スコープやリセットタイミングを定義するカウンターモデル定義にリンクします。
valuesList<EzScopedValue>[]0 ~ 32 items
このカウンターのスコープ別の値のリストです。各エントリは特定のスコープ(リセットタイミングまたは検証アクション条件)のカウンター値と次回リセット時刻を保持します。1つのカウンターが複数のスコープの値を同時に保持します。

EzCounterScopeModel

カウンターリセットタイミングモデル

カウンターのスコープを定義し、カウンター値のリセット方法とタイミングを決定します。スコープはリセットタイミング(毎日、毎週、毎月、一定日数ごと、またはリセットなし)か検証アクション条件のいずれかです。各カウンターは複数のスコープを持ち、異なる期間の値を追跡できます。

有効化条件必須デフォルト値の制限説明
scopeType文字列列挙型
enum {
  “resetTiming”,
  “verifyAction”
}
“resetTiming”スコープの種類
カウンタースコープの定義方法を決定します。“resetTiming” は定期的なリセットスケジュールを使用し、“verifyAction” は検証アクションでカウンター値が適用されるかどうかを判定します。
定義説明
“resetTiming”リセットタイミング
“verifyAction”検証アクション
resetType文字列列挙型
enum {
  “notReset”,
  “daily”,
  “weekly”,
  “monthly”,
  “days”
}
“notReset”リセットタイミング
このスコープのカウンター値がリセットされるタイミングを決定します。リセットしない(恒久累計)、毎日、毎週、毎月、一定日数ごとから選択します。scopeType が “resetTiming” の場合のみ使用されます。
定義説明
“notReset”リセットしない
“daily”毎日
“weekly”毎週
“monthly”毎月
“days”一定日数ごと
resetDayOfMonthint{resetType} == “monthly”
✓※
1 ~ 31リセットをする日にち
カウンター値がリセットされる月の日にちです。指定した値が月の日数を超える場合は、その月の最終日として扱われます。resetType が “monthly” の場合のみ使用されます。

※ resetType が “monthly” であれば 必須
resetDayOfWeek文字列列挙型
enum {
  “sunday”,
  “monday”,
  “tuesday”,
  “wednesday”,
  “thursday”,
  “friday”,
  “saturday”
}
{resetType} == “weekly”
✓※
リセットする曜日
カウンター値がリセットされる曜日です。resetType が “weekly” の場合のみ使用されます。
定義説明
“sunday”日曜日
“monday”月曜日
“tuesday”火曜日
“wednesday”水曜日
“thursday”木曜日
“friday”金曜日
“saturday”土曜日

※ resetType が “weekly” であれば 必須
resetHourint{resetType} in [“monthly”, “weekly”, “daily”]
✓※
0 ~ 23リセット時刻
カウンター値がリセットされる時刻(0〜23)です。毎日、毎週、毎月のリセットタイプと組み合わせて使用されます。

※ resetType が “monthly”,“weekly”,“daily"であれば 必須
conditionNamestring{scopeType} == “verifyAction”
✓※
~ 128文字条件名
この検証アクション条件スコープを識別する一意の名前です。カウンター内の対応するスコープ値の検索に使用されます。scopeType が “verifyAction” の場合のみ使用されます。

※ scopeType が “verifyAction” であれば 必須
conditionEzVerifyAction{scopeType} == “verifyAction”
✓※
条件
このスコープのカウンター値が適用されるかどうかを判定する検証アクションです。scopeType が “verifyAction” の場合のみ使用されます。

※ scopeType が “verifyAction” であれば 必須
anchorTimestamplong{resetType} == “days”
✓※
経過日数のカウントをする基準日時
UNIX 時間・ミリ秒

※ resetType が “days” であれば 必須
daysint{resetType} == “days”
✓※
1 ~ 2147483646リセットする日数
基準日時からカウントされるカウンター値のリセット間隔の日数です。resetType が “days” の場合のみ使用されます。

※ resetType が “days” であれば 必須

EzCounterModel

カウンターモデル

カウンターモデルはミッションタスクの達成条件に設定可能なエンティティです。
カウンターの値は複数のミッショングループから参照可能なため、1つのカウンターでウィークリーミッションとデイリーミッションといった複数のミッショングループの達成条件に設定ができます。

有効化条件必須デフォルト値の制限説明
namestring
~ 128文字カウンターモデル名
カウンターモデル固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
metadatastring~ 1024文字メタデータ
メタデータには任意の値を設定できます。
これらの値は GS2 の動作には影響しないため、ゲーム内で利用する情報の保存先として使用できます。
scopesList<EzCounterScopeModel>[]1 ~ 20 itemsカウンターのリセットタイミングリスト
このカウンターのスコープ(リセットタイミングまたは検証アクション条件)を定義します。1つのカウンターに複数のスコープを設定でき、異なる期間の値(例:デイリー、ウィークリー、累計を同時に)を追跡できます。
challengePeriodEventIdstring~ 1024文字カウンターの操作が可能な期間を設定した GS2-Schedule イベント GRN
このカウンターの増減が可能な期間を定義する GS2-Schedule イベントを指定します。未設定の場合、カウンターはいつでも操作できます。

EzMissionGroupModel

ミッショングループモデル

ミッショングループは、カウンターのリセットタイミングでタスクをグルーピングするエンティティです。
たとえば、デイリーミッションで1つのグループ、ウィークリーミッションで1つのグループとなります。

有効化条件必須デフォルト値の制限説明
namestring
~ 128文字ミッショングループモデル名
ミッショングループモデル固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
metadatastring~ 1024文字メタデータ
メタデータには任意の値を設定できます。
これらの値は GS2 の動作には影響しないため、ゲーム内で利用する情報の保存先として使用できます。
tasksList<EzMissionTaskModel>[]0 ~ 1000 itemsミッションタスクリスト
このグループに属するミッションタスクです。各タスクは達成条件(カウンターの閾値または検証アクション)と達成時に付与される報酬を定義します。
resetType文字列列挙型
enum {
  “notReset”,
  “daily”,
  “weekly”,
  “monthly”,
  “days”
}
“notReset”リセットタイミング
ミッショングループの達成状況がリセットされるタイミングを決定します。リセットしない(恒久)、毎日、毎週、毎月、基準日時から一定日数ごとから選択します。
定義説明
“notReset”リセットしない
“daily”毎日
“weekly”毎週
“monthly”毎月
“days”一定日数ごと
resetDayOfMonthint{resetType} == “monthly”
✓※
1 ~ 31リセットをする日にち
ミッショングループがリセットされる月の日にちです。指定した値が月の日数を超える場合は、その月の最終日として扱われます。resetType が “monthly” の場合のみ使用されます。

※ resetType が “monthly” であれば 必須
resetDayOfWeek文字列列挙型
enum {
  “sunday”,
  “monday”,
  “tuesday”,
  “wednesday”,
  “thursday”,
  “friday”,
  “saturday”
}
{resetType} == “weekly”
✓※
リセットする曜日
ミッショングループがリセットされる曜日です。resetType が “weekly” の場合のみ使用されます。
定義説明
“sunday”日曜日
“monday”月曜日
“tuesday”火曜日
“wednesday”水曜日
“thursday”木曜日
“friday”金曜日
“saturday”土曜日

※ resetType が “weekly” であれば 必須
resetHourint{resetType} in [“monthly”, “weekly”, “daily”]
✓※
0 ~ 23リセット時刻
ミッショングループがリセットされる時刻(0〜23)です。毎日、毎週、毎月のリセットタイプと組み合わせて使用されます。

※ resetType が “monthly”,“weekly”,“daily"であれば 必須
completeNotificationNamespaceIdstring~ 1024文字ミッションのタスクを達成したときのプッシュ通知
このグループ内のミッションタスクが達成された際にプッシュ通知を配信するために使用される GS2-Gateway のネームスペースGRNです。ゲームクライアントにリアルタイムで通知できます。

EzMissionTaskModel

ミッションタスクモデル

ミッションタスクは関連付けたカウンターの値が一定を超えたら報酬が貰える条件を定義するエンティティです。

有効化条件必須デフォルト値の制限説明
namestring
~ 128文字ミッションタスクモデル名
ミッションタスクモデル固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
metadatastring~ 1024文字メタデータ
メタデータには任意の値を設定できます。
これらの値は GS2 の動作には影響しないため、ゲーム内で利用する情報の保存先として使用できます。
verifyCompleteType文字列列挙型
enum {
  “counter”,
  “verifyActions”
}
“counter”達成条件種別
ミッションタスクの達成判定方法を指定します。“counter” は関連するカウンターのスコープ値が目標閾値に達したかを確認します。“verifyActions” は検証アクションを使用して達成条件を確認します。
定義説明
“counter”カウンター
“verifyActions”検証アクション
targetCounterEzTargetCounterModel{verifyCompleteType} == “counter”
✓※
目標カウンター
ミッションタスクの達成判定に使用されるカウンター、スコープ、目標値を定義します。カウンターのスコープ値が指定された目標値に達するか超えた場合、タスクが達成されたとみなされます。

※ verifyCompleteType が “counter” であれば 必須
verifyCompleteConsumeActionsList<EzVerifyAction>{verifyCompleteType} == “verifyActions”
[]0 ~ 10 itemsタスク達成判定に使用する検証アクション
ミッションタスクの達成判定に使用される検証アクションのリストです。すべての検証アクションが成功した場合にタスクが達成とみなされます。verifyCompleteType が “verifyActions” の場合のみ使用されます。

※ verifyCompleteType が “verifyActions” であれば 有効
completeAcquireActionsList<EzAcquireAction>[]0 ~ 100 itemsミッション達成時の報酬
プレイヤーがミッション達成報酬を受け取る際に実行される入手アクションのリストです。
challengePeriodEventIdstring~ 1024文字報酬が受け取り可能な期間を設定した GS2-Schedule イベント GRN
ミッションタスクの報酬を受け取ることができる期間を定義する GS2-Schedule イベントを指定します。未設定の場合、達成後いつでも報酬を受け取ることができます。
premiseMissionTaskNamestring~ 128文字このタスクに挑戦するために達成しておく必要のあるタスクの名前
このタスクの報酬を受け取る前に達成しておく必要がある、同じグループ内の前提ミッションタスクを指定します。段階的なミッションチェーンの作成に使用します。

EzTargetCounterModel

目標カウンター

ミッションの達成目標となるカウンターの情報

有効化条件必須デフォルト値の制限説明
counterNamestring
~ 128文字カウンターモデル名
カウンターモデル固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
scopeType文字列列挙型
enum {
  “resetTiming”,
  “verifyAction”
}
“resetTiming”スコープの種類
ミッション達成判定に使用するカウンタースコープの種類を指定します。“resetTiming” は特定のリセット期間のカウンター値を評価し、“verifyAction” は名前付き条件の値を評価します。
定義説明
“resetTiming”リセットタイミング
“verifyAction”検証アクション
resetType文字列列挙型
enum {
  “notReset”,
  “daily”,
  “weekly”,
  “monthly”,
  “days”
}
{scopeType} == “resetTiming”
目標リセットタイミング
目標値と比較するカウンターのリセットタイミングスコープを指定します。例えば “daily” を選択すると、デイリーのカウンター値を確認します。省略した場合、ミッショングループのリセットタイミングが使用されます。
定義説明
“notReset”リセットしない
“daily”毎日
“weekly”毎週
“monthly”毎月
“days”一定日数ごと

※ scopeType が “resetTiming” であれば 有効
conditionNamestring{scopeType} == “verifyAction”
✓※
~ 128文字条件名
目標値と比較する検証アクション条件スコープの名前です。カウンターモデルのスコープで定義された conditionName と一致する必要があります。scopeType が “verifyAction” の場合のみ使用されます。

※ scopeType が “verifyAction” であれば 必須
valuelong
0 ~ 9223372036854775805目標値
ミッションタスクが達成とみなされるために、カウンターのスコープ値が達するか超える必要がある閾値です。

EzConfig

コンフィグ設定

トランザクションの変数に適用する設定値

有効化条件必須デフォルト値の制限説明
keystring
~ 64文字名前
valuestring~ 51200文字

EzAcquireAction

入手アクション

有効化条件必須デフォルト値の制限説明
action文字列列挙型
enum {
}
入手アクションで実行するアクションの種類
requeststring
~ 524288文字アクション実行時に使用されるリクエストのJSON文字列

EzConsumeAction

消費アクション

有効化条件必須デフォルト値の制限説明
action文字列列挙型
enum {
}
消費アクションで実行するアクションの種類
requeststring
~ 524288文字アクション実行時に使用されるリクエストのJSON文字列

EzVerifyAction

検証アクション

操作の実行前に条件を検証するアクションを定義します。
取り逃がしボーナスの救済で、救済を許可する前に前提条件(ユーザーの資格、リソースの利用可能性など)を確認するために使用されます。
action フィールドは検証アクションの種類を指定し、request フィールドには対応するリクエストパラメータが含まれます。

有効化条件必須デフォルト値の制限説明
action文字列列挙型
enum {
}
検証アクションで実行するアクションの種類
requeststring
~ 524288文字アクション実行時に使用されるリクエストのJSON文字列

EzScopedValue

スコープ値

特定のスコープ内のカウンター値を表します。各スコープ値は特定のリセットタイミング(例:毎日、毎週、毎月)または検証アクション条件の累積カウントを保持します。リセットタイミングが到来すると値はゼロにリセットされます。カウンター値には上限があり、増加しても最大値を超えることはありません。

有効化条件必須デフォルト値の制限説明
scopeType文字列列挙型
enum {
  “resetTiming”,
  “verifyAction”
}
“resetTiming”スコープの種類
このスコープ値がリセットタイミングスケジュールに基づくものか、検証アクション条件に基づくものかを示します。
定義説明
“resetTiming”リセットタイミング
“verifyAction”検証アクション
resetType文字列列挙型
enum {
  “notReset”,
  “daily”,
  “weekly”,
  “monthly”,
  “days”
}
{scopeType} == “resetTiming”
✓※
リセットタイミング
このスコープ値のリセットタイミングです。カウンター値がリセットされるまでの累積期間を決定します。scopeType が “resetTiming” の場合のみ適用されます。
定義説明
“notReset”リセットしない
“daily”毎日
“weekly”毎週
“monthly”毎月
“days”一定日数ごと

※ scopeType が “resetTiming” であれば 必須
conditionNamestring{scopeType} == “verifyAction”
✓※
~ 128文字条件名
このスコープ値が対応する検証アクション条件の名前です。この値がどの条件スコープに属するかを識別するために使用されます。scopeType が “verifyAction” の場合のみ適用されます。

※ scopeType が “verifyAction” であれば 必須
valuelong00 ~ 9223372036854775805カウント
このスコープの累積カウンター値です。カウンターが増加すると増え、減少すると減ります。値は最大値で上限が設けられ、ゼロを下回ることはありません。

EzVerifyActionResult

検証アクションの実行結果

有効化条件必須デフォルト値の制限説明
action文字列列挙型
enum {
}
検証アクションで実行するアクションの種類
verifyRequeststring
~ 524288文字アクション実行時に使用されるリクエストのJSON文字列
statusCodeint0 ~ 999ステータスコード
verifyResultstring~ 1048576文字結果内容

EzConsumeActionResult

消費アクションの実行結果

有効化条件必須デフォルト値の制限説明
action文字列列挙型
enum {
}
消費アクションで実行するアクションの種類
consumeRequeststring
~ 524288文字アクション実行時に使用されるリクエストのJSON文字列
statusCodeint0 ~ 999ステータスコード
consumeResultstring~ 1048576文字結果内容

EzAcquireActionResult

入手アクションの実行結果

有効化条件必須デフォルト値の制限説明
action文字列列挙型
enum {
}
入手アクションで実行するアクションの種類
acquireRequeststring
~ 524288文字アクション実行時に使用されるリクエストのJSON文字列
statusCodeint0 ~ 999ステータスコード
acquireResultstring~ 1048576文字結果内容

EzTransactionResult

トランザクション実行結果

サーバーサイドでのトランザクションの自動実行機能を利用して実行されたトランザクションの実行結果

有効化条件必須デフォルト値の制限説明
transactionIdstring
36 ~ 36文字トランザクションID
verifyResultsList<EzVerifyActionResult>0 ~ 10 items検証アクションの実行結果リスト
consumeResultsList<EzConsumeActionResult>[]0 ~ 10 items消費アクションの実行結果リスト
acquireResultsList<EzAcquireActionResult>[]0 ~ 100 items入手アクションの実行結果リスト

メソッド

batchReceiveRewards

複数の達成ミッションの報酬をまとめて受け取る

同じグループ内の複数のミッションタスクの報酬を1回の呼び出しで受け取ります。
ミッションUIの「一括受取」ボタンに対応します。プレイヤーが各ミッションの「受け取る」を1つずつタップする代わりに、まとめて受け取れます。

指定されたすべてのタスクは達成済みかつ未受領の状態である必要があります。すべてのタスクの報酬が1つのトランザクションにまとめられます。

たとえば「バトルに3回勝利」(報酬: ジェム50個)と「ゴールドを500収集」(報酬: ガチャチケット1枚)を達成している場合、両方のタスク名を指定して呼び出すと、ジェム50個 + ガチャチケット1枚が1回の操作で付与されます。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
missionGroupNamestring
~ 128文字ミッショングループ名
この達成状況レコードが属するミッショングループの名前です。ユーザーごと・ミッショングループごとに1つの達成状況レコードが存在します。
missionTaskNamesList<string>
1 ~ 100 itemsタスク名のリスト
gameSessionGameSession
GameSession
configList<EzConfig>[]0 ~ 32 itemsトランザクションの変数に適用する設定値

Result

説明
transactionIdstring発行されたトランザクションID
stampSheetstringミッションの達成報酬を受領するスタンプシート
stampSheetEncryptionKeyIdstringスタンプシートの署名計算に使用した暗号鍵GRN
autoRunStampSheetboolトランザクションの自動実行が有効か
atomicCommitboolトランザクションをアトミックにコミットするか
transactionstring発行されたトランザクション
transactionResultEzTransactionResultトランザクション実行結果

実装例

    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Complete(
        missionGroupName: "mission-group-0001"
    );
    var result = await domain.BatchReceiveRewardsAsync(
        missionTaskNames: new List<string> {
            "mission-task-0001",
            "mission-task-0002",
        },
        config: null
    );
    // New Experience ではスタンプシートはSDKレベルで自動的に実行されます。
    // エラーが発生すると TransactionException がスローされます。
    // TransactionException::Retry() でリトライが可能です。
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Complete(
        missionGroupName: "mission-group-0001"
    );
    var future = domain.BatchReceiveRewardsFuture(
        missionTaskNames: new List<string> {
            "mission-task-0001",
            "mission-task-0002",
        },
        config: null
    );
    yield return future;
    if (future.Error != null)
    {
        onError.Invoke(future.Error, null);
        yield break;
    }
    // New Experience ではスタンプシートはSDKレベルで自動的に実行されます。
    // エラーが発生すると TransactionException がスローされます。
    // TransactionException::Retry() でリトライが可能です。
    const auto Domain = Gs2->Mission->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->Complete(
        "mission-group-0001" // missionGroupName
    );
    const auto Future = Domain->BatchReceiveRewards(
        []
        {
            auto v = TOptional<TArray<FString>>();
            v->Add("mission-task-0001");
            v->Add("mission-task-0002");
            return v;
        }() // missionTaskNames
        // config
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }

evaluateComplete

ミッション達成状況を再評価する

指定されたグループ内のすべてのカウンター値をミッションタスク条件と照合し、達成状況を更新します。

通常、ミッションの達成判定はカウンターが加算されるたびに自動的に行われます。しかし、カウンターが既に加算された後に既存のグループに新しいミッションタスクを追加した場合、新しいタスクは自動的には評価されません。

そのような状況でこのAPIを呼び出すと、プレイヤーの既存のカウンター値が新しいタスクの条件を満たしているかを遡ってチェックできます。

例: デイリーミッションに「バトルに1回勝利」を新規追加した場合。今日既にバトルに勝利しているプレイヤーは条件を満たすカウンター値を持っていますが、システムはまだそれを認識していません。EvaluateComplete を呼び出すことで、チェックが行われ達成済みとしてマークされます。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
missionGroupNamestring
~ 128文字ミッショングループ名
この達成状況レコードが属するミッショングループの名前です。ユーザーごと・ミッショングループごとに1つの達成状況レコードが存在します。
gameSessionGameSession
GameSession

Result

説明
itemEzComplete再評価後の達成状況

実装例

    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Complete(
        missionGroupName: "mission-group-0001"
    );
    var result = await domain.EvaluateCompleteAsync(
    );
    var item = await result.ModelAsync();
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Complete(
        missionGroupName: "mission-group-0001"
    );
    var future = domain.EvaluateCompleteFuture(
    );
    yield return future;
    if (future.Error != null)
    {
        onError.Invoke(future.Error, null);
        yield break;
    }
    var future2 = future.Result.ModelFuture();
    yield return future2;
    if (future2.Error != null)
    {
        onError.Invoke(future2.Error, null);
        yield break;
    }
    var result = future2.Result;
    const auto Domain = Gs2->Mission->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->Complete(
        "mission-group-0001" // missionGroupName
    );
    const auto Future = Domain->EvaluateComplete(
    );
    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();

getComplete

特定ミッショングループのプレイヤーの達成状況を取得する

指定されたミッショングループ内で、プレイヤーがどのミッションタスクを達成し、どの報酬を受領済みかを取得します。

特定グループのミッション一覧画面を表示する際に使います。たとえば、各デイリーミッションとそのステータスを表示できます:

  • 「バトルに3回勝利」— 達成、報酬受取済み(チェックマーク)
  • 「ゴールドを500収集」— 達成、報酬受取可能!(受け取りボタン)
  • 「アイテムを10回使用」— 進行中: 7/10(プログレスバー)

ListMissionTaskModels や GetMissionGroupModel と組み合わせてタスクの定義(目標、閾値、報酬)を取得し、GetCounter と組み合わせてプログレスバー用の現在のカウンター値を表示できます。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
missionGroupNamestring
~ 128文字ミッショングループ名
この達成状況レコードが属するミッショングループの名前です。ユーザーごと・ミッショングループごとに1つの達成状況レコードが存在します。
gameSessionGameSession
GameSession

Result

説明
itemEzComplete達成状況

実装例

    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Complete(
        missionGroupName: "mission-group-0001"
    );
    var item = await domain.ModelAsync();
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Complete(
        missionGroupName: "mission-group-0001"
    );
    var future = domain.ModelFuture();
    yield return future;
    var item = future.Result;
    const auto Domain = Gs2->Mission->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->Complete(
        "mission-group-0001" // missionGroupName
    );
    const auto Future = Domain->Model();
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }
値の変更イベントハンドリング
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Complete(
        missionGroupName: "mission-group-0001"
    );
    
    // イベントハンドリングを開始
    var callbackId = domain.Subscribe(
        value => {
            // 値が変化した時に呼び出される
            // value には変更後の値が渡ってくる
        }
    );

    // イベントハンドリングを停止
    domain.Unsubscribe(callbackId);
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Complete(
        missionGroupName: "mission-group-0001"
    );
    
    // イベントハンドリングを開始
    var callbackId = domain.Subscribe(
        value => {
            // 値が変化した時に呼び出される
            // value には変更後の値が渡ってくる
        }
    );

    // イベントハンドリングを停止
    domain.Unsubscribe(callbackId);
    const auto Domain = Gs2->Mission->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->Complete(
        "mission-group-0001" // missionGroupName
    );
    
    // イベントハンドリングを開始
    const auto CallbackId = Domain->Subscribe(
        [](TSharedPtr<Gs2::Mission::Model::FComplete> value) {
            // 値が変化した時に呼び出される
            // value には変更後の値が渡ってくる
        }
    );

    // イベントハンドリングを停止
    Domain->Unsubscribe(CallbackId);

listCompletes

全グループのプレイヤーのミッション達成状況を取得する

すべてのミッショングループの達成状況と報酬受領状況を取得します。
各エントリには、プレイヤーがどのミッションタスクを達成し(カウンターの閾値を満たし)、どの報酬を受領済みかが含まれます。

ミッションの概要画面を作る際に使います。たとえば、未受領の報酬があるグループにバッジや通知ドットを表示できます:
「デイリーミッション(報酬2件受取可能!)」「ウィークリーミッション(完了)」「実績(新着1件!)」

ミッションタスクには2つの状態があります:

  • 達成(Completed): カウンターが閾値を満たした状態(例: 「バトルに5回勝利」で5回以上勝利済み)
  • 受領(Received): 達成したタスクの報酬をプレイヤーが受け取った状態

「達成済みだが未受領」のタスクは、プレイヤーが報酬を獲得したがまだ受け取っていないことを意味します。UIではこの状態をハイライト表示すべきです。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
gameSessionGameSession
GameSession
pageTokenstring~ 1024文字データの取得を開始する位置を指定するトークン
limitint301 ~ 1000データの取得件数

Result

説明
itemsList<EzComplete>達成状況のリスト
nextPageTokenstringリストの続きを取得するためのページトークン

実装例

    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    var items = await domain.CompletesAsync(
    ).ToListAsync();
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    var it = domain.Completes(
    );
    List<EzComplete> items = new List<EzComplete>();
    while (it.HasNext())
    {
        yield return it.Next();
        if (it.Error != null)
        {
            onError.Invoke(it.Error, null);
            break;
        }
        if (it.Current != null)
        {
            items.Add(it.Current);
        }
        else
        {
            break;
        }
    }
    const auto Domain = Gs2->Mission->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    );
    const auto It = Domain->Completes(
    );
    TArray<Gs2::UE5::Mission::Model::FEzCompletePtr> Result;
    for (auto Item : *It)
    {
        if (Item.IsError())
        {
            return false;
        }
        Result.Add(Item.Current());
    }
値の変更イベントハンドリング
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    
    // イベントハンドリングを開始
    var callbackId = domain.SubscribeCompletes(
        () => {
            // リストの要素が変化した時に呼び出される
        }
    );

    // イベントハンドリングを停止
    domain.UnsubscribeCompletes(callbackId);
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    
    // イベントハンドリングを開始
    var callbackId = domain.SubscribeCompletes(
        () => {
            // リストの要素が変化した時に呼び出される
        }
    );

    // イベントハンドリングを停止
    domain.UnsubscribeCompletes(callbackId);
    const auto Domain = Gs2->Mission->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    );
    
    // イベントハンドリングを開始
    const auto CallbackId = Domain->SubscribeCompletes(
        []() {
            // リストの要素が変化した時に呼び出される
        }
    );

    // イベントハンドリングを停止
    Domain->UnsubscribeCompletes(CallbackId);

receiveRewards

達成したミッションの報酬を受け取る

プレイヤーが達成したミッションタスクの報酬を受け取ります。
タスクは達成済み(カウンターが閾値を満たしている)かつ未受領の状態である必要があります。

呼び出すと、設定された報酬がプレイヤーに付与されます。たとえばジェム100個、ガチャチケット、ゴールド500のような報酬です。

ミッションUIの「受け取る」「受領」ボタンに対応します。一般的な流れ:

  1. プレイヤーが達成済みで受取可能な報酬のあるミッションを見る
  2. プレイヤーが「受け取る」ボタンをタップ
  3. ゲームが ReceiveRewards を呼び出す
  4. 報酬が付与され、タスクが「受領済み」としてマークされる

タスクがまだ達成されていない場合や、報酬が既に受領済みの場合はエラーが返されます。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
missionGroupNamestring
~ 128文字ミッショングループ名
この達成状況レコードが属するミッショングループの名前です。ユーザーごと・ミッショングループごとに1つの達成状況レコードが存在します。
missionTaskNamestring
~ 128文字タスク名
タスク固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
gameSessionGameSession
GameSession
configList<EzConfig>[]0 ~ 32 itemsトランザクションの変数に適用する設定値

Result

説明
transactionIdstring発行されたトランザクションID
stampSheetstringミッションの達成報酬を受領するスタンプシート
stampSheetEncryptionKeyIdstringスタンプシートの署名計算に使用した暗号鍵GRN
autoRunStampSheetboolトランザクションの自動実行が有効か
atomicCommitboolトランザクションをアトミックにコミットするか
transactionstring発行されたトランザクション
transactionResultEzTransactionResultトランザクション実行結果

実装例

    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Complete(
        missionGroupName: "mission-group-0001"
    );
    var result = await domain.ReceiveRewardsAsync(
        missionTaskName: "mission-task-0001",
        config: null
    );
    // New Experience ではスタンプシートはSDKレベルで自動的に実行されます。
    // エラーが発生すると TransactionException がスローされます。
    // TransactionException::Retry() でリトライが可能です。
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Complete(
        missionGroupName: "mission-group-0001"
    );
    var future = domain.ReceiveRewardsFuture(
        missionTaskName: "mission-task-0001",
        config: null
    );
    yield return future;
    if (future.Error != null)
    {
        onError.Invoke(future.Error, null);
        yield break;
    }
    // New Experience ではスタンプシートはSDKレベルで自動的に実行されます。
    // エラーが発生すると TransactionException がスローされます。
    // TransactionException::Retry() でリトライが可能です。
    const auto Domain = Gs2->Mission->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->Complete(
        "mission-group-0001" // missionGroupName
    );
    const auto Future = Domain->ReceiveRewards(
        "mission-task-0001" // missionTaskName
        // config
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }

deleteCounter

カウンターを完全に削除する

プレイヤーの指定されたカウンターとそのすべてのスコープ値を削除します。
ResetCounter(特定のスコープのみリセット)とは異なり、プレイヤーがまだ一度も進捗を持っていなかったかのように、カウンター全体を削除します。

特定カウンターのプレイヤーの進捗を完全にクリアしたいときに使います。たとえば、ミッションの完全リセット機能を実装する場合などです。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
gameSessionGameSession
GameSession
counterNamestring
~ 128文字カウンターモデル名
このカウンターインスタンスの基となるカウンターモデルの名前です。スコープやリセットタイミングを定義するカウンターモデル定義にリンクします。

Result

説明
itemEzCounter削除したカウンター

実装例

    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Counter(
        counterName: "counter-0001"
    );
    var result = await domain.DeleteCounterAsync(
    );
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Counter(
        counterName: "counter-0001"
    );
    var future = domain.DeleteCounterFuture(
    );
    yield return future;
    if (future.Error != null)
    {
        onError.Invoke(future.Error, null);
        yield break;
    }
    const auto Domain = Gs2->Mission->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->Counter(
        "counter-0001" // counterName
    );
    const auto Future = Domain->DeleteCounter(
    );
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }
    const auto Result = Future->GetTask().Result();

getCounter

特定カウンターのプレイヤーの値を取得する

プレイヤーの特定カウンターの現在値を、すべてのスコープ値を含めて取得します。
たとえば「battle_wins」カウンターの場合、日次=3、週次=12、累計=87 のような値が返されます。

特定の目標に対するミッション進捗を表示する際に使います。たとえばデイリーミッションの横にプログレスバー「今日のバトル勝利数 3/5」のように表示できます。

各スコープ値は異なる期間で追跡されたカウンターを表しており、短期的な進捗と長期的な進捗の両方を表示できます。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
gameSessionGameSession
GameSession
counterNamestring
~ 128文字カウンターモデル名
このカウンターインスタンスの基となるカウンターモデルの名前です。スコープやリセットタイミングを定義するカウンターモデル定義にリンクします。

Result

説明
itemEzCounterカウンター

実装例

    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Counter(
        counterName: "quest_complete"
    );
    var item = await domain.ModelAsync();
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Counter(
        counterName: "quest_complete"
    );
    var future = domain.ModelFuture();
    yield return future;
    var item = future.Result;
    const auto Domain = Gs2->Mission->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->Counter(
        "quest_complete" // counterName
    );
    const auto Future = Domain->Model();
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }
値の変更イベントハンドリング
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Counter(
        counterName: "quest_complete"
    );
    
    // イベントハンドリングを開始
    var callbackId = domain.Subscribe(
        value => {
            // 値が変化した時に呼び出される
            // value には変更後の値が渡ってくる
        }
    );

    // イベントハンドリングを停止
    domain.Unsubscribe(callbackId);
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Counter(
        counterName: "quest_complete"
    );
    
    // イベントハンドリングを開始
    var callbackId = domain.Subscribe(
        value => {
            // 値が変化した時に呼び出される
            // value には変更後の値が渡ってくる
        }
    );

    // イベントハンドリングを停止
    domain.Unsubscribe(callbackId);
    const auto Domain = Gs2->Mission->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->Counter(
        "quest_complete" // counterName
    );
    
    // イベントハンドリングを開始
    const auto CallbackId = Domain->Subscribe(
        [](TSharedPtr<Gs2::Mission::Model::FCounter> value) {
            // 値が変化した時に呼び出される
            // value には変更後の値が渡ってくる
        }
    );

    // イベントハンドリングを停止
    Domain->Unsubscribe(CallbackId);

listCounters

プレイヤーの現在のカウンター値を取得する

プレイヤーのすべてのカウンター値を取得します。
各カウンターは特定のプレイヤーアクション(バトル勝利回数、アイテム収集数、ゴールド獲得量など)を追跡し、各スコープ(日次・週次・月次・累計)ごとの値を持ちます。

プレイヤーのミッション進捗の概要を表示する際に使います。たとえば「今日のバトル勝利数: 3」や「クエスト累計クリア数: 42」のようにステータスやミッション画面で表示できます。

カウンター値はプレイヤーがゲーム内でアクションを行ったとき(他サービスの報酬アクション経由)に自動的に加算され、ミッションタスクの閾値と自動的に照合されます。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
gameSessionGameSession
GameSession
pageTokenstring~ 1024文字データの取得を開始する位置を指定するトークン
limitint301 ~ 1000データの取得件数

Result

説明
itemsList<EzCounter>カウンターのリスト
nextPageTokenstringリストの続きを取得するためのページトークン

実装例

    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    var items = await domain.CountersAsync(
    ).ToListAsync();
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    var it = domain.Counters(
    );
    List<EzCounter> items = new List<EzCounter>();
    while (it.HasNext())
    {
        yield return it.Next();
        if (it.Error != null)
        {
            onError.Invoke(it.Error, null);
            break;
        }
        if (it.Current != null)
        {
            items.Add(it.Current);
        }
        else
        {
            break;
        }
    }
    const auto Domain = Gs2->Mission->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    );
    const auto It = Domain->Counters(
    );
    TArray<Gs2::UE5::Mission::Model::FEzCounterPtr> Result;
    for (auto Item : *It)
    {
        if (Item.IsError())
        {
            return false;
        }
        Result.Add(Item.Current());
    }
値の変更イベントハンドリング
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    
    // イベントハンドリングを開始
    var callbackId = domain.SubscribeCounters(
        () => {
            // リストの要素が変化した時に呼び出される
        }
    );

    // イベントハンドリングを停止
    domain.UnsubscribeCounters(callbackId);
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    );
    
    // イベントハンドリングを開始
    var callbackId = domain.SubscribeCounters(
        () => {
            // リストの要素が変化した時に呼び出される
        }
    );

    // イベントハンドリングを停止
    domain.UnsubscribeCounters(callbackId);
    const auto Domain = Gs2->Mission->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    );
    
    // イベントハンドリングを開始
    const auto CallbackId = Domain->SubscribeCounters(
        []() {
            // リストの要素が変化した時に呼び出される
        }
    );

    // イベントハンドリングを停止
    Domain->UnsubscribeCounters(CallbackId);

resetCounter

カウンターの特定スコープをリセットする

指定されたスコープのカウンター値のみをリセットします。
たとえば、週次や累計の値に影響を与えずに、日次スコープだけをリセットできます。

特定の期間の進捗を手動でリセットしたいときに使います。たとえば、プレイヤーが特殊アイテムを使ってデイリーミッションを再挑戦する際に「デイリーチャレンジ」カウンターをリセットするような場合です。

指定されたスコープタイプに一致するスコープ付き値のみがリセットされ、その他のスコープ付き値は変更されません。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
gameSessionGameSession
GameSession
counterNamestring
~ 128文字カウンターモデル名
このカウンターインスタンスの基となるカウンターモデルの名前です。スコープやリセットタイミングを定義するカウンターモデル定義にリンクします。
scopesList<EzScopedValue>
1 ~ 20 itemsスコープリスト

Result

説明
itemEzCounter削除したカウンター

実装例

    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Counter(
        counterName: "counter-0001"
    );
    var result = await domain.ResetCounterAsync(
        scopes: new List<Gs2.Unity.Gs2Mission.Model.EzScopedValue> {
            new Gs2.Unity.Gs2Mission.Model.EzScopedValue() {
                ResetType = "daily",
            },
            new Gs2.Unity.Gs2Mission.Model.EzScopedValue() {
                ResetType = "weekly",
            },
        }
    );
    var item = await result.ModelAsync();
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).Me(
        gameSession: GameSession
    ).Counter(
        counterName: "counter-0001"
    );
    var future = domain.ResetCounterFuture(
        scopes: new List<Gs2.Unity.Gs2Mission.Model.EzScopedValue> {
            new Gs2.Unity.Gs2Mission.Model.EzScopedValue() {
                ResetType = "daily",
            },
            new Gs2.Unity.Gs2Mission.Model.EzScopedValue() {
                ResetType = "weekly",
            },
        }
    );
    yield return future;
    if (future.Error != null)
    {
        onError.Invoke(future.Error, null);
        yield break;
    }
    var future2 = future.Result.ModelFuture();
    yield return future2;
    if (future2.Error != null)
    {
        onError.Invoke(future2.Error, null);
        yield break;
    }
    var result = future2.Result;
    const auto Domain = Gs2->Mission->Namespace(
        "namespace-0001" // namespaceName
    )->Me(
        GameSession
    )->Counter(
        "counter-0001" // counterName
    );
    const auto Future = Domain->ResetCounter(
        []
        {
            auto v = MakeShared<TArray<TSharedPtr<Gs2::UE5::Mission::Model::FEzScopedValue>>>();
            v->Add(
                MakeShared<Gs2::UE5::Mission::Model::FEzScopedValue>()
                ->WithResetType(TOptional<FString>("daily"))
            );
            v->Add(
                MakeShared<Gs2::UE5::Mission::Model::FEzScopedValue>()
                ->WithResetType(TOptional<FString>("weekly"))
            );
            return v;
        }() // scopes
    );
    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();

getCounterModel

特定のカウンター定義の詳細を取得する

カウンター名を指定して、スコープとリセット条件を含む詳細を取得します。
カウンターが何を追跡し、その値がどのように管理されるかを把握する際に使います。たとえば、ミッションの進捗にどのアクションが寄与するかをプレイヤーに表示する場合などです。

レスポンスにはこのカウンターに定義されたスコープのリストが含まれ、各スコープにはリセットタイプ(日次・週次・月次・なし)とリセットタイミングが設定されています。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
counterNamestring
~ 128文字カウンターモデル名
カウンターモデル固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。

Result

説明
itemEzCounterModelカウンターモデル

実装例

    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).CounterModel(
        counterName: "counter-0001"
    );
    var item = await domain.ModelAsync();
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).CounterModel(
        counterName: "counter-0001"
    );
    var future = domain.ModelFuture();
    yield return future;
    var item = future.Result;
    const auto Domain = Gs2->Mission->Namespace(
        "namespace-0001" // namespaceName
    )->CounterModel(
        "counter-0001" // counterName
    );
    const auto Future = Domain->Model();
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }
値の変更イベントハンドリング
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).CounterModel(
        counterName: "counter-0001"
    );
    
    // イベントハンドリングを開始
    var callbackId = domain.Subscribe(
        value => {
            // 値が変化した時に呼び出される
            // value には変更後の値が渡ってくる
        }
    );

    // イベントハンドリングを停止
    domain.Unsubscribe(callbackId);
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).CounterModel(
        counterName: "counter-0001"
    );
    
    // イベントハンドリングを開始
    var callbackId = domain.Subscribe(
        value => {
            // 値が変化した時に呼び出される
            // value には変更後の値が渡ってくる
        }
    );

    // イベントハンドリングを停止
    domain.Unsubscribe(callbackId);
    const auto Domain = Gs2->Mission->Namespace(
        "namespace-0001" // namespaceName
    )->CounterModel(
        "counter-0001" // counterName
    );
    
    // イベントハンドリングを開始
    const auto CallbackId = Domain->Subscribe(
        [](TSharedPtr<Gs2::Mission::Model::FCounterModel> value) {
            // 値が変化した時に呼び出される
            // value には変更後の値が渡ってくる
        }
    );

    // イベントハンドリングを停止
    Domain->Unsubscribe(CallbackId);

listCounterModels

カウンター定義の一覧を取得する

ネームスペースに定義されているすべてのカウンターモデルを取得します。
カウンターはプレイヤーの行動を追跡し、ミッション達成の判定に使われる値です。たとえば「battle_wins」カウンターはバトル勝利回数を追跡し、「gold_collected」カウンターは獲得ゴールドの合計を追跡します。

各カウンターモデルでは1つ以上の「スコープ」を定義します。スコープはカウンター値がどの期間単位で追跡されるかを決定します:

  • 1つのカウンターで日次・週次・月次・累計の値を同時に追跡できます
  • たとえば「battle_wins」カウンターは、今日の勝利数(日次スコープ)、今週の勝利数(週次スコープ)、累計勝利数(累計スコープ)を持てます
  • 異なるミッションタスクが同じカウンターの異なるスコープを参照できます(例: 「今日バトルに3回勝利」は日次スコープ、「累計100回勝利」は累計スコープを使用)

カウンター値は通常、他のGS2サービスの報酬アクションとして自動的に加算されます(例: クエストクリア時やアイテム購入時)が、ゲームサーバーから手動で加算することもできます。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。

Result

説明
itemsList<EzCounterModel>カウンターモデルのリスト

実装例

    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    );
    var items = await domain.CounterModelsAsync(
    ).ToListAsync();
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    );
    var it = domain.CounterModels(
    );
    List<EzCounterModel> items = new List<EzCounterModel>();
    while (it.HasNext())
    {
        yield return it.Next();
        if (it.Error != null)
        {
            onError.Invoke(it.Error, null);
            break;
        }
        if (it.Current != null)
        {
            items.Add(it.Current);
        }
        else
        {
            break;
        }
    }
    const auto Domain = Gs2->Mission->Namespace(
        "namespace-0001" // namespaceName
    );
    const auto It = Domain->CounterModels(
    );
    TArray<Gs2::UE5::Mission::Model::FEzCounterModelPtr> Result;
    for (auto Item : *It)
    {
        if (Item.IsError())
        {
            return false;
        }
        Result.Add(Item.Current());
    }
値の変更イベントハンドリング
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    );
    
    // イベントハンドリングを開始
    var callbackId = domain.SubscribeCounterModels(
        () => {
            // リストの要素が変化した時に呼び出される
        }
    );

    // イベントハンドリングを停止
    domain.UnsubscribeCounterModels(callbackId);
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    );
    
    // イベントハンドリングを開始
    var callbackId = domain.SubscribeCounterModels(
        () => {
            // リストの要素が変化した時に呼び出される
        }
    );

    // イベントハンドリングを停止
    domain.UnsubscribeCounterModels(callbackId);
    const auto Domain = Gs2->Mission->Namespace(
        "namespace-0001" // namespaceName
    );
    
    // イベントハンドリングを開始
    const auto CallbackId = Domain->SubscribeCounterModels(
        []() {
            // リストの要素が変化した時に呼び出される
        }
    );

    // イベントハンドリングを停止
    Domain->UnsubscribeCounterModels(CallbackId);

getMissionGroupModel

特定のミッショングループの詳細を取得する

ミッショングループ名を指定して、リセットタイプ、リセットタイミング設定、および含まれるミッションタスクのリストを含む詳細を取得します。

特定グループ内のミッション一覧を表示する際に使います。たとえばプレイヤーが「デイリーミッション」タブをタップしたとき、このAPIを呼び出してすべてのデイリーミッションタスクとその詳細を取得します。

レスポンスにはグループに定義されたミッションタスクが含まれ、各タスクには対象カウンターの条件と報酬の設定があります。
GetComplete と組み合わせて、各タスクのプレイヤーの進捗状況と達成状態を表示できます。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
missionGroupNamestring
~ 128文字ミッショングループモデル名
ミッショングループモデル固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。

Result

説明
itemEzMissionGroupModelミッショングループモデル

実装例

    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).MissionGroupModel(
        missionGroupName: "mission-group-0001"
    );
    var item = await domain.ModelAsync();
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).MissionGroupModel(
        missionGroupName: "mission-group-0001"
    );
    var future = domain.ModelFuture();
    yield return future;
    var item = future.Result;
    const auto Domain = Gs2->Mission->Namespace(
        "namespace-0001" // namespaceName
    )->MissionGroupModel(
        "mission-group-0001" // missionGroupName
    );
    const auto Future = Domain->Model();
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }
値の変更イベントハンドリング
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).MissionGroupModel(
        missionGroupName: "mission-group-0001"
    );
    
    // イベントハンドリングを開始
    var callbackId = domain.Subscribe(
        value => {
            // 値が変化した時に呼び出される
            // value には変更後の値が渡ってくる
        }
    );

    // イベントハンドリングを停止
    domain.Unsubscribe(callbackId);
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).MissionGroupModel(
        missionGroupName: "mission-group-0001"
    );
    
    // イベントハンドリングを開始
    var callbackId = domain.Subscribe(
        value => {
            // 値が変化した時に呼び出される
            // value には変更後の値が渡ってくる
        }
    );

    // イベントハンドリングを停止
    domain.Unsubscribe(callbackId);
    const auto Domain = Gs2->Mission->Namespace(
        "namespace-0001" // namespaceName
    )->MissionGroupModel(
        "mission-group-0001" // missionGroupName
    );
    
    // イベントハンドリングを開始
    const auto CallbackId = Domain->Subscribe(
        [](TSharedPtr<Gs2::Mission::Model::FMissionGroupModel> value) {
            // 値が変化した時に呼び出される
            // value には変更後の値が渡ってくる
        }
    );

    // イベントハンドリングを停止
    Domain->Unsubscribe(CallbackId);

listMissionGroupModels

ミッショングループの一覧を取得する

ネームスペースに定義されているすべてのミッショングループを取得します。
ミッショングループは個々のミッションをまとめるカテゴリです。たとえば「デイリーミッション」「ウィークリーミッション」「ストーリーミッション」「実績ミッション」のようなものです。

各グループにはリセットタイプがあり、グループ内のミッションがいつリセットされるかを決定します:

  • notReset: リセットしない(「ステージ10をクリア」「キャラクター100体収集」のような恒久的な実績)
  • daily: 毎日リセット(例: 「今日バトルに3回勝利」)
  • weekly: 毎週リセット(例: 「今週5日ログイン」)
  • monthly: 毎月リセット(例: 「今月ゴールドを10,000消費」)

ミッションのメイン一覧画面を作る際に使います。たとえば「デイリー」「ウィークリー」「実績」のタブを表示するような画面です。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。

Result

説明
itemsList<EzMissionGroupModel>ミッショングループモデルのリスト

実装例

    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    );
    var items = await domain.MissionGroupModelsAsync(
    ).ToListAsync();
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    );
    var it = domain.MissionGroupModels(
    );
    List<EzMissionGroupModel> items = new List<EzMissionGroupModel>();
    while (it.HasNext())
    {
        yield return it.Next();
        if (it.Error != null)
        {
            onError.Invoke(it.Error, null);
            break;
        }
        if (it.Current != null)
        {
            items.Add(it.Current);
        }
        else
        {
            break;
        }
    }
    const auto Domain = Gs2->Mission->Namespace(
        "namespace-0001" // namespaceName
    );
    const auto It = Domain->MissionGroupModels(
    );
    TArray<Gs2::UE5::Mission::Model::FEzMissionGroupModelPtr> Result;
    for (auto Item : *It)
    {
        if (Item.IsError())
        {
            return false;
        }
        Result.Add(Item.Current());
    }
値の変更イベントハンドリング
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    );
    
    // イベントハンドリングを開始
    var callbackId = domain.SubscribeMissionGroupModels(
        () => {
            // リストの要素が変化した時に呼び出される
        }
    );

    // イベントハンドリングを停止
    domain.UnsubscribeMissionGroupModels(callbackId);
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    );
    
    // イベントハンドリングを開始
    var callbackId = domain.SubscribeMissionGroupModels(
        () => {
            // リストの要素が変化した時に呼び出される
        }
    );

    // イベントハンドリングを停止
    domain.UnsubscribeMissionGroupModels(callbackId);
    const auto Domain = Gs2->Mission->Namespace(
        "namespace-0001" // namespaceName
    );
    
    // イベントハンドリングを開始
    const auto CallbackId = Domain->SubscribeMissionGroupModels(
        []() {
            // リストの要素が変化した時に呼び出される
        }
    );

    // イベントハンドリングを停止
    Domain->UnsubscribeMissionGroupModels(CallbackId);

getMissionTaskModel

特定のミッションタスクの詳細を取得する

指定されたミッショングループ内の特定のミッションタスクを名前を指定して取得します。
特定ミッションの詳細画面を表示する際に使います。目標、現在の進捗、報酬、達成済みかどうかを表示できます。

レスポンスには以下が含まれます:

  • 対象カウンター名と閾値(プレイヤーが達成すべき目標)
  • 報酬アクション(受け取り時にプレイヤーが獲得するもの)
  • 前提タスク(先に達成が必要なタスク)がある場合はその情報
  • 達成判定の検証タイプ

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
missionGroupNamestring
~ 128文字ミッショングループモデル名
ミッショングループモデル固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
missionTaskNamestring
~ 128文字ミッションタスクモデル名
ミッションタスクモデル固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。

Result

説明
itemEzMissionTaskModelミッションタスクモデル

実装例

    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).MissionGroupModel(
        missionGroupName: "mission-group-0001"
    ).MissionTaskModel(
        missionTaskName: "mission-task-0001"
    );
    var item = await domain.ModelAsync();
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).MissionGroupModel(
        missionGroupName: "mission-group-0001"
    ).MissionTaskModel(
        missionTaskName: "mission-task-0001"
    );
    var future = domain.ModelFuture();
    yield return future;
    var item = future.Result;
    const auto Domain = Gs2->Mission->Namespace(
        "namespace-0001" // namespaceName
    )->MissionGroupModel(
        "mission-group-0001" // missionGroupName
    )->MissionTaskModel(
        "mission-task-0001" // missionTaskName
    );
    const auto Future = Domain->Model();
    Future->StartSynchronousTask();
    if (Future->GetTask().IsError())
    {
        return false;
    }
値の変更イベントハンドリング
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).MissionGroupModel(
        missionGroupName: "mission-group-0001"
    ).MissionTaskModel(
        missionTaskName: "mission-task-0001"
    );
    
    // イベントハンドリングを開始
    var callbackId = domain.Subscribe(
        value => {
            // 値が変化した時に呼び出される
            // value には変更後の値が渡ってくる
        }
    );

    // イベントハンドリングを停止
    domain.Unsubscribe(callbackId);
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).MissionGroupModel(
        missionGroupName: "mission-group-0001"
    ).MissionTaskModel(
        missionTaskName: "mission-task-0001"
    );
    
    // イベントハンドリングを開始
    var callbackId = domain.Subscribe(
        value => {
            // 値が変化した時に呼び出される
            // value には変更後の値が渡ってくる
        }
    );

    // イベントハンドリングを停止
    domain.Unsubscribe(callbackId);
    const auto Domain = Gs2->Mission->Namespace(
        "namespace-0001" // namespaceName
    )->MissionGroupModel(
        "mission-group-0001" // missionGroupName
    )->MissionTaskModel(
        "mission-task-0001" // missionTaskName
    );
    
    // イベントハンドリングを開始
    const auto CallbackId = Domain->Subscribe(
        [](TSharedPtr<Gs2::Mission::Model::FMissionTaskModel> value) {
            // 値が変化した時に呼び出される
            // value には変更後の値が渡ってくる
        }
    );

    // イベントハンドリングを停止
    Domain->Unsubscribe(CallbackId);

listMissionTaskModels

グループ内のミッションタスクの一覧を取得する

指定されたミッショングループ内のすべての個別ミッションタスクを取得します。
各ミッションタスクは1つのミッション目標を表します。たとえば「バトルに5回勝利」「ゴールドを1,000収集」「ステージ3をクリア」のようなものです。

各タスクでは以下が定義されます:

  • 対象カウンターと閾値(例: カウンター “battle_wins” が 5 以上)
  • プレイヤーが達成報酬を受け取ったときに付与される報酬(例: ジェム100個)
  • 前提タスク(オプション)(例: 「バトルに10回勝利」は「バトルに5回勝利」達成後にのみ表示される)

ミッションシステムは自動的に動作します:

  1. プレイヤーがゲーム内で何かをすると(バトルに勝利、ゴールド収集など)、対応するカウンターが加算される
  2. システムがカウンター値がタスクの閾値を満たしているかチェックする
  3. 満たしていればタスクが「達成」としてマークされる
  4. プレイヤーは ReceiveRewards を使って報酬を受け取れる

グループ内の各タスクの目標と報酬を含むミッション一覧を表示する際に使います。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
missionGroupNamestring
~ 128文字ミッショングループモデル名
ミッショングループモデル固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。

Result

説明
itemsList<EzMissionTaskModel>ミッションタスクモデルのリスト

実装例

    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).MissionGroupModel(
        missionGroupName: "mission-group-0001"
    );
    var items = await domain.MissionTaskModelsAsync(
    ).ToListAsync();
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).MissionGroupModel(
        missionGroupName: "mission-group-0001"
    );
    var it = domain.MissionTaskModels(
    );
    List<EzMissionTaskModel> items = new List<EzMissionTaskModel>();
    while (it.HasNext())
    {
        yield return it.Next();
        if (it.Error != null)
        {
            onError.Invoke(it.Error, null);
            break;
        }
        if (it.Current != null)
        {
            items.Add(it.Current);
        }
        else
        {
            break;
        }
    }
    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());
    }
値の変更イベントハンドリング
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).MissionGroupModel(
        missionGroupName: "mission-group-0001"
    );
    
    // イベントハンドリングを開始
    var callbackId = domain.SubscribeMissionTaskModels(
        () => {
            // リストの要素が変化した時に呼び出される
        }
    );

    // イベントハンドリングを停止
    domain.UnsubscribeMissionTaskModels(callbackId);
    var domain = gs2.Mission.Namespace(
        namespaceName: "namespace-0001"
    ).MissionGroupModel(
        missionGroupName: "mission-group-0001"
    );
    
    // イベントハンドリングを開始
    var callbackId = domain.SubscribeMissionTaskModels(
        () => {
            // リストの要素が変化した時に呼び出される
        }
    );

    // イベントハンドリングを停止
    domain.UnsubscribeMissionTaskModels(callbackId);
    const auto Domain = Gs2->Mission->Namespace(
        "namespace-0001" // namespaceName
    )->MissionGroupModel(
        "mission-group-0001" // missionGroupName
    );
    
    // イベントハンドリングを開始
    const auto CallbackId = Domain->SubscribeMissionTaskModels(
        []() {
            // リストの要素が変化した時に呼び出される
        }
    );

    // イベントハンドリングを停止
    Domain->UnsubscribeMissionTaskModels(CallbackId);

イベントハンドラ

OnCompleteNotification

ミッションのタスクを達成したときに使用するプッシュ通知

名前説明
namespaceNamestringネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
groupNamestringミッショングループ名
この達成状況レコードが属するミッショングループの名前です。ユーザーごと・ミッショングループごとに1つの達成状況レコードが存在します。
userIdstringユーザーID
taskNamestringミッションタスク名

実装例

    gs2.Mission.OnCompleteNotification += notification =>
    {
        var namespaceName = notification.NamespaceName;
        var groupName = notification.GroupName;
        var userId = notification.UserId;
        var taskName = notification.TaskName;
    };
    gs2.Mission.OnCompleteNotification += notification =>
    {
        var namespaceName = notification.NamespaceName;
        var groupName = notification.GroupName;
        var userId = notification.UserId;
        var taskName = notification.TaskName;
    };
    Gs2->Mission->OnCompleteNotification().AddLambda([](const auto Notification)
    {
        const auto NamespaceName = Notification->NamespaceNameValue;
        const auto GroupName = Notification->GroupNameValue;
        const auto UserId = Notification->UserIdValue;
        const auto TaskName = Notification->TaskNameValue;
    });