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

AIにたのんで、コインを全部取ったらゴールが出るようにしよう

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

連載「AIといっしょにゲームを作ろう」の、コインあつめゲームの3回めです。前の回(スコアを出す)を読む

前の回で、取ったコインの数が、画面にスコアとして出るようになりました。5つ取ると「ぜんぶ集めた!」と出ますが、ゲームはそのまま続きます。

今回は、ゴールを足します。

今回作るもの

  • コインを5つ全部取るまで、ゴールは見えない
  • 5つ全部取ると、いちばん奥の足場の上に、ゴール(緑色の台)が現れる
  • ゴールにさわると、画面の真ん中に「ゴール!クリア!」と出る

ChatGPTにたのむ

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

さっき作った「コインあつめダッシュ」に、ゴールを足してください。
今回は、コインを全部取ったらゴールが出て、さわったらクリアになるところまでです。

【作るもの】
1. コインを5つ全部取るまで、ゴールは見えなくて、さわっても何も起きない。
2. 5つ全部取ったら、いちばん奥の足場の上に、ゴール(緑色の目立つ台)が現れる。
3. プレイヤーがゴールにさわると、画面の真ん中に「ゴール!クリア!」と大きく出る。

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

【最後にお願い】
作り終わったら、次の3つを、やさしい言葉で教えてください。
- 何を足したか
- 「全部取ったか」は、どのスクリプトのどこで調べているか
- ゴールが現れるのは、どのスクリプトか

前の回と同じ形です。「今回は、ここまで」を、さらにはっきりさせました。「やり直しや、次のゲームは、まだ作らないでください」と書いておくと、AIが先走って作りすぎるのを防げます。

できあがりを見る

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

ChatGPTの返事。足したもの、全部取ったかを調べるところ、ゴールを出すスクリプトが書いてある

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

  • 足したもの:いちばん奥の足場に、緑の台Goalを足しました。コインを5つ集めると現れて、さわると画面の真ん中に「ゴール!クリア!」と出ます
  • 全部取ったかを調べるところ:GoalDisplayScriptの if count >= 5 then です。GoalScriptでも、数を調べています
  • ゴールを出すスクリプト:GoalGuiの中のGoalDisplayScriptです。goal.Transparency = 0 で、ゴールが見えるようにします

今回も、たのんだ3つに答えてくれています。「全部取ったか」を調べる場所が、2つあるのが、気になるところです。あとで、スクリプトを読むときに、くわしく見ます。

遊んでみる

  1. 画面の上の「▶(プレイ)」を押します
  2. 足場を渡って、コインを取ります。5つ取るまでは、ゴールは見えません

プレイ中の画面。左上に「コイン: 1 / 5」と出ている。ゴールはまだ見えない

  1. 5つ全部取ると、いちばん奥の足場の上に、緑色のゴールの台が現れます

5つ全部取ったあとの画面。左上が「ぜんぶ集めた!」になり、足場の上に緑色のゴールが光っている

  1. ゴールにさわると、画面の真ん中に「ゴール!クリア!」と出ます

ゴールにさわった画面。真ん中に「ゴール!クリア!」と大きく出ている

問題なく動きました。 今回も、直してもらう必要はありませんでした。

どこに増えたか見てみる

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

  • Workspaceの中に、Goal(緑の台)があります
  • StarterGuiの中に、GoalGui(画面に出す表示)があります。開くと、ClearLabel(「ゴール!クリア!」の文字)と、GoalDisplayScriptが入っています
  • ServerScriptServiceの中に、GoalScriptがあります

前の回と同じ、画面に出す係(StarterGui)と、ゲームの中身を調べる係(ServerScriptService)に、分かれています。

スクリプトを読んでみる

今回は、新しいスクリプトが2つです。前の回のScoreScript(数える係)は、そのまま使っています。

コイン → ScoreScript(数える) → GoalDisplayScript(ゴールを見せる)
                                  → GoalScript(クリアか調べる) → GoalDisplayScript(「クリア!」を出す)

1. ゴールを見せる係:GoalDisplayScript

StarterGuiのGoalGuiの中にある、GoalDisplayScriptです。

-- ゴールと、クリアの文字を見せる係だよ。
local player = game:GetService("Players").LocalPlayer
local goal = workspace:WaitForChild("Goal")
local clearLabel = script.Parent:WaitForChild("ClearLabel")

local function updateGoal()
    local count = player:GetAttribute("CoinCount") or 0
    -- 自分がコインを5つ集めたら、緑のゴールを見せるよ。
    if count >= 5 then
        goal.Transparency = 0
    else
        goal.Transparency = 1
    end
