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

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

Last updated on February 4, 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 リクエスト処理の詳細については、こちらをご覧ください。