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

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

モデル

EzDataObject

データオブジェクト

データオブジェクトはゲームプレイヤーがアップロードしたデータです。
データは世代管理され、30日分の過去のデータも保管されます。

データにはアクセス権限を設定できます。
スコープには3種類あり、

  • だれでもアクセスできる public
  • 指定したユーザーIDのゲームプレイヤーのみがアクセスできる protected
  • 自身のみがアクセスできる private

があります。

有効化条件必須デフォルト値の制限説明
dataObjectIdstring
~ 1024文字データオブジェクト GRN
※ サーバーが自動で設定
namestring
UUID~ 128文字データオブジェクトの名前
データオブジェクトを識別する一意な名前です。デフォルトでは UUID 形式で自動生成されます。ネームスペース内でアップロードされたデータの参照・管理に使用されます。
userIdstring
~ 128文字ユーザーID
scope文字列列挙型
enum {
  “public”,
  “protected”,
  “private”
}
“private”ファイルのアクセス権
このデータオブジェクトにアクセスできるユーザーを制御します。public は誰でもアクセス可能、protected は allowUserIds に指定されたユーザーIDのみアクセス可能、private はオーナー本人のみアクセス可能です。
定義説明
“public”公開
“protected”指定したユーザーにのみ公開
“private”非公開
allowUserIdsList<string>{scope} == “protected”
[]0 ~ 100 items公開するユーザーIDリスト
スコープが protected に設定されている場合に、このデータオブジェクトにアクセスできるユーザーを指定します。このリストに含まれるユーザーIDのユーザーのみが読み取りアクセスを許可されます。

※ scope が “protected” であれば 有効
status文字列列挙型
enum {
  “ACTIVE”,
  “UPLOADING”,
  “DELETED”
}
状態
データオブジェクトの現在のライフサイクル状態です。ACTIVE はデータがアクセス可能であることを示し、UPLOADING は新しいバージョンがアップロード中であることを示し、DELETED は削除済みであることを示します(実際の削除は30日後に行われます)。
定義説明
“ACTIVE”有効
“UPLOADING”アップロード中
“DELETED”削除済み(削除処理から30日後に実際に削除)
generationstring~ 128文字データの世代
アップロードされたデータの現在のバージョンを表す識別子です。データが再アップロードされるたびに新しい世代IDが割り当てられます。
createdAtlong
現在時刻作成日時
UNIX 時間・ミリ秒
※ サーバーが自動で設定
updatedAtlong
現在時刻最終更新日時
UNIX 時間・ミリ秒
※ サーバーが自動で設定

EzDataObjectHistory

データオブジェクト履歴

データオブジェクトの更新履歴が確認できます。
データオブジェクトが再アップロードされるたびに、世代IDとファイルサイズを含む履歴レコードが作成されます。履歴データは30日間保持され、以前のバージョンへのロールバックや監査が可能です。

有効化条件必須デフォルト値の制限説明
dataObjectHistoryIdstring
~ 1024文字データオブジェクト履歴 GRN
※ サーバーが自動で設定
generationstring
~ 128文字世代ID
アップロード時点のデータオブジェクトの特定バージョンを示す一意な識別子です。DataObject の generation フィールドに対応し、PrepareDownloadByGeneration でこの特定バージョンをダウンロードする際に使用できます。
contentLengthlong
0 ~ 10485760データサイズ
この世代のアップロードデータのサイズ(バイト単位)です。最大ファイルサイズは 10 MB(10,485,760 バイト)です。
createdAtlong
現在時刻作成日時
UNIX 時間・ミリ秒
※ サーバーが自動で設定

メソッド

deleteDataObject

アップロードしたファイルを削除する

指定したデータオブジェクトを削除予定としてマークします。実際のファイルは30日後に削除されます。
プレイヤーが不要になったセーブデータやアップロード済みコンテンツを削除するときに使います。

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
gameSessionGameSession
GameSession
dataObjectNamestring
UUID~ 128文字データオブジェクトの名前
データオブジェクトを識別する一意な名前です。デフォルトでは UUID 形式で自動生成されます。ネームスペース内でアップロードされたデータの参照・管理に使用されます。

Result

説明
itemEzDataObjectデータオブジェクト

Error

このAPIには特別な例外が定義されています。
GS2-SDK for GameEngine ではゲーム内でハンドリングが必要そうなエラーは一般的な例外から派生した特殊化した例外を用意することでハンドリングしやすくしています。
一般的なエラーの種類や、ハンドリング方法は こちら のドキュメントを参考にしてください。

基底クラス説明
InvalidStatusExceptionBadRequestExceptionDataObject が操作可能な状態ではありません

実装例

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

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
gameSessionGameSession
GameSession
dataObjectNamestring
UUID~ 128文字データオブジェクトの名前
データオブジェクトを識別する一意な名前です。デフォルトでは UUID 形式で自動生成されます。ネームスペース内でアップロードされたデータの参照・管理に使用されます。

Result

説明
itemEzDataObjectデータオブジェクト

Error

