体験申込で

Amazonギフト

カードもらえる

体験申込・無料相談

News

お知らせ

【Roblox】レア度と確率をデータで読み解く3つのステップ

コラム  

「あっちのキャラのほうがレア度が高い」「このキャラが一番強い」と画面を見つめる子どもたちの姿は、家庭でもよく見かける光景ではないでしょうか。

しかし、レア度の一覧を眺めているだけでは、そのキャラクターがゲームの中でどうやって生み出されているのか、なぜ出にくいのかという数字の仕組みまではなかなか見えてきません。

ゲームで遊ぶ側から「作る側」へと視点を広げる第一歩は、キャラクターをデータの集まりとして捉え、出現確率を自分で設計してみる工夫です。

この記事では、Robloxのスクリプト言語であるLuau(ルアウ)を使い、キャラクターの属性の整理から確率による抽選の仕組みまでを、3つのステップで解説します。

まずはご家庭で数字を動かしてみて、プログラミングやゲーム設計をさらに深めたくなったら、教室でプロと一緒に挑戦する道もあります。



なぜレア度表を眺めるだけでは、キャラの数字が見えてこないのか

色分けされたランキング表がめくれて裏側の歯車とデータが見えているイラスト

多くのプレイヤーに遊ばれている『ブレインロットを盗む』の解説記事でも触れているように、キャラクター集めがテーマのゲームでは、レア度ごとのティア表やランキングに注目が集まりがちです。強いキャラクターを手に入れたい一心で一覧表を見比べる時間は、プレイヤーとして最も楽しい瞬間の一つでしょう。

しかし、そうした一覧表に並んでいるのは「結果としての強さ」や「見た目の珍しさ」に過ぎません。ゲームの内部では、どのキャラクターがどのくらいの割合で手に入るのか、確率という精密な数値が事前に仕組まれています。この裏側の数値に目を向けないままでは、ゲームを遊ぶ側の感覚から抜け出すことが難しくなります。

プログラミングでゲームを作るときに欠かせないのが、こうした数値を自分で定義し、思い通りに動かす視点です。Robloxの公式チュートリアルCoding fundamentalsでも、変数の扱い方や関数の動かし方といった基礎から順を追って学ぶ構成がとられています。まずはキャラクターを単なる「絵」ではなく「数値データの集まり」として捉え直すところから、ゲーム作りの第一歩を踏み出してみましょう。

キャラクターを「属性データ」として整理する

キャラクターカードから名札・宝石・天秤の3つの項目に線がつながるデータ構造の図解

ゲームに登場するキャラクターをプログラムで扱うためには、名前やレア度といった特徴を整理してまとめる必要があります。Robloxの開発言語であるLuauでは、複数の情報をひとつにまとめる仕組みとして「テーブル(table)」が用意されています。

テーブルは、番号順に値を並べる「配列」と、名前などのキーを使って値を紐付ける「辞書」を合わせたデータ構造です。たとえば、キャラクターの名前、レア度の分類、そして出現の目安となる「重み」という数値を、キーと値のペアとして一つの入れ物に保管できます。

まずは3体のキャラクターを例に、どのような属性を持たせるかを表で整理してみます。

キャラクター名レア度重み(数値)
ノーマルボーイコモン70
スピードスターレア25
シャドウマスターレジェンド5

この表のように整理しておくと、プログラムの中で「このキャラの名前は何か」「出現しやすさはどれくらいか」を簡単に取り出せます。重み(weight)という項目は、数字が大きいほど手に入りやすく、小さいほど貴重であることを示す目安です。

このように情報を属性ごとに切り分けて管理する感覚が、ゲーム制作におけるデータ設計の基本となります。

レア度ごとの出現確率を数字で比べてみる

レア度の星の数ごとに棒グラフの長さが大きく異なる出現確率の比較図

キャラクターごとの重みを決める前に、実際のゲームでレア度ごとの確率がどのように設計されているのか、実例を見てみましょう。

