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から次の返事が来ました。

返事を読むと、次のことがわかります。
- 足したもの:いちばん奥の足場に、緑の台Goalを足しました。コインを5つ集めると現れて、さわると画面の真ん中に「ゴール!クリア!」と出ます
- 全部取ったかを調べるところ:GoalDisplayScriptの
if count >= 5 thenです。GoalScriptでも、数を調べています - ゴールを出すスクリプト:GoalGuiの中のGoalDisplayScriptです。
goal.Transparency = 0で、ゴールが見えるようにします
今回も、たのんだ3つに答えてくれています。「全部取ったか」を調べる場所が、2つあるのが、気になるところです。あとで、スクリプトを読むときに、くわしく見ます。
遊んでみる
- 画面の上の「▶(プレイ)」を押します
- 足場を渡って、コインを取ります。5つ取るまでは、ゴールは見えません

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

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

問題なく動きました。 今回も、直してもらう必要はありませんでした。
どこに増えたか見てみる
「■(停止)」を押して編集の画面にもどり、右のエクスプローラーを見てみましょう。今回は、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回の「もし〜なら」です)- さわったのが、プレイヤーではない
- コインが5つより少ない(
count < 5) - もうクリアしている(
GoalClearedがある)
- 3つすべてを通ったら、
player:SetAttribute("GoalCleared", true)で、「クリアしたよ!」という目印をつけます。それを見て、さっきのGoalDisplayScriptが、「ゴール!クリア!」を出します
「全部取ったか」を、2回調べているのは、なぜ?
ChatGPTの返事で、気になったところです。5つ取ったかどうかを、GoalDisplayScriptでも、GoalScriptでも、調べています。
- GoalDisplayScriptは、自分の画面だけを動かす、LocalScript(ローカルスクリプト)です。ゴールを見せたり消したりするのは、自分の画面の中の話です
- GoalScriptは、ゲーム全体のしくみを動かす、Script(スクリプト)です。クリアかどうかは、ゲームの決まりごとなので、こちらで決めます
見た目だけで決めてしまうと、ゴールが見える・見えないと、クリアできる・できないが、ずれることがあります。見せる係と調べる係に分けて、調べる係でも5つ取ったかを確かめているので、5つ取る前にさわっても、クリアになりません。
ためしに、数字を変えてみましょう
「ゴールが現れる数」は、GoalDisplayScriptの count >= 5 の5で決まっています。これを2に変えて、2つのスクリプトの役目のちがいを見てみましょう。
- 「■(停止)」を押して、編集の画面にもどります
- エクスプローラーで、StarterGuiの中のGoalGuiを開いて、GoalDisplayScriptをダブルクリックします
if count >= 5 thenの5だけを、2に書きかえます- 「▶(プレイ)」を押して、コインを2つ取ります
コインが2つの時点で、ゴールが見えるようになるはずです。でも、そこでゴールにさわっても、「クリア!」は出ないはずです。GoalScriptが、「5つ取っていない」と、ことわるからです。5つ取ってからさわれば、クリアになります。
確かめたら、2 を 5 にもどしておきましょう。
読めれば、直せます。 見える数は、GoalDisplayScriptで。クリアできる数は、GoalScriptで。どこの数字が、何を決めているのかが、わかりました。
もっといい、たのみ方
- 「ここまで」を、はっきり書く:「やり直しや、次のゲームは、まだ作らないでください」のように、まだ作らないものも書きます
- 何を調べているかを、説明してもらう:「『全部取ったか』は、どこで調べているか」と聞くと、スクリプトの役割分担が、わかります
- AIの説明で、気になったところを、自分で読んで確かめる:今回の「2回調べている」のように、理由まで読めると、直すときに迷いません
つぎは
次の回では、ここまでのコインあつめゲームを仕上げます。
