メインコンテンツまでスキップ

Use UGC for player presets

Last updated on July 14, 2026

注釈:本資料はAI技術を用いて翻訳されています。

概要

User Generated Content (UGC) は、プレイヤーが作成したゲーム内コンテンツを管理するサービスです。UGC は、既存の顧客のエンゲージメント、リテンション、ロイヤルティを高めるだけでなく、新規顧客を惹きつけるための強力な手段となります。UGC の形式はゲームによってさまざまで、その可能性は無限大です。例としては、ゲームキャラクターのカスタマイズ、乗り物の色のカスタマイズ、武器への新しい要素の追加、カスタムマップの作成などが挙げられます。

多くのゲームでは、プレイヤーコンテンツに対して高度なカスタマイズを実装しています。コンテンツをカスタマイズできるようにすると、プレイヤーは自分の個性、好み、スタイルを反映したコンテンツを作成できるため、ゲーム世界への没入感とエンゲージメントが高まります。また、プレイヤーが自分のコンテンツからプリセットを作成して他のプレイヤーと共有できる場合は、プレイヤー間の交流やコミュニティ形成を促進することもできます。プレイヤーが自分のコンテンツを通じて創造性やアイデンティティを表現できるようにすることで、開発者は熱心なファン層を築き、ゲームに関する好意的な口コミを生み出すことができます。

この記事では、UGC サービスを使用してプレイヤー生成コンテンツを保存し、ゲームクライアント内に表示し、ゲームのユースケースに応じて利用する方法を説明します。

前提条件

以下へのアクセスが必要です。

  • AccelByte Gaming Services (AGS) Admin Portal
  • AGS Unreal または Unity SDK
  • 参考用の AGS UGC API ドキュメント

プレイヤーコンテンツを保存するチャンネルを作成する

UGC サービスは、チャンネルに基づいてプレイヤーコンテンツを管理します。チャンネルは、プレイヤーのコンテンツを分類するために使用する汎用的なエンティティです。チャンネルを使用すると、リージョン、言語、ビルドバージョン、パッチ、コンテンツカテゴリなど、ゲームシナリオに必要な任意の基準でコンテンツをグループ化できます。チャンネルはハードコードすることも、プレイヤー自身が管理できるようにすることもできます。

SDK を使用してチャンネルを作成する

FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();

FString ChannelName = "YourChannelName";

ApiClient->UGC.CreateChannel(ChannelName, THandler<FAccelByteModelsUGCChannelResponse>::CreateLambda([](const FAccelByteModelsUGCChannelResponse& Result)
{
// Do something if CreateV2Channel succeeds
}), FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if CreateV2Channel fails
}));

SDK を使用してプレイヤーチャンネルのリストを取得する

この関数を使用して、プレイヤーチャンネルのリストを取得できます。

FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();

FString UserId = "YourUserId";
int32 Limit = 1000;
int32 Offset = 0;
FString ChannelName = "YourChannelName";

ApiClient->UGC.GetChannels(UserId, THandler<FAccelByteModelsUGCChannelsPagingResponse>::CreateLambda([](const FAccelByteModelsUGCChannelsPagingResponse& Result)
{
// Do something if GetChannels succeeds
}), FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if GetChannels fails
}), Limit, Offset, ChannelName);

UGC にプレイヤーコンテンツを保存する

プレイヤーコンテンツをプリセットとして UGC サービスに保存するには、プレイヤーコンテンツに適用したすべてのカスタマイズオプションを含むファイルを作成する必要があります。このファイルに、プレイヤーコンテンツに関する情報が保存されます。

UGC サービスでプレイヤーコンテンツを作成するには、2つのステップが必要です。まず、ファイルをアップロードするための署名付き URL をサービスにリクエストします。このステップでは、プレイヤーコンテンツの名前、タグ、タイプ、サブタイプなどの基本的なメタデータも指定できます。次に、その署名付き URL を使用してファイルをサービスにアップロードします。

Client SDK を使用して署名付き URL を取得する

SDK を使用して署名付き URL を取得する

この関数を使用すると、プレイヤーコンテンツのメタデータを設定し、プレイヤーコンテンツをクラウドストレージにアップロードするための署名付き URL を取得できます。

FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();

FString ChannelId = "YourChannelId";
FAccelByteModelsCreateUGCRequestV2 UGCRequest = {};
UGCRequest.ContentType = "PNG";
UGCRequest.FileExtension = "PNG";
UGCRequest.Name = "UGC Integration UE4";
UGCRequest.Type = "UGC Type";
UGCRequest.SubType = "UGC SubType";
UGCRequest.Tags = { "UGC Tag1", "UGC Tag2"};

