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

ルートボックスロール関数入門

Last updated on July 14, 2026

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

概要

この記事では、ルートボックスロール用の Extend Override アプリで使用される API コントラクト (Protobuf) について説明します。

service LootBox {
rpc RollLootBoxRewards(RollLootBoxRewardsRequest) returns (RollLootBoxRewardsResponse);
}

API コントラクト

RollLootBoxRewards

RollLootBoxRewards は、プレイヤーがルートボックスを消費した際に AccelByte Gaming Services (AGS) から呼び出され、指定されたルートボックスの報酬リストから、指定されたプレイヤーに付与する報酬アイテムを決定するロジックを実装するために使用されます。

この例では、リクエストされた数量分の報酬アイテムの結果を生成します。

まず、報酬の重みの合計に基づいて報酬をランダムに選択します。重みが大きいほど、その報酬が選択される確率が高くなります。また、選択された報酬からランダムなアイテムを取得します。最後に、そのアイテムを最終結果としてレスポンスに追加します。

アプリでは、以下の関数が src/AccelByte.PluginArch.LootBox.Demo.Server/Services/LootboxFunctionService.cs にあります。

public override Task<RollLootBoxRewardsResponse> RollLootBoxRewards(RollLootBoxRewardsRequest request, ServerCallContext context)
{
var rewards = request.ItemInfo.LootBoxRewards;

int rewardWeightSum = 0;
foreach (var reward in rewards)
rewardWeightSum += reward.Weight;

Random rand = new Random();

List<RewardObject> result = new List<RewardObject>();
for (int i = 0; i < request.Quantity; i++)
{
int selectedIdx = 0;
for (double r = rand.NextDouble() * rewardWeightSum; selectedIdx < rewards.Count - 1; selectedIdx++)
{
r -= rewards[selectedIdx].Weight;
if (r <= 0.0)
break;
}

var selectedReward = rewards[selectedIdx];
int itemCount = selectedReward.Items.Count;

int selectedItemIdx = (int)Math.Round(rand.NextDouble() * (double)(itemCount - 1));
BoxItemObject selectedItem = selectedReward.Items[selectedItemIdx];

var rewardObject = new RewardObject()
{
ItemId = selectedItem.ItemId,
ItemSku = selectedItem.ItemSku,
Count = selectedItem.Count
};
result.Add(rewardObject);
}

RollLootBoxRewardsResponse response = new RollLootBoxRewardsResponse();
response.Rewards.AddRange(result);

return Task.FromResult(response);
}
備考

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