Tech Kids Grand Prix 2026に「Roblox賞」が新設!応募は9/30(水)まで
CreateR Nest
ブログ一覧へ
Roblox Studio

AIにたのんで、コインの数をスコアとして画面に出そう

動作確認日: 2026年10月20日(Roblox Studio 0.743)

連載「AIといっしょにゲームを作ろう」のコインあつめゲームの2回めです。前の回(土台を作る)を読む

前の回で、足場とコインがあって、さわるとコインが消える「土台」ができました。でも、いくつ取ったのかは、どこにも出ていません。

今回は、取ったコインの数を、画面にスコアで出します。

今回作るもの

  • 画面の左上に「コイン: 0 / 5」と出す
  • コインを取るたびに、数が1つ増える
  • 5つ全部取ったら、「ぜんぶ集めた!」に変わる

ゴール(ゲームの終わり)は、次の回で作ります。今回も、「ここまで」と区切ってたのむのがコツです。

ChatGPTにたのむ

前の回で作った作品を、スタジオで開いたまま、ChatGPTに次の文を送ります。

さっき作った「コインあつめダッシュ」に、スコア表示を足してください。
今回は、コインを取った数を画面に出すところまでです。

【作るもの】
1. 画面の左上に「コイン: 0 / 5」と表示する。
2. コインを1つ取るたびに、数字が1つ増える。
3. 5つ全部取ったら、表示を「ぜんぶ集めた!」に変える。

【ルール】
- ゴール(ゲームの終わり)は、次の回で作るので、今回は作らないでください。
- 今までに作った足場とコインは、変えないでください。
- 名前は分かりやすくしてください(例:ScoreGui、ScoreScript)。
- 小学生が読めるように、スクリプトの中に日本語のコメントをつけてください。

【最後にお願い】
作り終わったら、次の3つを、やさしい言葉で教えてください。
- 何を足したか
- スコアが増える部分は、どのスクリプトのどこか
- コインのスクリプトと、スコアのスクリプトは、どうつながっているか

前の回と同じ形です。変えたのは、次の2つです。

  • 「今までに作ったものは、変えないでください」と、最初に書く:前の回で作った足場とコインを、守ってもらいます
  • 「つながり」を説明してもらう:今回は、スクリプトが2つ以上になるからです

できあがりを見る

約41秒で、ChatGPTから次の返事が来ました。

ChatGPTの返事。足したもの、スコアが増えるところ、スクリプトのつながりが書いてある

返事を読むと、次のことがわかります。

  • 足したもの:左上の表示用のScoreGui、数を数えるScoreScript、表示を書きかえるScoreDisplayScriptの3つ
  • スコアが増えるところ:ServerScriptServiceのScoreScriptにある、player:SetAttribute("CoinCount", ...) の行
  • つながり:コインにさわると、CoinScriptがScoreScriptに「1つ取ったよ!」と知らせます。すると数が増えて、ScoreDisplayScriptが画面の文字を書きかえます

「ゴールは作っていません。足場やコインの見た目・動きはそのままです」とも書いてあります。たのんだ「ここまで」を、守ってくれました。

遊んでみる

  1. 画面の上の「▶(プレイ)」を押します
  2. 左上に、「コイン: 0 / 5」と出ています
  3. 足場を渡って、コインにさわります。取るたびに、数が1つずつ増えます

プレイ中の画面。左上に「コイン: 2 / 5」と出ている

5つ全部取ると、表示が変わります。

5つ全部取ったあとの画面。左上の表示が「ぜんぶ集めた!」になっている

問題なく動きました。 今回は、直してもらう必要はありませんでした。このように、一度でうまくいくこともあります。うまくいかなかったときは、前の回のように、そのままChatGPTに伝えて直してもらいましょう。

どこに増えたか見てみる

■(停止)を押して編集の画面にもどり、右のエクスプローラーを見てみましょう。2か所に追加されています。

  • StarterGuiの中に、ScoreGui(画面に出す表示)があります。開くと、ScoreLabel(文字)とScoreDisplayScript(文字を書きかえるスクリプト)が入っています
  • ServerScriptServiceの中に、ScoreScript(数を数えるスクリプト)があります

エクスプローラーのStarterGuiの中に、ScoreGuiとScoreDisplayScript、ScoreLabelがならんでいる

StarterGuiは、プレイヤーの画面に出すものを入れる場所です。ServerScriptServiceは、ゲームの中身を動かすスクリプトを入れる場所です。画面に出す係と、数える係が、別の場所に分かれています。

スクリプトを読んでみる

今回は、スクリプトが3つあります。つながりを見ながら、読んでいきましょう。

コイン(CoinScript) → 数える係(ScoreScript) → 画面に出す係(ScoreDisplayScript)

1. 数える係:ScoreScript

ServerScriptServiceのScoreScriptです。

-- コインを取った数をおぼえる、スコアの係だよ。
local ScoreScript = {}