このAPIには特別な例外が定義されています。
GS2-SDK for GameEngine ではゲーム内でハンドリングが必要そうなエラーは一般的な例外から派生した特殊化した例外を用意することでハンドリングしやすくしています。
一般的なエラーの種類や、ハンドリング方法は こちら のドキュメントを参考にしてください。

基底クラス説明
InvalidStatusExceptionBadRequestExceptionDataObject が操作可能な状態ではありません
NotUploadedExceptionBadRequestExceptionDataObject がアップロードされていません

実装例

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

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
gameSessionGameSession
GameSession
status状態
定義説明
“ACTIVE”有効
“UPLOADING”アップロード中
“DELETED”削除済み(削除処理から30日後に実際に削除)
pageTokenstring~ 1024文字データの取得を開始する位置を指定するトークン
limitint301 ~ 1000データの取得件数

Result

説明
itemsList<EzDataObject>データオブジェクトのリスト
nextPageTokenstringリストの続きを取得するためのページトークン

実装例

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

prepareDownload

ファイルのダウンロード URL を取得する(データオブジェクトIDで指定)

指定したデータオブジェクトの一時的なダウンロード URL を返します。
データオブジェクトは ID(GRN)で指定します。アクセス制御が適用され、ファイルのオーナーまたは許可リストに登録されたユーザーのみダウンロードできます。
返された URL に HTTP GET でアクセスしてファイルをダウンロードします。

Request

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

Result

説明
itemEzDataObjectデータオブジェクト
fileUrlstringファイルをダウンロードするためのURL
contentLengthlongファイルの容量

実装例

    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

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
userIdstring
~ 128文字ユーザーID
dataObjectNamestring
UUID~ 128文字データオブジェクトの名前
データオブジェクトを識別する一意な名前です。デフォルトでは UUID 形式で自動生成されます。ネームスペース内でアップロードされたデータの参照・管理に使用されます。

Result

説明
itemEzDataObjectデータオブジェクト
fileUrlstringファイルをダウンロードするためのURL
contentLengthlongファイルの容量

実装例

    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

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
dataObjectNamestring
UUID~ 128文字データオブジェクトの名前
データオブジェクトを識別する一意な名前です。デフォルトでは UUID 形式で自動生成されます。ネームスペース内でアップロードされたデータの参照・管理に使用されます。
gameSessionGameSession
GameSession

Result

説明
itemEzDataObjectデータオブジェクト
fileUrlstringファイルをダウンロードするためのURL
contentLengthlongファイルの容量

実装例

    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

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

Result

説明
itembyte配列バイナリデータ

実装例

    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-&gt;Datastore-&gt;Namespace(
    "namespace-0001" // namespaceName
)-&gt;Me(
    GameSession
)-&gt;DataObject(
    "dataObject-0001" // dataObjectName
);
const auto Future = Domain-&gt;Download();
Future-&gt;StartSynchronousTask();
if (Future-&gt;GetTask().IsError())
{
    return false;
}

// obtain changed values / result values
const auto Future2 = Future-&gt;GetTask().Result()-&gt;Model();
Future2-&gt;StartSynchronousTask();
if (Future2-&gt;GetTask().IsError())
{
    return Future2-&gt;GetTask().Error();
}
const auto Result = Future2-&gt;GetTask().Result();</code></pre></div>
      
</div>

DownloadByUserIdAndDataObjectName

ユーザIDとデータ名を指定してデータをダウンロード

Request

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

Result

説明
itembyte配列バイナリデータ

実装例

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-&gt;Datastore-&gt;Namespace(
    "namespace-0001" // namespaceName
)-&gt;User(
    "user-0001" // userId
)-&gt;DataObject(
    "dataObject-0001" // dataObjectName
);
const auto Future = Domain-&gt;DownloadByUserIdAndDataObjectName(
);
Future-&gt;StartSynchronousTask();
if (Future-&gt;GetTask().IsError())
{
    return false;
}

// obtain changed values / result values
const auto Future2 = Future-&gt;GetTask().Result()-&gt;Model();
Future2-&gt;StartSynchronousTask();
if (Future2-&gt;GetTask().IsError())
{
    return Future2-&gt;GetTask().Error();
}
const auto Result = Future2-&gt;GetTask().Result();</code></pre></div>
      
</div>

DownloadOwn

自分のデータをダウンロード

Request

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

Result

説明
itembyte配列バイナリデータ

実装例

    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-&gt;Datastore-&gt;Namespace(
    "namespace-0001" // namespaceName
)-&gt;Me(
    GameSession
)-&gt;DataObject(
    "dataObject-0001" // dataObjectName
);
const auto Future = Domain-&gt;DownloadOwn(
);
Future-&gt;StartSynchronousTask();
if (Future-&gt;GetTask().IsError())
{
    return false;
}

// obtain changed values / result values
const auto Future2 = Future-&gt;GetTask().Result()-&gt;Model();
Future2-&gt;StartSynchronousTask();
if (Future2-&gt;GetTask().IsError())
{
    return Future2-&gt;GetTask().Error();
}
const auto Result = Future2-&gt;GetTask().Result();</code></pre></div>
      
