GS2-Datastore SDK for Game Engine API リファレンス
モデル
EzDataObject
データオブジェクト
データオブジェクトはゲームプレイヤーがアップロードしたデータです。
データは世代管理され、30日分の過去のデータも保管されます。
データにはアクセス権限を設定できます。
スコープには3種類あり、
- だれでもアクセスできる
public - 指定したユーザーIDのゲームプレイヤーのみがアクセスできる
protected - 自身のみがアクセスできる
private
があります。
| 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| dataObjectId | string | ※ | ~ 1024文字 | データオブジェクト
GRN ※ サーバーが自動で設定 | ||||||||||
| name | string | ✓ | UUID | ~ 128文字 | データオブジェクトの名前 データオブジェクトを識別する一意な名前です。デフォルトでは UUID 形式で自動生成されます。ネームスペース内でアップロードされたデータの参照・管理に使用されます。 | |||||||||
| userId | string | ✓ | ~ 128文字 | ユーザーID | ||||||||||
| scope | 文字列列挙型 enum { “public”, “protected”, “private” } | “private” | ファイルのアクセス権 このデータオブジェクトにアクセスできるユーザーを制御します。 public は誰でもアクセス可能、protected は allowUserIds に指定されたユーザーIDのみアクセス可能、private はオーナー本人のみアクセス可能です。
| |||||||||||
| allowUserIds | List<string> | {scope} == “protected” | ※ | [] | 0 ~ 100 items | 公開するユーザーIDリスト スコープが protected に設定されている場合に、このデータオブジェクトにアクセスできるユーザーを指定します。このリストに含まれるユーザーIDのユーザーのみが読み取りアクセスを許可されます。※ scope が “protected” であれば 有効 | ||||||||
| status | 文字列列挙型 enum { “ACTIVE”, “UPLOADING”, “DELETED” } | ✓ | 状態 データオブジェクトの現在のライフサイクル状態です。 ACTIVE はデータがアクセス可能であることを示し、UPLOADING は新しいバージョンがアップロード中であることを示し、DELETED は削除済みであることを示します(実際の削除は30日後に行われます)。
| |||||||||||
| generation | string | ~ 128文字 | データの世代 アップロードされたデータの現在のバージョンを表す識別子です。データが再アップロードされるたびに新しい世代IDが割り当てられます。 | |||||||||||
| createdAt | long | ※ | 現在時刻 | 作成日時 UNIX 時間・ミリ秒 ※ サーバーが自動で設定 | ||||||||||
| updatedAt | long | ※ | 現在時刻 | 最終更新日時 UNIX 時間・ミリ秒 ※ サーバーが自動で設定 |
EzDataObjectHistory
データオブジェクト履歴
データオブジェクトの更新履歴が確認できます。
データオブジェクトが再アップロードされるたびに、世代IDとファイルサイズを含む履歴レコードが作成されます。履歴データは30日間保持され、以前のバージョンへのロールバックや監査が可能です。
| 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 | |
|---|---|---|---|---|---|---|
| dataObjectHistoryId | string | ※ | ~ 1024文字 | データオブジェクト履歴
GRN ※ サーバーが自動で設定 | ||
| generation | string | ✓ | ~ 128文字 | 世代ID アップロード時点のデータオブジェクトの特定バージョンを示す一意な識別子です。DataObject の generation フィールドに対応し、PrepareDownloadByGeneration でこの特定バージョンをダウンロードする際に使用できます。 | ||
| contentLength | long | ✓ | 0 ~ 10485760 | データサイズ この世代のアップロードデータのサイズ(バイト単位)です。最大ファイルサイズは 10 MB(10,485,760 バイト)です。 | ||
| createdAt | long | ※ | 現在時刻 | 作成日時 UNIX 時間・ミリ秒 ※ サーバーが自動で設定 |
メソッド
deleteDataObject
アップロードしたファイルを削除する
指定したデータオブジェクトを削除予定としてマークします。実際のファイルは30日後に削除されます。
プレイヤーが不要になったセーブデータやアップロード済みコンテンツを削除するときに使います。
Request
| 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 | |
|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 | ||
| gameSession | GameSession | ✓ | GameSession | |||
| dataObjectName | string | ✓ | UUID | ~ 128文字 | データオブジェクトの名前 データオブジェクトを識別する一意な名前です。デフォルトでは UUID 形式で自動生成されます。ネームスペース内でアップロードされたデータの参照・管理に使用されます。 |
Result
| 型 | 説明 | |
|---|---|---|
| item | EzDataObject | データオブジェクト |
Error
このAPIには特別な例外が定義されています。
GS2-SDK for GameEngine ではゲーム内でハンドリングが必要そうなエラーは一般的な例外から派生した特殊化した例外を用意することでハンドリングしやすくしています。
一般的なエラーの種類や、ハンドリング方法は こちら のドキュメントを参考にしてください。
| 型 | 基底クラス | 説明 |
|---|---|---|
| InvalidStatusException | BadRequestException | DataObject が操作可能な状態ではありません |
実装例
try {
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
var result = await domain.DeleteDataObjectAsync(
);
var item = await result.ModelAsync();
} catch(Gs2.Gs2Datastore.Exception.InvalidStatusException e) {
// DataObject is not in operable state.
} var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
var future = domain.DeleteDataObjectFuture(
);
yield return future;
if (future.Error != null)
{
if (future.Error is Gs2.Gs2Datastore.Exception.InvalidStatusException)
{
// DataObject is not in operable state.
}
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->Datastore->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
)->DataObject(
"dataObject-0001" // dataObjectName
);
const auto Future = Domain->DeleteDataObject(
);
Future->StartSynchronousTask();
if (Future->GetTask().IsError())
{
auto e = Future->GetTask().Error();
if (e->IsChildOf(Gs2::Datastore::Error::FInvalidStatusError::Class))
{
// DataObject is not in operable state.
}
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();doneUpload
ファイルのアップロードを確定する
PrepareUpload または PrepareReUpload で取得した URL へのファイルアップロードが完了したあとに呼び出します。
アップロードを確定し、データオブジェクトをダウンロード可能な状態(ステータス ACTIVE)にします。
この呼び出しを行わないと、データオブジェクトは UPLOADING のままダウンロードできません。
Request
| 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 | |
|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 | ||
| gameSession | GameSession | ✓ | GameSession | |||
| dataObjectName | string | ✓ | UUID | ~ 128文字 | データオブジェクトの名前 データオブジェクトを識別する一意な名前です。デフォルトでは UUID 形式で自動生成されます。ネームスペース内でアップロードされたデータの参照・管理に使用されます。 |
Result
| 型 | 説明 | |
|---|---|---|
| item | EzDataObject | データオブジェクト |
Error
このAPIには特別な例外が定義されています。
GS2-SDK for GameEngine ではゲーム内でハンドリングが必要そうなエラーは一般的な例外から派生した特殊化した例外を用意することでハンドリングしやすくしています。
一般的なエラーの種類や、ハンドリング方法は こちら のドキュメントを参考にしてください。
| 型 | 基底クラス | 説明 |
|---|---|---|
| InvalidStatusException | BadRequestException | DataObject が操作可能な状態ではありません |
| NotUploadedException | BadRequestException | DataObject がアップロードされていません |
実装例
try {
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
var result = await domain.DoneUploadAsync(
);
var item = await result.ModelAsync();
} catch(Gs2.Gs2Datastore.Exception.InvalidStatusException e) {
// DataObject is not in operable state.
} catch(Gs2.Gs2Datastore.Exception.NotUploadedException e) {
// DataObject is not uploaded.
} var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
var future = domain.DoneUploadFuture(
);
yield return future;
if (future.Error != null)
{
if (future.Error is Gs2.Gs2Datastore.Exception.InvalidStatusException)
{
// DataObject is not in operable state.
}
if (future.Error is Gs2.Gs2Datastore.Exception.NotUploadedException)
{
// DataObject is not uploaded.
}
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->Datastore->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
)->DataObject(
"dataObject-0001" // dataObjectName
);
const auto Future = Domain->DoneUpload(
);
Future->StartSynchronousTask();
if (Future->GetTask().IsError())
{
auto e = Future->GetTask().Error();
if (e->IsChildOf(Gs2::Datastore::Error::FInvalidStatusError::Class))
{
// DataObject is not in operable state.
}
if (e->IsChildOf(Gs2::Datastore::Error::FNotUploadedError::Class))
{
// DataObject is not uploaded.
}
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();listMyDataObjects
プレイヤーがアップロードしたデータの一覧を取得する
プレイヤーがアップロードしたデータオブジェクト(ファイル)の一覧を取得します。
ステータスでフィルタリングできます: ACTIVE(ダウンロード可能)、UPLOADING(アップロード中)、DELETED(削除予定)。
セーブデータ一覧画面の表示や、プレイヤーが保存しているファイルの確認に使います。
Request
| 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 | ||||||||||
| gameSession | GameSession | ✓ | GameSession | |||||||||||
| status | 状態
| |||||||||||||
| pageToken | string | ~ 1024文字 | データの取得を開始する位置を指定するトークン | |||||||||||
| limit | int | 30 | 1 ~ 1000 | データの取得件数 |
Result
| 型 | 説明 | |
|---|---|---|
| items | List<EzDataObject> | データオブジェクトのリスト |
| nextPageToken | string | リストの続きを取得するためのページトークン |
実装例
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
);
var items = await domain.DataObjectsAsync(
status: "ACTIVE"
).ToListAsync(); var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
);
var it = domain.DataObjects(
status: "ACTIVE"
);
List<EzDataObject> items = new List<EzDataObject>();
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->Datastore->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
);
const auto It = Domain->DataObjects(
"ACTIVE" // status
);
TArray<Gs2::UE5::Datastore::Model::FEzDataObjectPtr> Result;
for (auto Item : *It)
{
if (Item.IsError())
{
return false;
}
Result.Add(Item.Current());
}値の変更イベントハンドリング
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
);
// イベントハンドリングを開始
var callbackId = domain.SubscribeDataObjects(
() => {
// リストの要素が変化した時に呼び出される
}
);
// イベントハンドリングを停止
domain.UnsubscribeDataObjects(callbackId); var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
);
// イベントハンドリングを開始
var callbackId = domain.SubscribeDataObjects(
() => {
// リストの要素が変化した時に呼び出される
}
);
// イベントハンドリングを停止
domain.UnsubscribeDataObjects(callbackId); const auto Domain = Gs2->Datastore->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
);
// イベントハンドリングを開始
const auto CallbackId = Domain->SubscribeDataObjects(
[]() {
// リストの要素が変化した時に呼び出される
}
);
// イベントハンドリングを停止
Domain->UnsubscribeDataObjects(CallbackId);Warning
このイベントはSDKがもつローカルキャッシュの値が変更された時に呼び出されます。
ローカルキャッシュは SDK が持つ API の実行、または GS2-Gateway の通知を有効にした GS2-Distributor 経由でのスタンプシートの実行、または GS2-Gateway の通知を有効にした GS2-JobQueue の実行によって変化したもののみが対象となります。
そのため、これらの方法以外で値が変更されてもコールバックは呼び出されません。
prepareDownload
ファイルのダウンロード URL を取得する(データオブジェクトIDで指定)
指定したデータオブジェクトの一時的なダウンロード URL を返します。
データオブジェクトは ID(GRN)で指定します。アクセス制御が適用され、ファイルのオーナーまたは許可リストに登録されたユーザーのみダウンロードできます。
返された URL に HTTP GET でアクセスしてファイルをダウンロードします。
Request
| 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 | |
|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 | ||
| dataObjectId | string | ✓ | ~ 1024文字 | データオブジェクト GRN | ||
| gameSession | GameSession | ✓ | GameSession |
Result
| 型 | 説明 | |
|---|---|---|
| item | EzDataObject | データオブジェクト |
| fileUrl | string | ファイルをダウンロードするためのURL |
| contentLength | long | ファイルの容量 |
実装例
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
);
var result = await domain.PrepareDownloadAsync(
dataObjectId: "grn:gs2:ap-northeast-1:YourOwnerId:datastore:namespace-0001:user:user-0001:data:dataObject-0001"
);
var item = await result.ModelAsync();
var fileUrl = result.FileUrl;
var contentLength = result.ContentLength; var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
);
var future = domain.PrepareDownloadFuture(
dataObjectId: "grn:gs2:ap-northeast-1:YourOwnerId:datastore:namespace-0001:user:user-0001:data:dataObject-0001"
);
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;
var fileUrl = future.Result.FileUrl;
var contentLength = future.Result.ContentLength; const auto Domain = Gs2->Datastore->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
);
const auto Future = Domain->PrepareDownload(
"grn:gs2:ap-northeast-1:YourOwnerId:datastore:namespace-0001:user:user-0001:data:dataObject-0001" // dataObjectId
);
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();
const auto FileUrl = Result->FileUrl;
const auto ContentLength = Result->ContentLength;prepareDownloadByUserIdAndDataObjectName
他プレイヤーのファイルのダウンロード URL を取得する(ユーザーIDと名前で指定)
他のプレイヤーのデータを、ユーザーIDとデータオブジェクト名を指定してダウンロードします。
アクセス制御が適用されます。データが public であるか、リクエストしたプレイヤーがオーナーの許可リストに含まれている必要があります。
カスタムレベルやリプレイデータなど、プレイヤー同士でデータを共有する場合に使います。
Request
| 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 | |
|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 | ||
| userId | string | ✓ | ~ 128文字 | ユーザーID | ||
| dataObjectName | string | ✓ | UUID | ~ 128文字 | データオブジェクトの名前 データオブジェクトを識別する一意な名前です。デフォルトでは UUID 形式で自動生成されます。ネームスペース内でアップロードされたデータの参照・管理に使用されます。 |
Result
| 型 | 説明 | |
|---|---|---|
| item | EzDataObject | データオブジェクト |
| fileUrl | string | ファイルをダウンロードするためのURL |
| contentLength | long | ファイルの容量 |
実装例
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).User(
userId: "user-0001"
).DataObject(
dataObjectName: "dataObject-0001"
);
var result = await domain.PrepareDownloadByUserIdAndDataObjectNameAsync(
);
var item = await result.ModelAsync();
var fileUrl = result.FileUrl;
var contentLength = result.ContentLength; var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).User(
userId: "user-0001"
).DataObject(
dataObjectName: "dataObject-0001"
);
var future = domain.PrepareDownloadByUserIdAndDataObjectNameFuture(
);
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;
var fileUrl = future.Result.FileUrl;
var contentLength = future.Result.ContentLength; const auto Domain = Gs2->Datastore->Namespace(
"namespace-0001" // namespaceName
)->User(
"user-0001" // userId
)->DataObject(
"dataObject-0001" // dataObjectName
);
const auto Future = Domain->PrepareDownloadByUserIdAndDataObjectName(
);
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();
const auto FileUrl = Result->FileUrl;
const auto ContentLength = Result->ContentLength;prepareDownloadOwnData
プレイヤー自身のファイルのダウンロード URL を取得する(名前で指定)
ID の代わりにデータオブジェクト名を指定して、プレイヤー自身のデータをダウンロードするための便利な方法です。
プレイヤーが自分のセーブデータやアップロード済みコンテンツを読み込むときに使います。
一時的なダウンロード URL とファイルサイズが返されます。
Request
| 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 | |
|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 | ||
| dataObjectName | string | ✓ | UUID | ~ 128文字 | データオブジェクトの名前 データオブジェクトを識別する一意な名前です。デフォルトでは UUID 形式で自動生成されます。ネームスペース内でアップロードされたデータの参照・管理に使用されます。 | |
| gameSession | GameSession | ✓ | GameSession |
Result
| 型 | 説明 | |
|---|---|---|
| item | EzDataObject | データオブジェクト |
| fileUrl | string | ファイルをダウンロードするためのURL |
| contentLength | long | ファイルの容量 |
実装例
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
var result = await domain.PrepareDownloadOwnDataAsync(
);
var item = await result.ModelAsync();
var fileUrl = result.FileUrl;
var contentLength = result.ContentLength; var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
var future = domain.PrepareDownloadOwnDataFuture(
);
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;
var fileUrl = future.Result.FileUrl;
var contentLength = future.Result.ContentLength; const auto Domain = Gs2->Datastore->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
)->DataObject(
"dataObject-0001" // dataObjectName
);
const auto Future = Domain->PrepareDownloadOwnData(
);
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();
const auto FileUrl = Result->FileUrl;
const auto ContentLength = Result->ContentLength;Download
データをダウンロード
Request
| 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 | |
|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 | ||
| gameSession | GameSession | ✓ | GameSession | |||
| dataObjectName | string | ✓ | UUID | ~ 128文字 | データオブジェクトの名前 |
Result
| 型 | 説明 | |
|---|---|---|
| item | byte配列 | バイナリデータ |
実装例
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
);
var result = await domain.DownloadAsync(
dataObjectName: "dataObject-0001"
);</div>
<div class="tab-pane fade"
id="tabs-01-02" role="tabpanel" aria-labelled-by="tabs-01-02-tab" tabindex="1"><div class="highlight"><pre class="chroma"><code class="language-cs" data-lang="cs"> var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
var future = domain.DownloadFuture();
yield return future;
if (future.Error != null)
{
onError.Invoke(future.Error, null);
yield break;
}
var result = future.Result;</code></pre></div>
</div>
<div class="tab-pane fade"
id="tabs-01-03" role="tabpanel" aria-labelled-by="tabs-01-03-tab" tabindex="1"><div class="highlight"><pre class="chroma"><code class="language-cpp" data-lang="cpp"> const auto Domain = Gs2->Datastore->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
)->DataObject(
"dataObject-0001" // dataObjectName
);
const auto Future = Domain->Download();
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();</code></pre></div>
</div>
DownloadByUserIdAndDataObjectName
ユーザIDとデータ名を指定してデータをダウンロード
Request
| 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 | |
|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 | ||
| userId | string | ✓ | ~ 128文字 | ユーザーID | ||
| dataObjectName | string | ✓ | UUID | ~ 128文字 | データオブジェクトの名前 |
Result
| 型 | 説明 | |
|---|---|---|
| item | byte配列 | バイナリデータ |
実装例
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).User(
userId: "user-0001"
).DataObject(
dataObjectName: "dataObject-0001"
);
var result = await domain.DownloadByUserIdAndDataObjectNameAsync(
);</div>
<div class="tab-pane fade"
id="tabs-02-02" role="tabpanel" aria-labelled-by="tabs-02-02-tab" tabindex="2"><div class="highlight"><pre class="chroma"><code class="language-cs" data-lang="cs"> var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).User(
userId: "user-0001"
).DataObject(
dataObjectName: "dataObject-0001"
);
var future = domain.DownloadByUserIdAndDataObjectNameFuture(
);
yield return future;
if (future.Error != null)
{
onError.Invoke(future.Error, null);
yield break;
}
var result = future.Result;</code></pre></div>
</div>
<div class="tab-pane fade"
id="tabs-02-03" role="tabpanel" aria-labelled-by="tabs-02-03-tab" tabindex="2"><div class="highlight"><pre class="chroma"><code class="language-cpp" data-lang="cpp"> const auto Domain = Gs2->Datastore->Namespace(
"namespace-0001" // namespaceName
)->User(
"user-0001" // userId
)->DataObject(
"dataObject-0001" // dataObjectName
);
const auto Future = Domain->DownloadByUserIdAndDataObjectName(
);
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();</code></pre></div>
</div>
DownloadOwn
自分のデータをダウンロード
Request
| 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 | |
|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 | ||
| gameSession | GameSession | ✓ | GameSession | |||
| dataObjectName | string | ✓ | UUID | ~ 128文字 | データオブジェクトの名前 |
Result
| 型 | 説明 | |
|---|---|---|
| item | byte配列 | バイナリデータ |
実装例
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
var result = await domain.DownloadOwnAsync();</div>
<div class="tab-pane fade"
id="tabs-04-02" role="tabpanel" aria-labelled-by="tabs-04-02-tab" tabindex="4"><div class="highlight"><pre class="chroma"><code class="language-cs" data-lang="cs"> var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
var future = domain.DownloadOwnFuture();
yield return future;
if (future.Error != null)
{
onError.Invoke(future.Error, null);
yield break;
}
var result = future.Result;</code></pre></div>
</div>
<div class="tab-pane fade"
id="tabs-04-03" role="tabpanel" aria-labelled-by="tabs-04-03-tab" tabindex="4"><div class="highlight"><pre class="chroma"><code class="language-cpp" data-lang="cpp"> const auto Domain = Gs2->Datastore->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
)->DataObject(
"dataObject-0001" // dataObjectName
);
const auto Future = Domain->DownloadOwn(
);
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();</code></pre></div>
</div>
ReUpload
再アップロード
Request
| 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 | |
|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 | ||
| gameSession | GameSession | ✓ | GameSession | |||
| dataObjectName | string | ✓ | UUID | ~ 128文字 | データオブジェクトの名前 | |
| data | byte配列 | バイナリデータ |
Result
| 型 | 説明 | |
|---|---|---|
| item | EzDataObject | データオブジェクト |
| uploadUrl | string | アップロード処理の実行に使用するURL |
実装例
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
var result = await domain.ReUploadAsync(
data: binary
);
var item = await result.ModelAsync();</div>
<div class="tab-pane fade"
id="tabs-06-02" role="tabpanel" aria-labelled-by="tabs-06-02-tab" tabindex="6"><div class="highlight"><pre class="chroma"><code class="language-cs" data-lang="cs"> var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
var future = domain.ReUploadFuture(
data: binary
);
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;</code></pre></div>
</div>
<div class="tab-pane fade"
id="tabs-06-03" role="tabpanel" aria-labelled-by="tabs-06-03-tab" tabindex="6"><div class="highlight"><pre class="chroma"><code class="language-cpp" data-lang="cpp"> const auto Domain = Gs2->Datastore->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
)->DataObject(
"dataObject-0001" // dataObjectName
);
const auto Future = Domain->ReUpload(
binary // Binary
);
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();</code></pre></div>
</div>
prepareReUpload
既存ファイルの再アップロード(上書き)を準備する
既存のデータオブジェクトの内容を差し替えるための新しいアップロード URL を返します。
以前のファイルは履歴に残るので、世代番号を指定して古いバージョンをダウンロードすることもできます。
返された URL に新しいファイルをアップロードしたあと、DoneUpload を呼んで確定します。
再アップロードの流れ: PrepareReUpload → 返された URL に PUT でファイル送信 → DoneUpload
Request
| 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 | |
|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 | ||
| gameSession | GameSession | ✓ | GameSession | |||
| dataObjectName | string | ✓ | UUID | ~ 128文字 | データオブジェクトの名前 データオブジェクトを識別する一意な名前です。デフォルトでは UUID 形式で自動生成されます。ネームスペース内でアップロードされたデータの参照・管理に使用されます。 | |
| contentType | string | “application/octet-stream” | ~ 256文字 | アップロードするデータの MIME-Type |
Result
| 型 | 説明 | |
|---|---|---|
| item | EzDataObject | データオブジェクト |
| uploadUrl | string | アップロード処理の実行に使用するURL |
実装例
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
var result = await domain.PrepareReUploadAsync(
contentType: "application/octet-stream"
);
var item = await result.ModelAsync();
var uploadUrl = result.UploadUrl; var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
var future = domain.PrepareReUploadFuture(
contentType: "application/octet-stream"
);
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;
var uploadUrl = future.Result.UploadUrl; const auto Domain = Gs2->Datastore->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
)->DataObject(
"dataObject-0001" // dataObjectName
);
const auto Future = Domain->PrepareReUpload(
"application/octet-stream" // contentType
);
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();
const auto UploadUrl = Result->UploadUrl;prepareUpload
新しいファイルのアップロードを準備する
新しいデータオブジェクトを作成し、アップロード用の URL を返します。
この API を呼んだあと、返された URL に HTTP PUT でファイルをアップロードし、DoneUpload を呼んで確定します。
アクセス範囲(public または protected)や、ダウンロードを許可するユーザーを指定できます。updateIfExists を true にすると、同名のファイルが既にある場合はエラーにせず上書き更新します。
アップロードの流れ: PrepareUpload → 返された URL に PUT でファイル送信 → DoneUpload
Request
| 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 | ||||||||||
| gameSession | GameSession | ✓ | GameSession | |||||||||||
| name | string | ~ 128文字 | データオブジェクトの名前 指定しなかった場合、自動的にUUIDが割り当てられます。 | |||||||||||
| scope | “private” | ファイルのアクセス権 このデータオブジェクトにアクセスできるユーザーを制御します。 public は誰でもアクセス可能、protected は allowUserIds に指定されたユーザーIDのみアクセス可能、private はオーナー本人のみアクセス可能です。
| ||||||||||||
| contentType | string | “application/octet-stream” | ~ 256文字 | アップロードするデータの MIME-Type | ||||||||||
| allowUserIds | List<string> | {scope} == “protected” | [] | 0 ~ 100 items | 公開するユーザーIDリスト スコープが protected に設定されている場合に、このデータオブジェクトにアクセスできるユーザーを指定します。このリストに含まれるユーザーIDのユーザーのみが読み取りアクセスを許可されます。※ scope が “protected” であれば有効 | |||||||||
| updateIfExists | bool | false | 既にデータが存在する場合にエラーとするか、データを更新するか |
Result
| 型 | 説明 | |
|---|---|---|
| item | EzDataObject | データオブジェクト |
| uploadUrl | string | アップロード処理の実行に使用するURL |
実装例
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
);
var result = await domain.PrepareUploadAsync(
name: "dataObject-0001",
scope: "public",
contentType: "application/octet-stream",
allowUserIds: null,
updateIfExists: null
);
var item = await result.ModelAsync();
var uploadUrl = result.UploadUrl; var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
);
var future = domain.PrepareUploadFuture(
name: "dataObject-0001",
scope: "public",
contentType: "application/octet-stream",
allowUserIds: null,
updateIfExists: null
);
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;
var uploadUrl = future.Result.UploadUrl; const auto Domain = Gs2->Datastore->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
);
const auto Future = Domain->PrepareUpload(
"dataObject-0001", // name
"public", // scope
"application/octet-stream" // contentType
// allowUserIds
// updateIfExists
);
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();
const auto UploadUrl = Result->UploadUrl;restoreDataObject
データオブジェクトの管理情報を修復する
データオブジェクトのメタデータと実際のファイルの間の不整合を修正します。
記録されているファイルサイズやバージョン番号が実際のファイルと一致しない場合(アップロードが中断された場合など)、メタデータを正しく修正します。
通常は呼び出す必要はなく、アップロード中に問題が発生したときのリカバリ用です。
Request
| 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 | |
|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 | ||
| dataObjectId | string | ✓ | ~ 1024文字 | データオブジェクト GRN |
Result
| 型 | 説明 | |
|---|---|---|
| item | EzDataObject | データオブジェクト |
Error
このAPIには特別な例外が定義されています。
GS2-SDK for GameEngine ではゲーム内でハンドリングが必要そうなエラーは一般的な例外から派生した特殊化した例外を用意することでハンドリングしやすくしています。
一般的なエラーの種類や、ハンドリング方法は こちら のドキュメントを参考にしてください。
| 型 | 基底クラス | 説明 |
|---|---|---|
| InvalidStatusException | BadRequestException | DataObject が操作可能な状態ではありません |
実装例
try {
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
);
var result = await domain.RestoreDataObjectAsync(
dataObjectId: "grn:gs2:ap-northeast-1:YourOwnerId:datastore:namespace-0001:user:user-0001:data:dataObject-0001"
);
var item = await result.ModelAsync();
} catch(Gs2.Gs2Datastore.Exception.InvalidStatusException e) {
// DataObject is not in operable state.
} var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
);
var future = domain.RestoreDataObjectFuture(
dataObjectId: "grn:gs2:ap-northeast-1:YourOwnerId:datastore:namespace-0001:user:user-0001:data:dataObject-0001"
);
yield return future;
if (future.Error != null)
{
if (future.Error is Gs2.Gs2Datastore.Exception.InvalidStatusException)
{
// DataObject is not in operable state.
}
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->Datastore->Namespace(
"namespace-0001" // namespaceName
);
const auto Future = Domain->RestoreDataObject(
"grn:gs2:ap-northeast-1:YourOwnerId:datastore:namespace-0001:user:user-0001:data:dataObject-0001" // dataObjectId
);
Future->StartSynchronousTask();
if (Future->GetTask().IsError())
{
auto e = Future->GetTask().Error();
if (e->IsChildOf(Gs2::Datastore::Error::FInvalidStatusError::Class))
{
// DataObject is not in operable state.
}
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();updateDataObject
データオブジェクトのアクセス設定を変更する
アップロード済みのデータオブジェクトにアクセスできる範囲を変更します。
スコープを public(誰でもダウンロード可能)と protected(指定ユーザーのみダウンロード可能)で切り替えたり、
許可するユーザーIDのリストを更新したりできます。
ファイルの中身は変更されません。ファイルを更新するには PrepareReUpload を使ってください。
Request
| 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 | ||||||||||
| gameSession | GameSession | ✓ | GameSession | |||||||||||
| scope | “private” | ファイルのアクセス権 このデータオブジェクトにアクセスできるユーザーを制御します。 public は誰でもアクセス可能、protected は allowUserIds に指定されたユーザーIDのみアクセス可能、private はオーナー本人のみアクセス可能です。
| ||||||||||||
| allowUserIds | List<string> | {scope} == “protected” | [] | 0 ~ 100 items | 公開するユーザーIDリスト スコープが protected に設定されている場合に、このデータオブジェクトにアクセスできるユーザーを指定します。このリストに含まれるユーザーIDのユーザーのみが読み取りアクセスを許可されます。※ scope が “protected” であれば有効 |
Result
| 型 | 説明 | |
|---|---|---|
| item | EzDataObject | データオブジェクト |
実装例
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
var result = await domain.UpdateDataObjectAsync(
scope: "public",
allowUserIds: null
);
var item = await result.ModelAsync(); var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
var future = domain.UpdateDataObjectFuture(
scope: "public",
allowUserIds: null
);
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->Datastore->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
)->DataObject(
"dataObject-0001" // dataObjectName
);
const auto Future = Domain->UpdateDataObject(
"public" // scope
// allowUserIds
);
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();listDataObjectHistories
データオブジェクトのバージョン履歴を取得する
データオブジェクトの過去のバージョン(世代)の一覧を取得します。
PrepareReUpload でファイルを再アップロードするたびに、以前のバージョンが履歴に保存されます。
各エントリにはファイルサイズと作成日時が含まれるので、いつ何が変わったかを確認できます。
バージョン履歴画面の表示や、プレイヤーが古いセーブデータに戻す機能を実装する際に使います。
Request
| 型 | 有効化条件 | 必須 | デフォルト | 値の制限 | 説明 | |
|---|---|---|---|---|---|---|
| namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。 | ||
| gameSession | GameSession | ✓ | GameSession | |||
| dataObjectName | string | ✓ | UUID | ~ 128文字 | データオブジェクトの名前 データオブジェクトを識別する一意な名前です。デフォルトでは UUID 形式で自動生成されます。ネームスペース内でアップロードされたデータの参照・管理に使用されます。 | |
| pageToken | string | ~ 1024文字 | データの取得を開始する位置を指定するトークン | |||
| limit | int | 30 | 1 ~ 1000 | データの取得件数 |
Result
| 型 | 説明 | |
|---|---|---|
| items | List<EzDataObjectHistory> | データオブジェクト履歴のリスト |
| nextPageToken | string | リストの続きを取得するためのページトークン |
実装例
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
var items = await domain.DataObjectHistoriesAsync(
).ToListAsync(); var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
var it = domain.DataObjectHistories(
);
List<EzDataObjectHistory> items = new List<EzDataObjectHistory>();
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->Datastore->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
)->DataObject(
"dataObject-0001" // dataObjectName
);
const auto It = Domain->DataObjectHistories(
);
TArray<Gs2::UE5::Datastore::Model::FEzDataObjectHistoryPtr> Result;
for (auto Item : *It)
{
if (Item.IsError())
{
return false;
}
Result.Add(Item.Current());
}値の変更イベントハンドリング
var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
// イベントハンドリングを開始
var callbackId = domain.SubscribeDataObjectHistories(
() => {
// リストの要素が変化した時に呼び出される
}
);
// イベントハンドリングを停止
domain.UnsubscribeDataObjectHistories(callbackId); var domain = gs2.Datastore.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).DataObject(
dataObjectName: "dataObject-0001"
);
// イベントハンドリングを開始
var callbackId = domain.SubscribeDataObjectHistories(
() => {
// リストの要素が変化した時に呼び出される
}
);
// イベントハンドリングを停止
domain.UnsubscribeDataObjectHistories(callbackId); const auto Domain = Gs2->Datastore->Namespace(
"namespace-0001" // namespaceName
)->Me(
GameSession
)->DataObject(
"dataObject-0001" // dataObjectName
);
// イベントハンドリングを開始
const auto CallbackId = Domain->SubscribeDataObjectHistories(
[]() {
// リストの要素が変化した時に呼び出される
}
);
// イベントハンドリングを停止
Domain->UnsubscribeDataObjectHistories(CallbackId);Warning
このイベントはSDKがもつローカルキャッシュの値が変更された時に呼び出されます。
ローカルキャッシュは SDK が持つ API の実行、または GS2-Gateway の通知を有効にした GS2-Distributor 経由でのスタンプシートの実行、または GS2-Gateway の通知を有効にした GS2-JobQueue の実行によって変化したもののみが対象となります。
そのため、これらの方法以外で値が変更されてもコールバックは呼び出されません。