function ScoreScript.AddCoin(player)
    -- まだ数がなければ、0から始めるよ。
    local count = player:GetAttribute("CoinCount") or 0
    -- コインの数を1つ増やすよ。画面にも、この数が届くよ。
    player:SetAttribute("CoinCount", math.min(count + 1, 5))
end

return ScoreScript
  • function ScoreScript.AddCoin(player):「AddCoin(コインを足す)」という名前の、命令のかたまりを作っています。ほかのスクリプトから呼び出して使えます。player は、コインを取った人です
  • player:GetAttribute("CoinCount"):その人に、「CoinCount」という名前でおぼえさせておいた数を、取り出します。属性(アトリビュート)という、名前つきのメモのようなものです。まだ何もなければ or 0 で、0になります
  • player:SetAttribute("CoinCount", math.min(count + 1, 5)):今の数に1を足して、おぼえさせます。math.min(..., 5) は、5より大きくならないようにする、という意味です

このスクリプトは、ModuleScript(モジュールスクリプト)という種類です。自分では動かず、ほかのスクリプトに呼ばれて、はじめて動く、道具箱のようなスクリプトです。

2. 知らせる側:CoinScript

前の回のコインのスクリプト(Coin1〜5の中のCoinScript)に、3行足しています。

    -- 何回も取らないようにして、コインを消すよ。
    collected = true
    -- スコアの係に、コインを1つ取ったと知らせるよ。
    local ScoreScript = require(game:GetService("ServerScriptService"):WaitForChild("ScoreScript"))
    ScoreScript.AddCoin(player)
    coin:Destroy()
  • require(...):ServerScriptServiceのScoreScriptを、呼び出して使えるようにします
  • ScoreScript.AddCoin(player):さっきのAddCoinを呼んで、「この人が、コインを1つ取ったよ!」と知らせます

そのあとの coin:Destroy() は、前の回と同じで、コインを消します。前の回で作ったものは、そのまま残っています。

3. 画面に出す係:ScoreDisplayScript

StarterGuiのScoreGuiの中にあるScoreDisplayScriptです。

-- 自分のコインの数を、画面に出す係だよ。
local player = game:GetService("Players").LocalPlayer
local label = script.Parent:WaitForChild("ScoreLabel")

local function updateScore()
    local count = player:GetAttribute("CoinCount") or 0
    if count >= 5 then
        -- 全部取れたら、ことばを変えるよ。ゲームは続くよ。
        label.Text = "ぜんぶ集めた!"
    else
        label.Text = "コイン: " .. count .. " / 5"
    end
end

-- 数が変わるたびに、画面を書きかえるよ。
player:GetAttributeChangedSignal("CoinCount"):Connect(updateScore)
updateScore()
  • local player = ...LocalPlayer:いま遊んでいる自分です
  • local label = script.Parent:WaitForChild("ScoreLabel"):画面の文字(ScoreLabel)を、label という名前でおぼえます
  • if count >= 5 then ... else ... end:もし5つ以上なら「ぜんぶ集めた!」、そうでなければ「コイン: 数 / 5」と出します。第7回の「もし〜なら」です。.. は、文字をつなげる記号です
  • GetAttributeChangedSignal("CoinCount"):Connect(updateScore):CoinCountが変わるたびに、updateScoreを動かします。第8回の「さわったら〇〇する」と、同じ考え方です

つながりをまとめます

ScoreScriptとScoreDisplayScriptは、直接おしゃべりしていません。ScoreScriptがプレイヤーの属性(CoinCount)を書きかえて、ScoreDisplayScriptがその変化を見て画面を書きかえます。属性が、2つのスクリプトの間の連絡メモです。

ためしに、数字を変えてみましょう

「ぜんぶ集めた!」は、count >= 5 のところで決まっています。この5を、3に変えてみましょう。

  1. 「■(停止)」を押して、編集の画面にもどります
  2. エクスプローラーで、StarterGuiの中のScoreGuiを開いて、ScoreDisplayScriptをダブルクリックします
  3. if count >= 5 then の5だけを、3に書きかえます
  4. 「▶(プレイ)」を押して、コインを3つ取ります

3つ取った時点で、「ぜんぶ集めた!」に変わります。 ただし、5つ取るまでは「コイン: 2 / 5」のように出るので、数がちぐはぐです。ためしたら、3 を 5 にもどしておきましょう。

読めれば、直せます。 どこの数字が、何を決めているのかが、わかりました。

もっといい、たのみ方

  • 今までに作ったものは「変えないでください」と、先に書く:足したいところだけ、足されます
  • 名前を決めておく:ScoreGui、ScoreScriptのように決めておくと、エクスプローラーで探せます
  • 「つながり」を説明してもらう:スクリプトが増えるほど、どれが何をしているのか、わからなくなります。AIの説明と自分で読んだものを見くらべましょう

つぎは

次の回では、コインを全部取ったらゴールになる仕組みを足します。ChatGPTに直してもらう場面も、出てくる予定です。