イベントを送信する
注釈:本資料はAI技術を用いて翻訳されています。
概要
ゲームテレメトリーサービスを使用すると、イベントを送信することでゲーム内のプレイヤーのアクションを追跡および記録できます。このイベントはゲームのストリーミングパイプラインに追跡されます。これらのアクションを追跡するには、プレイヤーセッションが必要です。そのため、この機能を使用する前に、プレイヤーがゲーム内でアカウントを作成できるようにする必要があります。
イベント送信前の準備
デフォルトでは、テレメトリーイベントは設定された時間が経過した後、バッチとしてゲームのストリーミングパイプラインに送信されます。この時間は、テレメトリーイベントを送信する前に設定する必要があります。即座に送信する必要があるイベントは、即時イベントリストに追加する必要があります。以下は、テレメトリーイベントを設定する方法の例です。
- Unreal
- Unity
TArray < FString > ImmediateEventList = {
"ITEM_SOURCE",
"ITEM_SINK",
"SPECIALISED_ABILITY"
};
FTimespan Interval = FTimespan::FromSeconds(30);
// set for game client
auto GameApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();
auto GameTelemetryApi = ApiClient->GetGameTelemetryApi().Pin();
GameTelemetryApi->SetImmediateEventList(ImmediateEventList);
GameTelemetryApi->SetBatchFrequency(Interval);
// set for game server
auto ServerApiClient = AccelByteOnlineSubsystemPtr->GetServerApiClient();
ServerApiClient->ServerGameTelemetry.SetImmediateEventList(ImmediateEventList);
ServerApiClient->ServerGameTelemetry.SetBatchFrequency(Interval);
List<string> eventList = new List<string>();
eventList.Add("ITEM_SOURCE");
eventList.Add("SPECIALISED_ABILITY");
System.TimeSpan interval = System.TimeSpan.FromSeconds(30.0f);
// For Game Client
AccelByte.Core.AccelByteSDK.GetClientRegistry().GetApi().GetGameTelemetry().SetImmediateEventList(eventList);
AccelByte.Core.AccelByteSDK.GetClientRegistry().GetApi().GetGameTelemetry().SetBatchFrequency(interval);
// For Game Server
AccelByte.Core.AccelByteSDK.GetServerRegistry().GetApi().GetGameTelemetry().SetImmediateEventList(eventList);
AccelByte.Core.AccelByteSDK.GetServerRegistry().GetApi().GetGameTelemetry().SetBatchFrequency(interval);
クライアントSDKを使用したイベント送信
以下の関数シグネチャを使用してイベントを送信することもできます。返されたデータはデータウェアハウスに表示され、そこで視覚化をカスタマイズできます。
- Unreal
- Unity
FJsonObject Payload;
Payload.SetStringField("someString", "someString");
Payload.SetNumberField("someInt", i);
Payload.SetBoolField("someBool", true);
FAccelByteModelsTelemetryBody TelemetryBody;
TelemetryBody.EventName = "ExampleEvent";
TelemetryBody.EventNamespace = "GameNamespace";
TelemetryBody.Payload = MakeShared < FJsonObject > (Payload);
bool bTelemetryEventSent = false;
auto GameApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();
auto GameTelemetryApi = ApiClient->GetGameTelemetryApi().Pin();
GameTelemetryApi->Send(
TelemetryBody,
FVoidHandler::CreateLambda([ & ]() {
UE_LOG(LogTemp, Log, TEXT(" Success"));
}),
FErrorHandler::CreateLambda([](int32 ErrorCode,
const FString & ErrorMessage) {
UE_LOG(LogTemp, Fatal, TEXT(" Error. Code: %d, Reason: %s"), ErrorCode, * ErrorMessage);
})
);
var telemetryBody = new AccelByte.Models.TelemetryBody
{
EventName = "SomeEventName",
EventNamespace = "SomeEventNamespace",
Payload = new { someString = "", someInt = 20, someBool = false }
};
// For client
AccelByteSDK.GetClientRegistry().GetApi().GetGameTelemetry().Send(telemetryBody, result =>
{
if (result.IsError)
{
// Do something if Send Event has an error
Debug.Log($"Error Send, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
return;
}
// Do something if Send Event has been successful
});
// For server
AccelByteSDK.GetServerRegistry().GetApi().GetGameTelemetry().Send(telemetryBody, result =>
{
if (result.IsError)
{
// Do something if Send Event has an error
Debug.Log($"Error Send, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
return;
}
// Do something if Send Event has been successful
});
バッチ間隔を待たずにバッチ内のイベントを即座に送信するには、SendTelemetryBatchを使用します。
// For client
AccelByteSDK.GetClientRegistry().GetApi().GetGameTelemetry().SendTelemetryBatch(result =>
{
if (result.IsError)
{
// Do something if Send Event has an error
Debug.Log($"Error Send, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
return;
}
// Do something if Send Event has been successful
});
// For server
AccelByteSDK.GetServerRegistry().GetApi().GetGameTelemetry().SendTelemetryBatch(result =>
{
if (result.IsError)
{
// Do something if Send Event has an error
Debug.Log($"Error Send, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
return;
}
// Do something if Send Event has been successful
});
Extend SDKを使用したイベント送信
以下の関数シグネチャを使用してイベントを送信することもできます。返されたデータはデータウェアハウスに表示され、そこで視覚化をカスタマイズできます。
- C# Extend SDK
- Go Extend SDK
- Java Extend SDK
- Python Extend SDK
sdk.Gametelemetry.GametelemetryOperations.ProtectedSaveEventsGameTelemetryV1ProtectedEventsPostOp
.Execute(new List<TelemetryBody>()
{
new TelemetryBody()
{
EventName = "SomeEventName",
EventNamespace = "SomeEventNamespace",
Payload = new Dictionary<string, object>()
{
{ "someString", "" },
{ "someInt", 20 },
{ "someBool", false }
}
}
});
gametelemetryOperationsService := &gametelemetry.GametelemetryOperationsService{
Client: factory.NewGametelemetryClient(&repository.ConfigRepositoryImpl{}),
TokenRepository: &repository.TokenRepositoryImpl{},
}
eventName := "SomeEventName"
eventNamespace := "SomeEventNamespace"
item := gametelemetryclientmodels.TelemetryBody {
EventName: &eventName,
EventNamespace: &eventNamespace,
}
body := []*gametelemetryclientmodels.TelemetryBody {
&item,
}
input := &gametelemetry_operations.ProtectedSaveEventsGameTelemetryV1ProtectedEventsPostParams{
Body: body
}
err := gametelemetryOperationsService.ProtectedSaveEventsGameTelemetryV1ProtectedEventsPostShort(input)
GametelemetryOperations gametelemetryOperationsWrapper = new GametelemetryOperations(sdk);
String additionalKey = "Your additional key";
String userId = "<user-id>";
List<BulkStatOperationResult> response;
try {
List<TelemetryBody> reqBody = List.of(
TelemetryBody.builder()
.eventName("SomeEventName")
.eventNamespace("SomeEventNamespace")
.payload(
Map.of(
"someString", "",
"someInt", 20,
"someBool", false
)).build()
);
gametelemetryOperationsWrapper.protectedSaveEventsGameTelemetryV1ProtectedEventsPost(ProtectedSaveEventsGameTelemetryV1ProtectedEventsPost.builder()
.body(reqBody)
.build());
} catch (Exception e) {
// Do something when failed
return;
}
import accelbyte_py_sdk.api.gametelemetry as gametelemetry_service
import accelbyte_py_sdk.api.gametelemetry.models as gametelemetry_models
result, error = gametelemetry_service.protected_save_events_game_telemetry_v1_protected_events_post(
body=[
gametelemetry_models.TelemetryBody()
.with_event_name("ExampleEvent")
.with_event_namespace("GameNamespace")
.with_payload(
{
"someString": "someString",
"someInt": 1,
"someBool": True,
}
)
],
namespace=namespace, # optional, gets the value from the global instance if unspecified
sdk=sdk, # optional, gets the global instance if unspecified
)
if error:
exit(error)
APIを使用したイベント送信
Protected Save Eventsエンドポイント:POST - /game-telemetry/v1/protected/eventsを使用します。イベントメッセージのサイズは1MBに制限されています。
リクエストボディに入力します。
- EventNamespaceにゲームネームスペースを入力します。
- EventNameにイベントの名前を入力します。例:「player_killed」または「mission_accomplished」。
- Payloadにイベントの任意のJSONを入力します。
以下は、さまざまなユースケースのペイロードの例です。
プレイヤーのログインとログアウトを追跡する場合は、リクエストボディの以下のリファレンスを使用できます。
Login:
{
"EventName" : "player_logged_in",
"EventNamespace" : "abshooter", // ゲームネームスペース
"Payload": {
"GameSessionId" : "generated after the game client is executed",
"UserId" : "could be obtained from player's credential information",
"LoginSessionId" : "generated after the player has been logged in",
"LoginType" : "[USERNAME, LAUNCHER, STEAM, etc..]",
"GameVersion" : "our game release version",
"SDKVersion" : "version of AccelByte SDK in the game's project",
"DSTargetVersion" : "version of dedicated server image",
"Platform" : "[WINDOWS, LINUX, etc..]"
}
}
Logout:
{
"EventName" : "player_logged_out",
"EventNamespace" : "abshooter", // ゲームネームスペース
"Payload": {
"GameSessionId" : "generated after the game client is executed",
"UserId" : "could be obtained from player's credential information",
"LoginSessionId" : "generated after the player has been logged in",
"LoginSessionDuration" : "time unit is in minutes"
}
}
マッチメイキングの開始と終了を追跡する場合は、リクエストボディの以下のリファレンスを使用できます。
Start:
{
"EventName" : "player_match_start",
"EventNamespace" : "abshooter", // ゲームネームスペース
"Payload": {
"GameSessionId" : "generated after the game client is executed",
"UserId" : "could be obtained from player's credential information",
"MatchId" : "obtained from lobby matchmaking service",
"ConnectToLocal" : [true, false], // ローカルDSを使用しているか
"GameMode" : "chosen game mode for current match"
}
}
End:
{
"EventName" : "player_match_end",
"EventNamespace" : "abshooter", // ゲームネームスペース
"Payload": {
"GameSessionId" : "generated after the game client is executed",
"UserId" : "could be obtained from player's credential information",
"MatchId" : "obtained from lobby matchmaking service",
"IsWinner" : [true, false], // プレイヤーが勝利したか
"EndReason" : "cause of end match"
}
}
サーバー上のプレイヤーのアクティブステータスを検出する場合は、リクエストボディの以下のリファレンスを使用できます。
{
"EventName" : "player_heartbeat",
"EventNamespace" : "abshooter", // ゲームネームスペース
"Payload": {
"GameSessionId" : "generated after the game client is executed",
"UserId" : "could be obtained from player's credential information",
"IsServer" : [true, false] // サーバー内にいるか
}
}
イベントタイムスタンプは、ゲームテレメトリーによってISO 8601形式(例:2021-01-05T05:04:08.775Z)で自動的に生成されます。
イベントIDは、ゲームテレメトリーによって自動的に生成されます。リクエストが成功すると、イベントは追跡のために指定されたストリーミングパイプラインに送信されます。
ゲームテレメトリーキャッシュ
デフォルトでは、SDKはゲームの終了やクラッシュに備えてイベントをファイルにキャッシュします。以下は、この動作を設定する方法の例です。
- Unreal
- Unity
キャッシュメカニズムは自動的に実行され、デフォルトで有効になっています。これをオフにするには、開発者はEngine.iniで設定する必要があります:
[/Script/AccelByteUe4Sdk.AccelByteSettings]
GameTelemetryCacheEnabled=false
まだ送信されていないテレメトリーをキャッシュします。ゲームがクラッシュした場合、ユーザーがログインした後にキャッシュを取得して再送信します。 開発者はゲーム上で何も設定する必要はありません。

- ゲームテレメトリーイベントキャッシュを有効にする:初期化時にサービスがイベントを自動的にキャッシュするかどうかを設定します。デフォルトはtrueです。
- ゲームテレメトリー起動時の自動送信を有効にする:初期化時にサービスがキャッシュされたイベント(存在する場合)を自動的に取得して送信するかどうかを設定します。デフォルトはtrueです。これをfalseに設定した場合、バックグラウンド処理が少ない期間中に手動でキャッシュを送信する必要があります。
キャッシュされたイベントを手動で取得して送信するには、以下の関数シグネチャを使用できます
Result sendResult = null;
AccelByteSDK.GetClientRegistry().GetApi().GetGameTelemetry().SendCachedTelemetry(result =>
{
if (result.IsError)
{
// Do something if Send Cached Events has an error
Debug.Log($"Error Send, Error Code: {result.Error.Code} Error Message: {result.Error.Message}");
return;
}
// Do something if Send Cached Events has been successful
});