大人気ゲーム『ブレインロットを盗む』では、一般的なキャラクターから滅多に出会えない特別なキャラクターまで、幅広いレア度が設定されています。なお、本作における出現確率は運営から公式に発表されている確定値ではなく、コミュニティによる集計データに基づいた推定値として知られています。

コミュニティの集計データによると、最上位に位置するシークレットやOGといったキャラクターの出現確率は、数十兆分の1という天文学的な数値に及ぶとされています。手に入りやすい一般的なキャラクターと比べると、確率の桁がまったく違います。簡単には手に入らないからこそ、プレイヤーの間で高い価値を持ちます。

ゲーム制作者は、プレイヤーに手軽な達成感を味わわせる「出やすい枠」と、長く遊んでもらうための「憧れの枠」を、こうした確率の桁を変えることで意図的にコントロールしています。

データと確率を使った抽選スクリプトを3つのステップで作る

画面上で動く抽選の仕組みを作るには、乱数(ランダムな数値)を発生させる関数が必要です。Luauには、数値をランダムに選ぶための組み込み関数として math.random が用意されています。

math.random の使い方は、与える引数の数によって3通りに分かれます。引数を渡さない場合は0から1までの小数を返し、引数を1つだけ渡した math.random(n) の場合は1からnまでの整数を返します。そして math.random(min, max) のように2つの引数を渡すと、指定した最小値から最大値までの範囲にある整数をランダムに取り出せます。

ここからは、先ほど整理したキャラクターデータと math.random を組み合わせて、実際に動く抽選スクリプトを3つのステップで作っていきます。

ステップ1:キャラクターのデータをテーブルにまとめる

最初のステップは、キャラクターの情報をLuauのテーブルとしてスクリプトに記述する作業です。

前の節で整理した表をもとに、キャラクター名(name)、レア度(rarity)、そして出現の重み(weight)をひとまとまりのデータとして定義します。

local characters = {
    {name = "ノーマルボーイ", rarity = "コモン", weight = 70},
    {name = "スピードスター", rarity = "レア", weight = 25},
    {name = "シャドウマスター", rarity = "レジェンド", weight = 5}
}

このように波かっこ {} の中に辞書形式のデータを並べることで、1つの配列の中に複数のキャラクター情報をすっきりと格納できます。

ステップ2:レア度ごとに出現率の重みを決める

データをまとめたら、次は重みの合計値を計算します。抽選を行うには、「全体の重みの中で、それぞれのキャラクターがどれくらいの割合を占めているか」を把握しなければなりません。

重みの合計を求めるには、テーブルの中身を順番に取り出して数値を足し合わせる処理を書きます。

local totalWeight = 0
for _, char in ipairs(characters) do
    totalWeight = totalWeight + char.weight
end

今回の設定では、70 + 25 + 5 で合計は100になります。つまり、ノーマルボーイは70/100(70%)、スピードスターは25/100(25%)、シャドウマスターは5/100(5%)の確率で選ばれる計算です。

乱数の仕様についてはRobloxの公式リファレンスmath.randomでも解説されているとおり、全体の合計値が分かれば、その範囲内でランダムな整数を1つ選ぶ準備が整います。

ステップ3:math.randomで抽選してprint()で確認する

いよいよ math.random を使って抽選を行い、結果を画面に出力します。

1から全体の重み合計(totalWeight)までの乱数を発生させ、出た数値がどのキャラクターの範囲に当てはまるかを順番に判定していきます。

local randomNumber = math.random(1, totalWeight)
local currentWeight = 0
local chosenCharacter = nil

for _, char in ipairs(characters) do
    currentWeight = currentWeight + char.weight
    if randomNumber <= currentWeight then
        chosenCharacter = char
        break
    end
end

print("抽選結果: " .. chosenCharacter.name .. " (" .. chosenCharacter.rarity .. ")")

スクリプトを実行すると、Roblox Studioの下部にある出力ウィンドウに結果が表示されます。

何度も実行してみると、ノーマルボーイが多く選ばれ、シャドウマスターはめったに出ない様子が確認できるはずです。これで、確率に基づいた抽選システムの基礎が完成しました。

