GS2-Lottery
ガチャを実装するための仕組みです。 GS2-Lottery では、通常ガチャとBOXガチャに対応しています。
通常ガチャ
通常ガチャは指定された確率で純粋な抽選を行います。
景品テーブル
景品テーブルとは、ガチャを実行した時に出てくる景品の排出確率を定義したものです。 マスターデータとして定義することになります。
重み
景品テーブルでの確率の設定は、景品ごとの重みを設定します。 具体的には以下のようなテーブルを作成することになります。
重み | |
---|---|
景品A | 1 |
景品B | 2 |
景品C | 4 |
これを百分率による確率として解釈すると以下のように解釈できます。
重み | 確率 | |
---|---|---|
景品A | 1 | 14.285% |
景品B | 2 | 28.571% |
景品C | 4 | 57.143% |
百分率ベースで確率を設定する必要がある場合、全てを足して100%になるよう考える必要がありますが 重みベースで確率を設定する場合は、そのような負担をする必要がなくなります。
景品テーブルの入れ子
景品テーブルは、最大5層まで入れ子にすることができます。
具体的な使用方法としては
- SSRキャラクターの排出確率を3%
- SRキャラクターの排出確率を7%
- Rキャラクターの排出確率を90%
という基本指針に基づいて排出キャラクターを設定したい時に便利です。 この場合は2層で、4個の景品テーブルを定義することになります。
レアリティ抽選用景品テーブル
重み | 景品の種類 | 抽選テーブル名 | |
---|---|---|---|
SSR | 3 | 景品テーブルの入れ子 | SSRキャラクター抽選用景品テーブル |
SR | 7 | 景品テーブルの入れ子 | SRキャラクター抽選用景品テーブル |
R | 90 | 景品テーブルの入れ子 | Rキャラクター抽選用景品テーブル |
SSRキャラクター抽選用景品テーブル
重み | 景品の種類 | 抽選テーブル名 | |
---|---|---|---|
SSR-0001 | 1 | 入手処理 | SSR-0001 を GS2-Dictionary に記録 |
SSR-0002 | 1 | 入手処理 | SSR-0002 を GS2-Dictionary に記録 |
SSR-0003 | 1 | 入手処理 | SSR-0003 を GS2-Dictionary に記録 |
SRキャラクター抽選用景品テーブル
重み | 景品の種類 | 抽選テーブル名 | |
---|---|---|---|
SR-0001 | 1 | 入手処理 | SR-0001 を GS2-Dictionary に記録 |
SR-0002 | 1 | 入手処理 | SR-0002 を GS2-Dictionary に記録 |
SR-0003 | 1 | 入手処理 | SR-0003 を GS2-Dictionary に記録 |
Rキャラクター抽選用景品テーブル
重み | 景品の種類 | 抽選テーブル名 | |
---|---|---|---|
R-0001 | 1 | 入手処理 | R-0001 を GS2-Dictionary に記録 |
R-0002 | 1 | 入手処理 | R-0002 を GS2-Dictionary に記録 |
R-0003 | 1 | 入手処理 | R-0003 を GS2-Dictionary に記録 |
BOXガチャ
BOXガチャはマスターデータで定義された景品を指定された数量をBOXに投入し 抽選処理を行う時にはBOXから景品を取り出していくことで景品の内容を決定します。
つまり、100個の景品のうち1個あたりを入れているBOXを用意した場合、100回以内にかならずあたり景品が抽選されます。
BOXへの景品の投入
BOX内部の景品の設定にも景品テーブルを使用します。 通常抽選モードでは排出の重みを設定しましたが、重みのパラメーターにはBOX内に景品を投入する数量を設定します。
重み | |
---|---|
景品A | 1 |
景品B | 2 |
景品C | 4 |
この場合、BOXには最初7個の景品が入っており「景品Aが1個」「景品Bが2個」「景品Cが4個」入っている状態になります。
Warning
BOXモードの抽選処理は、初回抽選時にBOXの中身をシャッフルした配列を用意して、抽選処理はその配列から順番に景品を払い出します。 そのため、1度でも抽選処理が行われたBOXの景品テーブルの内容を変更すると意図しない動作を引き起こします。抽選モデル
抽選モデルでは、景品テーブルのうち抽選APIで使用できる景品テーブルを指定します。 マスターデータとして定義することになります。
上記例で言えば、抽選APIを呼び出した時に いきなり SSRキャラクター抽選用景品テーブル を使って抽選処理が行えてしまうと不安です。
抽選モデルで以下のようなマスターデータを定義しておき
抽選モデル名 | 景品テーブル名 |
---|---|
ガチャ | レアリティ抽選用景品テーブル |
抽選処理を呼び出す際には 抽選モデル名に「ガチャ」を指定して抽選することになります。
実装例
抽選を実行
抽選を実行はゲームエンジン用の SDK では処理できません。
GS2-Showcase の商品購入の報酬として抽選を実行するといった方法で実装してください。
排出確率の取得
var items = await gs2.Lottery.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).ProbabilitiesAsync(
lotteryName: "lottery-0001"
).ToListAsync();
const auto It = Gs2->Lottery->Namespace(
"namespace-0001" // namespaceName
)->Me(
AccessToken
)->Probabilities(
"lottery-0001" // lotteryName
);
TArray<Gs2::UE5::Lottery::Model::FEzProbabilityPtr> Result;
for (auto Item : *It)
{
if (Item.IsError())
{
return false;
}
Result.Add(Item.Current());
}
BOXの中身を取得
var result = await gs2.Lottery.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).GetBoxAsync(
prizeTableName: "prizeTable-0001"
);
var item = await result.ModelAsync();
const auto Domain = Gs2->Lottery->Namespace(
"namespace-0001" // namespaceName
)->Me(
AccessToken
)->BoxItems(
"prizeTable-0001" // prizeTableName
);
const auto item = Domain.Model();
BOXのリセット
var result = await gs2.Lottery.Namespace(
namespaceName: "namespace-0001"
).Me(
gameSession: GameSession
).ResetBoxAsync(
prizeTableName: "prizeTable-0001"
);
const auto Future = Gs2->Lottery->Namespace(
"namespace-0001" // namespaceName
)->Me(
AccessToken
)->BoxItems(
"prizeTable-0001" // prizeTableName
)->ResetBox(
);
Future->StartSynchronousTask();
if (Future->GetTask().IsError()) return false;
その他の機能
景品の排出数量の制限
通常モードで動作させている時に、景品ごとに排出数量の上限を設定できます。 この機能を利用すると Probabilities 関数が応答する確率と実際の確率の齟齬が生じます。 Probabilities を使用して排出確率の表示を行う際には、この機能は利用するべきではありません。
用途として想定されているのは物理景品を配布するための抽選処理です。 確率1%で排出されるギフト券があったとして、ギフト券は100枚しか準備がないケースでこの機能が役立ちます。 ギフト券の排出数量の上限を100に設定し、フェイルオーバー景品にはずれや、異なるあたり景品を設定します。
このように設定することで、すでにギフト券を100枚排出済みの状態で、ギフト券が当選した場合 ギフト券の代わりにフェイルオーバー景品に設定した景品が排出されます。 フェイルオーバー景品に数量制限が設定されている場合は、同様の制限が適用されます。