GS2-Log SDK for Game Engine API リファレンス
ゲームエンジン向け GS2-Log SDK の モデルの仕様 と API のリファレンス
モデル
EzInGameLog
インゲームログ
ゲームクライアントまたはサーバーサイドスクリプトから送信されるカスタムログエントリです。GS2 API呼び出しにより自動生成されるアクセスログとは異なり、インゲームログはゲーム開発者がプレイヤーのアクション、ゲーム状態の変化、ビジネスメトリクスなどのゲーム固有のイベントを記録するために明示的に送信します。
| 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 | |
|---|---|---|---|---|---|---|
| timestamp | long | ✓ | 日時 インゲームログが送信された日時です。 | |||
| userId | string | ~ 128文字 | ユーザーID | |||
| tags | List<EzInGameLogTag> | [] | 0 ~ 20 items | タグ フィルタリングと分類のためにログエントリに付与されたキーバリューペアです。タグによりインゲームログの効率的な検索と集計が可能です(例:イベントタイプ、ステージID、アイテムカテゴリ)。 | ||
| payload | string | ✓ | ~ 10485760文字 | ペイロード JSON形式のカスタムログデータです。プレイヤーのアクション、ゲーム状態、ビジネスメトリクスなど、ゲーム固有の任意の情報を含めることができます。最大10MBまで。 |
EzInGameLogTag
ゲーム内ログのタグ
インゲームログエントリのフィルタリングと分類に使用されるキーバリューペアです。各タグキーは1つのログエントリ内で一意でなければなりません。
| 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 | |
|---|---|---|---|---|---|---|
| key | string | ✓ | ~ 64文字 | タグ名 このタグのキー名です。インゲームログを検索する際のフィルタ条件として使用されます。 | ||
| value | string | ✓ | ~ 128文字 | タグ値 このタグの値です。キーと組み合わせて、特定の条件でのログフィルタリングを可能にします(例:key=“stageId”, value=“stage-001”)。 |
メソッド
sendInGameLog
ゲーム内ログを送信します
Request
| 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 | |
|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 | ||
| tags | List<EzInGameLogTag> | [] | 0 ~ 20 items | タグ フィルタリングと分類のためにログエントリに付与されたキーバリューペアです。タグによりインゲームログの効率的な検索と集計が可能です(例:イベントタイプ、ステージID、アイテムカテゴリ)。 | ||
| payload | string | ✓ | ~ 10485760文字 | ペイロード JSON形式のカスタムログデータです。プレイヤーのアクション、ゲーム状態、ビジネスメトリクスなど、ゲーム固有の任意の情報を含めることができます。最大10MBまで。 | ||
| gameSession | GameSession | GameSession |
Result
| 型 | 説明 | |
|---|---|---|
| item | EzInGameLog | ゲーム内ログ |
実装例
var domain = gs2.Log.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
);
var result = await domain.SendInGameLogAsync(
payload: "{\"category\": \"use-item\", \"count\": 1, \"itemId\": \"item-0001\"}",
tags: new List<Gs2.Unity.Gs2Log.Model.EzInGameLogTag> {
new Gs2.Unity.Gs2Log.Model.EzInGameLogTag() {
Key = "tag1",
Value = "value1",
},
new Gs2.Unity.Gs2Log.Model.EzInGameLogTag() {
Key = "tag2",
Value = "value2",
},
}
);
var item = await result.ModelAsync(); var domain = gs2.Log.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
);
var future = domain.SendInGameLogFuture(
payload: "{\"category\": \"use-item\", \"count\": 1, \"itemId\": \"item-0001\"}",
tags: new List<Gs2.Unity.Gs2Log.Model.EzInGameLogTag> {
new Gs2.Unity.Gs2Log.Model.EzInGameLogTag() {
Key = "tag1",
Value = "value1",
},
new Gs2.Unity.Gs2Log.Model.EzInGameLogTag() {
Key = "tag2",
Value = "value2",
},
}
);
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->Log->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
);
const auto Future = Domain->SendInGameLog(
"{\"category\": \"use-item\", \"count\": 1, \"itemId\": \"item-0001\"}", // payload
[]
{
auto v = MakeShared<TArray<TSharedPtr<Gs2::UE5::Log::Model::FEzInGameLogTag>>>();
v->Add(
MakeShared<Gs2::UE5::Log::Model::FEzInGameLogTag>()
->WithKey(TOptional<FString>("tag1"))
->WithValue(TOptional<FString>("value1"))
);
v->Add(
MakeShared<Gs2::UE5::Log::Model::FEzInGameLogTag>()
->WithKey(TOptional<FString>("tag2"))
->WithValue(TOptional<FString>("value2"))
);
return v;
}() // tags
);
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();