抽選の重みを変えて、自分だけのバランスを考えてみる

天秤のおもりを増やす前と後でキャラクターの出現しやすさが変わる様子を示すイラスト

抽選スクリプトが完成したら、数値を書き換えてゲームバランスの変化を体感してみましょう。

プログラミングの面白さは、数値を少し変えるだけでゲームの手応えが一変する点にあります。たとえば、シャドウマスターの weight を「5」から「1」に減らし、ノーマルボーイの weight を「74」に増やしてみます。合計値は100のままですが、シャドウマスターの出現率は5%から1%へと大幅に下がり、より手に入りにくいレアキャラクターへと変化します。

逆に、誰でも爽快にレアキャラを集められるイベント風のゲームにしたいなら、レジェンドの重みを一気に「40」まで引き上げる設計も考えられます。どのキャラクターをどのくらい出やすくするかという調整には、正解がありません。自分がプレイヤーにどんな体験を届けたいかによって、数字を自由にデザインできます。

数字を動かして手応えを確かめる試行錯誤こそが、ゲーム開発者が日常的に行っているバランス調整そのものです。

TETRA UPで、確率やデータ設計を一緒に形にする

今回体験したようなキャラクターデータの整理や重みを用いた出現確率の設計は、本格的なゲーム開発でも基礎となる重要な考え方です。プログラミング教室のTETRA UPでは、Roblox Studioとスクリプト言語のLuauを使い、小学校高学年以上のお子さまを対象にゲーム制作を学ぶコースを用意しています。



よくある質問

Q. このスクリプトを試すのに、Robloxアカウント以外に必要なものはありますか。

A. Roblox Studioをインストールしたパソコンがあれば試せます。Robloxの公式チュートリアルでも、Luauでのローカル変数の使い方やprint()の基本から解説されているので、初めてスクリプトを書く場合はあわせて見ておくと理解しやすくなります。

Q. print()で結果を表示しても、Studio画面のどこを見ればいいですか。

A. 画面下部の「出力(Output)」ウィンドウに表示されます。表示されない場合は、メニューの「表示」からOutputウィンドウを開いているか確認してください。

Q. 今回作った抽選スクリプトの次は、何を学ぶと発展させられますか。

A. 抽選結果に応じてキャラクターを実際にプレイヤーへ渡す処理や、複数回抽選した結果を配列に記録して集計する処理へ進むと、ゲームらしい仕組みに近づきます。Robloxの公式チュートリアルには、配列や辞書を使ったデータ管理を扱う続きのステップも用意されています。

Q. 子どもが確率の低いレア度ばかり気にしてしまう場合、家庭でどう声をかければいいですか。

A. 低い確率を追いかけること自体を否定せず、「その確率をどうやって数字で決めているんだろう」と設計側の疑問に会話を向けると、遊ぶ視点から作る視点へ移りやすくなります。今回のように自分で数値を変えて試す体験が、その橋渡しになります。

Q. TETRA UPのRobloxコースでは、どんなソフトを使って学びますか。

A. Roblox Studioを使い、スクリプトの言語はLuauです。対象は小学校高学年以上で、四谷本校のほかオンラインでも受講できます。

まとめ

ゲームで強いキャラクターを集めるとき、レア度表をただ眺めているだけでは見えなかった数字の仕組みも、自分でコードを書いて動かしてみると仕組みがはっきりと見えてきます。

今回の記事では、ゲーム制作者の視点でレア度と確率を読み解く手順を、次の3つのステップで紹介しました。

  1. キャラクターの名前や出現率の重みをテーブルとして整理する
  2. 出現率の重み(weight)を決め、合計値に対する割合を計算する
  3. math.random関数を使って重みに基づいた抽選を行い、print()で結果を確認する

ゲームの裏側にある数値を自分でコントロールできるようになると、遊んでいるときにも「このゲームはどういう確率で作られているのだろう」と自然に考えられるようになります。消費するだけの遊びから、仕組みを想像して生み出す学びへと一歩踏み出してみましょう。



あわせて読みたい

参考資料

コラム