ApiClient->UGC.CreateV2Content(ChannelId, UGCRequest, THandler<FAccelByteModelsUGCCreateUGCResponseV2>::CreateLambda([](const FAccelByteModelsUGCCreateUGCResponseV2& Result)
{
// Do something if CreateV2Content succeeds
}), FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if CreateV2Content fails
}));

SDK を使用してプレイヤーコンテンツファイルをアップロードする

注記

この関数には署名付き URL が必要です。Client SDK を使用して署名付き URL を取得するを参照してください。

FString Url = "PayloadUGCUrlToUpload";
TArray<uint8> DataUpload = { 106, 35, 171, 106, 138, 197, 77, 94, 182, 18, 99, 9, 245, 110, 45, 197, 22, 35};

FAccelByteNetUtilities::UploadTo(Url, DataUpload, FHttpRequestProgressDelegate::CreateLambda([](const FHttpRequestPtr& Request, int32 BytesSent, int32 BytesReceived)
{
// Do something if UploadTo still in progress successful
}),FVoidHandler::CreateLambda([]()
{
// Do something if UploadTo succeeds
}), FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if UploadTo fails
}));

プレイヤーコンテンツにスクリーンショットを追加する

プレイヤーコンテンツファイルをより魅力的で分かりやすくする方法の1つは、ゲーム内での見た目を示すスクリーンショットを追加することです。スクリーンショットを使えば、プリセットファイルで作り出した視覚効果やディテールを伝えることができます。

SDK を使用してスクリーンショットアップロード用の署名付き URL を取得する

この関数を使用して、特定のプレイヤーコンテンツのスクリーンショットをアップロードするための署名付き URL を取得できます。

FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();

FString ContentId = "YourContentId";
FString UserId = "UserId";

FAccelByteModelsUGCUploadScreenshotV2 Screenshot;
Screenshot.Description = "Screenshot Test Description";
Screenshot.ContentType = "png";
Screenshot.FileExtension = "png";

FAccelByteModelsUGCUploadScreenshotsRequestV2 ScreenshotsRequest = {};
ScreenshotsRequest.Screenshots = { Screenshot };

ApiClient->UGC.UploadV2ScreenshotContent(ContentId, ScreenshotsRequest, THandler<FAccelByteModelsUGCUpdateContentScreenshotResponse>::CreateLambda([](const FAccelByteModelsUGCUpdateContentScreenshotResponse& Result)
{
// Do something if UploadV2ScreenshotContent succeeds
}), FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if UploadV2ScreenshotContent fails
}));

SDK を使用してスクリーンショットをアップロードする

特定のプレイヤーコンテンツのスクリーンショットをクラウドストレージにアップロードするには、この関数を使用します。

注記

この関数には署名付き URL が必要です。Client SDK を使用して署名付き URL を取得するを参照してください。

FString Url = "PayloadScreenshotUrlToUpload";
TArray<uint8> DataUpload = { 35, 171, 106, 138, 197, 77, 94, 182, 18, 99, 9, 245, 110, 45, 197, 35};

FAccelByteNetUtilities::UploadTo(Url, DataUpload, FHttpRequestProgressDelegate::CreateLambda([](const FHttpRequestPtr& Request, int32 BytesSent, int32 BytesReceived)
{
// Do something if UploadTo still in progress successful
}),FVoidHandler::CreateLambda([]()
{
// Do something if UploadTo succeeds
}), FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if UploadTo fails
}));

シェアコードでプレイヤーコンテンツを表示する

プレイヤーがプレイヤーコンテンツを作成すると、UGC サービスはそのコンテンツに固有のシェアコードを生成します。プレイヤーはそのシェアコードを他のプレイヤーと共有して、自分の作品を披露したり、試してもらうよう誘ったりすることができます。他のプレイヤーはシェアコードを使ってプリセットの詳細にアクセスできます。また、そのプリセットを自分のゲームに適用したり、好みに応じて変更したりすることもできます。

SDK を使用してシェアコードでプレイヤーコンテンツを表示する

以下の例では、シェアコードを使用してプレイヤーコンテンツを取得する方法を示します。

FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();

FString ShareCode = "YourUGCShareCode";

ApiClient->UGC.GetV2ContentByShareCode(ShareCode, THandler<FAccelByteModelsUGCContentResponseV2>::CreateLambda([](const FAccelByteModelsUGCContentResponseV2& Result)
{
// Do something if GetV2ContentByShareCode succeeds
}), FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if GetV2ContentByShareCode fails
}));

