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

ショップアイテムのローテーション入門

Last updated on February 4, 2026

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

概要

この記事では、ショップアイテムのローテーションとショップセクションアイテムのバックフィルに使用される Extend Override アプリの API コントラクト(Protobuf)について説明します。

service SectionService {
/**
GetRotationItems: 現在のローテーションアイテムを取得します。このメソッドはローテーションタイプが CUSTOM の場合に呼び出されます
*/
rpc GetRotationItems(GetRotationItemsRequest) returns (GetRotationItemsResponse);

/**
Backfill メソッドのトリガー条件:
1. ローテーションタイプが FIXED_PERIOD
2. Bulkfill タイプが CUSTOM
3. ユーザーが現在のローテーションアイテムのいずれかを既に所有している
*/
rpc Backfill(BackfillRequest) returns (BackfillResponse);
}

API コントラクト

GetRotationItems

このメソッドは、ローテーションタイプが CUSTOM のストア表示セクションに対して、AGS プラットフォームの Commerce サービスによって呼び出されます。この関数は、ユーザーがアクティブな表示セクションを取得しようとしたときに呼び出されます。開発者は、特定のユーザーのリクエストに対して、指定されたゲーム内ストアセクションに何を表示するかを決定するロジックを実装できます。

この例では、GetRotationItems のロジックを実装して、1時間ごとにローテーションされる異なるアイテムを返します。

アプリでは、次の関数が src/AccelByte.PluginArch.ItemRotation.Demo.Server/Services/SectionFunctionService.cs にあります。

public override Task<GetRotationItemsResponse> GetRotationItems(GetRotationItemsRequest request, ServerCallContext context)
{
List<SectionItemObject> items = new List<SectionItemObject>(request.SectionObject.Items);
float inputCount = items.Count;


float currentPoint = DateTime.Now.Hour;
int selectedIndex = (int)Math.Floor((inputCount / _UpperLimit) * currentPoint);

SectionItemObject selectedItem = items[selectedIndex];

GetRotationItemsResponse response = new GetRotationItemsResponse();
response.ExpiredAt = 0;
response.Items.Add(selectedItem);

return Task.FromResult(response);
}

Backfill

Backfill は、セクションのローテーションタイプが FIXED_PERIOD、バックフィルタイプが CUSTOM、かつ現在のアイテムローテーションに既に所有しているアイテムがある場合に呼び出されます。このユースケースの1つは、所有しているアイテムの置き換えロジックを実装できることです。

この例では、既に所有しているアイテムを、現在のインデックスにある新しいランダムなアイテム ID で置き換えます。

アプリでは、次の関数が src/AccelByte.PluginArch.ItemRotation.Demo.Server/Services/SectionFunctionService.cs にあります。

public override Task<BackfillResponse> Backfill(BackfillRequest request, ServerCallContext context)
{
BackfillResponse response = new BackfillResponse();

foreach (var item in request.Items)
{
if (item.Owned)
{
BackfilledItemObject newItem = new BackfilledItemObject()
{
ItemId = Guid.NewGuid().ToString().Replace("-", ""),
Index = item.Index
};
response.BackfilledItems.Add(newItem);
}
}

return Task.FromResult(response);
}
備考

gRPC リクエスト処理の詳細については、こちらをご覧ください。