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

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

Last updated on July 14, 2026

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

Overview

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

service SectionService {
/**
GetRotationItems: get current rotation items, this method will be called by rotation type is CUSTOM
*/
rpc GetRotationItems(GetRotationItemsRequest) returns (GetRotationItemsResponse);

/**
Backfill method trigger condition:
1. Rotation type is FIXED_PERIOD
2. Bulkfill type is CUSTOM
3. User already owned any one of current rotation items.
*/
rpc Backfill(BackfillRequest) returns (BackfillResponse);
}

API Contract

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 で、現在のアイテムローテーションに既に所有済みのアイテムが含まれている場合に呼び出されます。このユースケースの一例として、所有済みアイテムを置き換えるロジックを実装できます。

この例では、既に所有しているアイテムを、その現在のインデックスで新しいランダムなアイテム 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 リクエストの処理に関する詳細はこちらを参照してください。