end

local function updateClear()
    -- ゴールにさわってクリアしたら、真ん中の文字を見せるよ。
    clearLabel.Visible = player:GetAttribute("GoalCleared") == true
end

-- スコアの係がおぼえた数を、そのまま使うよ。
player:GetAttributeChangedSignal("CoinCount"):Connect(updateGoal)
player:GetAttributeChangedSignal("GoalCleared"):Connect(updateClear)
updateGoal()
updateClear()
  • updateGoal:前の回と同じ、属性(CoinCount)を読んで、count >= 5 なら goal.Transparency = 0、そうでなければ 1 にします。Transparency(とうめい度)は、0 なら見える、1 ならすっかり見えなくなります。ゴールが、とうめいから見える状態に変わるのが、「現れる」のしくみです
  • updateClear:GoalClearedという、別の属性を読みます。true(本当)なら、ClearLabelを見せます
  • 最後の4行:CoinCountやGoalClearedが変わるたびに、それぞれの命令を動かします。前の回の、画面を書きかえるしくみと同じです

ここでは、「見せる」だけをしています。クリアかどうかを決めるのは、次のスクリプトです。

2. クリアかどうか調べる係:GoalScript

ServerScriptServiceのGoalScriptです。

-- ゴールにさわったとき、本当に全部集めたか調べる係だよ。
local Players = game:GetService("Players")
local goal = workspace:WaitForChild("Goal")

goal.Touched:Connect(function(hit)
    local character = hit:FindFirstAncestorOfClass("Model")
    local player = character and Players:GetPlayerFromCharacter(character)
    if not player then
        return
    end

    -- コインが5つより少なければ、何も起きないよ。
    local count = player:GetAttribute("CoinCount") or 0
    if count < 5 then
        return
    end

    -- 一度クリアしたら、何回も知らせないよ。
    if player:GetAttribute("GoalCleared") then
        return
    end
    -- 画面の係に「クリアしたよ!」と知らせるよ。
    player:SetAttribute("GoalCleared", true)
end)
  • goal.Touched:Connect(function(hit):ゴールに何かがさわったときに、動きます(コインのときと同じです)
  • 3つの if ... then return end:次のどれかなら、何もしないで終わります(第7回の「もし〜なら」です)
    1. さわったのが、プレイヤーではない
    2. コインが5つより少ない(count < 5)
    3. もうクリアしている(GoalClearedがある)
  • 3つすべてを通ったら、player:SetAttribute("GoalCleared", true) で、「クリアしたよ!」という目印をつけます。それを見て、さっきのGoalDisplayScriptが、「ゴール!クリア!」を出します

「全部取ったか」を、2回調べているのは、なぜ?

ChatGPTの返事で、気になったところです。5つ取ったかどうかを、GoalDisplayScriptでも、GoalScriptでも、調べています。

  • GoalDisplayScriptは、自分の画面だけを動かす、LocalScript(ローカルスクリプト)です。ゴールを見せたり消したりするのは、自分の画面の中の話です
  • GoalScriptは、ゲーム全体のしくみを動かす、Script(スクリプト)です。クリアかどうかは、ゲームの決まりごとなので、こちらで決めます

見た目だけで決めてしまうと、ゴールが見える・見えないと、クリアできる・できないが、ずれることがあります。見せる係と調べる係に分けて、調べる係でも5つ取ったかを確かめているので、5つ取る前にさわっても、クリアになりません。

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

「ゴールが現れる数」は、GoalDisplayScriptの count >= 5 の5で決まっています。これを2に変えて、2つのスクリプトの役目のちがいを見てみましょう。

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

コインが2つの時点で、ゴールが見えるようになるはずです。でも、そこでゴールにさわっても、「クリア!」は出ないはずです。GoalScriptが、「5つ取っていない」と、ことわるからです。5つ取ってからさわれば、クリアになります。

確かめたら、2 を 5 にもどしておきましょう。

読めれば、直せます。 見える数は、GoalDisplayScriptで。クリアできる数は、GoalScriptで。どこの数字が、何を決めているのかが、わかりました。

もっといい、たのみ方

  • 「ここまで」を、はっきり書く:「やり直しや、次のゲームは、まだ作らないでください」のように、まだ作らないものも書きます
  • 何を調べているかを、説明してもらう:「『全部取ったか』は、どこで調べているか」と聞くと、スクリプトの役割分担が、わかります
  • AIの説明で、気になったところを、自分で読んで確かめる:今回の「2回調べている」のように、理由まで読めると、直すときに迷いません

つぎは

次の回では、ここまでのコインあつめゲームを仕上げます。