プレイヤーコンテンツを変更する

プレイヤーコンテンツを変更する際、プレイヤーはプレイヤーコンテンツのメタデータのみ、またはプリセットファイルのみを更新できます。

UGC サービスでプリセットファイルを変更するには、3つのステップが必要です。まず、新しいファイルをアップロードするための署名付き URL をサービスにリクエストします。次に、その署名付き URL を使用してファイルをサービスにアップロードします。最後に、新しいファイルの場所を更新して変更をコミットします。

SDK を使用してプレイヤーコンテンツのメタデータを更新する

プレイヤーコンテンツのメタデータを更新するには、この関数を使用します。

FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();

FString ChannelId = "YourChannelId";
FString ContentId = "YourContentId";

FAccelByteModelsModifyUGCRequestV2 ModifyRequest = {};
ModifyRequest.Name = "Updated UGC Integration UE4";
ModifyRequest.Type = "Updated UGC Type";
ModifyRequest.SubType = "Updated UGC SubType";
ModifyRequest.Tags = { "Updated UGC Tag1", "Updated UGC Tag2"};

ApiClient->UGC.ModifyV2Content(ChannelId, ContentId, ModifyRequest, THandler<FAccelByteModelsUGCModifyUGCResponseV2>::CreateLambda([](const FAccelByteModelsUGCModifyUGCResponseV2& Result)
{
// Do something if ModifyV2Content succeeds
}), FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if ModifyV2Content fails
}));

SDK を使用して署名付き URL をリクエストする

更新したプレイヤーコンテンツをクラウドストレージにアップロードするための署名付き URL を取得するには、この関数を使用します。

FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();

FString ChannelId = "YourChannelId";
FString ContentId = "YourContentId";

FAccelByteModelsUploadContentURLRequestV2 UploadRequest = {};
UploadRequest.ContentType = "PNG";
UploadRequest.FileExtension = "PNG";

ApiClient->UGC.GenerateUploadContentURLV2(ChannelId, ContentId, UploadRequest, THandler<FAccelByteModelsUGCUploadContentURLResponseV2>::CreateLambda([](const FAccelByteModelsUGCUploadContentURLResponseV2& Result)
{
// Do something if GenerateUploadContentURLV2 succeeds
}), FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if GenerateUploadContentURLV2 fails
}));

SDK を使用して更新したプレイヤーコンテンツファイルをアップロードする

注記

この関数には署名付き URL が必要です。Client SDK を使用して署名付き URL を取得するを参照してください。

FString Url = "PayloadUpdatedUGCUrlToUpload";
TArray<uint8> DataUpload = { 106, 35, 171, 106, 138, 197, 94, 182, 18, 99, 9, 245, 110, 45, 197, 35};

FAccelByteNetUtilities::UploadTo(Url, DataUpload, FHttpRequestProgressDelegate::CreateLambda([](const FHttpRequestPtr& Request, int32 BytesSent, int32 BytesReceived)
{
// Do something if UploadTo still in progress successful
}),FVoidHandler::CreateLambda([]()
{
// Do something if UploadTo succeeds
}), FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if UploadTo fails
}));

SDK を使用してプレイヤーコンテンツファイルの場所を更新する

プレイヤーコンテンツファイルのアップロードが完了したら、次の関数を使用して変更をコミットし、新しいファイルの場所が反映されるようにします。

FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();

FString ChannelId = "YourChannelId";
FString ContentId = "YourContentId";
FString FileExtension = "PNG";
FString S3Key = "YourContentS3Key";

ApiClient->UGC.UpdateContentFileLocationV2(ChannelId, ContentId, FileExtension, S3Key, THandler<FAccelByteModelsUGCUpdateContentFileLocationResponseV2>::CreateLambda([](const FAccelByteModelsUGCUpdateContentFileLocationResponseV2& Response)
{
// Do something if UpdateContentFileLocationV2 succeeds
}), FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if UpdateContentFileLocationV2 fails
}));

プレイヤーコンテンツを削除する

Client SDK を使用してプレイヤーコンテンツを削除する

FApiClientPtr ApiClient = AccelByteOnlineSubsystemPtr->GetApiClient();

FString ChannelId = "YourChannelId";
FString ContentId = "YourContentId";

ApiClient->UGC.DeleteV2Content(ChannelId, ContentId, FVoidHandler::CreateLambda([]()
{
// Do something if DeleteV2Content succeeds
}), FErrorHandler::CreateLambda([](int32 ErrorCode, const FString& ErrorMessage)
{
// Do something if DeleteV2Content fails
}));