</div>

ReUpload

再アップロード

Request

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

Result

説明
itemEzDataObjectデータオブジェクト
uploadUrlstringアップロード処理の実行に使用する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-&gt;Datastore-&gt;Namespace(
    "namespace-0001" // namespaceName
)-&gt;Me(
    GameSession
)-&gt;DataObject(
    "dataObject-0001" // dataObjectName
);
const auto Future = Domain-&gt;ReUpload(
    binary // Binary
);
Future-&gt;StartSynchronousTask();
if (Future-&gt;GetTask().IsError())
{
    return false;
}

// obtain changed values / result values
const auto Future2 = Future-&gt;GetTask().Result()-&gt;Model();
Future2-&gt;StartSynchronousTask();
if (Future2-&gt;GetTask().IsError())
{
    return Future2-&gt;GetTask().Error();
}
const auto Result = Future2-&gt;GetTask().Result();</code></pre></div>
      
</div>

prepareReUpload

既存ファイルの再アップロード(上書き)を準備する

既存のデータオブジェクトの内容を差し替えるための新しいアップロード URL を返します。
以前のファイルは履歴に残るので、世代番号を指定して古いバージョンをダウンロードすることもできます。
返された URL に新しいファイルをアップロードしたあと、DoneUpload を呼んで確定します。

再アップロードの流れ: PrepareReUpload → 返された URL に PUT でファイル送信 → DoneUpload

Request

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
gameSessionGameSession
GameSession
dataObjectNamestring
UUID~ 128文字データオブジェクトの名前
データオブジェクトを識別する一意な名前です。デフォルトでは UUID 形式で自動生成されます。ネームスペース内でアップロードされたデータの参照・管理に使用されます。
contentTypestring“application/octet-stream”~ 256文字アップロードするデータの MIME-Type

Result

説明
itemEzDataObjectデータオブジェクト
uploadUrlstringアップロード処理の実行に使用する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

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
gameSessionGameSession
GameSession
namestring~ 128文字データオブジェクトの名前
指定しなかった場合、自動的にUUIDが割り当てられます。
scope“private”ファイルのアクセス権
このデータオブジェクトにアクセスできるユーザーを制御します。public は誰でもアクセス可能、protected は allowUserIds に指定されたユーザーIDのみアクセス可能、private はオーナー本人のみアクセス可能です。
定義説明
“public”公開
“protected”指定したユーザーにのみ公開
“private”非公開
contentTypestring“application/octet-stream”~ 256文字アップロードするデータの MIME-Type
allowUserIdsList<string>{scope} == “protected”[]0 ~ 100 items公開するユーザーIDリスト
スコープが protected に設定されている場合に、このデータオブジェクトにアクセスできるユーザーを指定します。このリストに含まれるユーザーIDのユーザーのみが読み取りアクセスを許可されます。

※ scope が “protected” であれば有効
updateIfExistsboolfalse既にデータが存在する場合にエラーとするか、データを更新するか

Result

説明
itemEzDataObjectデータオブジェクト
uploadUrlstringアップロード処理の実行に使用する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

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

Result

説明
itemEzDataObjectデータオブジェクト

Error

このAPIには特別な例外が定義されています。
GS2-SDK for GameEngine ではゲーム内でハンドリングが必要そうなエラーは一般的な例外から派生した特殊化した例外を用意することでハンドリングしやすくしています。
一般的なエラーの種類や、ハンドリング方法は こちら のドキュメントを参考にしてください。

基底クラス説明
InvalidStatusExceptionBadRequestExceptionDataObject が操作可能な状態ではありません

実装例

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

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
gameSessionGameSession
GameSession
scope“private”ファイルのアクセス権
このデータオブジェクトにアクセスできるユーザーを制御します。public は誰でもアクセス可能、protected は allowUserIds に指定されたユーザーIDのみアクセス可能、private はオーナー本人のみアクセス可能です。
定義説明
“public”公開
“protected”指定したユーザーにのみ公開
“private”非公開
allowUserIdsList<string>{scope} == “protected”[]0 ~ 100 items公開するユーザーIDリスト
スコープが protected に設定されている場合に、このデータオブジェクトにアクセスできるユーザーを指定します。このリストに含まれるユーザーIDのユーザーのみが読み取りアクセスを許可されます。

※ scope が “protected” であれば有効

Result

説明
itemEzDataObjectデータオブジェクト

実装例

    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

有効化条件必須デフォルト値の制限説明
namespaceNamestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
gameSessionGameSession
GameSession
dataObjectNamestring
UUID~ 128文字データオブジェクトの名前
データオブジェクトを識別する一意な名前です。デフォルトでは UUID 形式で自動生成されます。ネームスペース内でアップロードされたデータの参照・管理に使用されます。
pageTokenstring~ 1024文字データの取得を開始する位置を指定するトークン
limitint301 ~ 1000データの取得件数

Result

説明
itemsList<EzDataObjectHistory>データオブジェクト履歴のリスト
nextPageTokenstringリストの続きを取得するためのページトークン

実装例

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