Robloxでシンプルなコイン拾いゲームを作成する
プロジェクトの作成
新規プロジェクトをBaseTemplateで作成する
コインパーツの作成
シリンダーパーツを作成し、Coinに名前を変更する
Coinのスケールを(1, 4, 4)に変更する
CoinのマテリアルにMetal、色にNewYellerを選択する
コインを獲得できるようにする
Coinパーツ配下にスクリプトを追加、名前をCoinScriptにする
CoinScriptを以下のように編集する
-- coinのパーツを取得 local part = script.Parent -- 触れられたパーツがプレイヤーだったらcoinを破壊する local function onPartTouch(otherPart) local partParent = otherPart.Parent local humanoid = partParent:FindFirstChildWhichIsA("Humanoid") if humanoid then part:Destroy() end end -- coinパーツがなにかに触れられたときにonPartTouchを実行する part.Touched:Connect(onPartTouch)
コインをランダムな位置に生成する
現状ではコインを一枚取ってしまったらゲームが終わってしまうため、ランダムな位置にコインを生成できるようにする
作成したCoinをServerStorage配下に移動する
ServerScriptServiceに新しいスクリプトを作成し、CoinSpawnScriptに名前を変更する
以下のように記述する
-- ServerStorageにアクセスするためのサービスクラスを取得 local storage = game:GetService("ServerStorage") -- ランダムな位置にコインを生成する local function SpawnCoin() -- ServerStorageからコインパーツを取得、クローンを作成する local coin = storage:FindFirstChild("Coin"):Clone() -- 作成したクローンをランダムな位置に配置する local x = math.random(-50, 50) local z = math.random(-50, 50) coin.Parent = game.Workspace coin.Position = Vector3.new(x, 5, z) end -- 1秒ごとにコイン生成を行う while(true) do SpawnCoin() wait(1) end
このままではCoinが永遠に生成されてしまうため、フィールド上にCoinが10枚以上ある場合、それ以上生成しないようにする
CoinSpawnScriptのSpawnCoinを以下のように改修する
-- ランダムな位置にコインを生成する local function SpawnCoin() -- Workspace内のコインの数を数える local children = workspace:GetChildren() local coinCount = 0 for _, child in next, children do if child.name == "Coin" then coinCount += 1 end end -- コインが10枚以上あれば生成は行わない if coinCount >= 10 then return end -- ServerStorageからコインパーツを取得、クローンを作成する local coin = storage:FindFirstChild("Coin"):Clone() -- 作成したクローンをランダムな位置に配置する local x = math.random(-50, 50) local z = math.random(-50, 50) coin.Parent = game.Workspace coin.Position = Vector3.new(x, 5, z) end
スコアを表示する
拾ったコインの数の数をリーダーボードを利用して表示する
ServerScriptService配下にCoinAmountLeaderBoardに名前を変更する
CoinAmountLeaderBoardにてリーダーボードを初期化する
local Players = game:GetService("Players") -- リーダーボードを初期化する local function leaderboardSetup(player) local leaderstats = Instance.new("Folder") leaderstats.Name = "leaderstats" leaderstats.Parent = player local stage = Instance.new("IntValue") stage.Name = "Coin" stage.Value = 0 stage.Parent = leaderstats end -- プレイヤーが追加されたときにリーダーボードを初期化する Players.PlayerAdded:Connect(leaderboardSetup)
ゲームをプレイするとリーダーボードが表示される
コインを獲得したときにリーダーボードを更新する
ServerStorageのCoin配下にあるCoinScriptを編集する
追加するのはPlayerのサービスクラスの獲得と、コインを獲得したときに獲得したプレイヤーのリーダーボードを更新する処理
-- プレイヤーのサービスクラスを取得 local Players = game:GetService("Players") -- coinのパーツを取得 local part = script.Parent -- 触れられたパーツがプレイヤーだったらcoinを破壊する local function onPartTouch(otherPart) local partParent = otherPart.Parent local humanoid = partParent:FindFirstChildWhichIsA("Humanoid") if humanoid then part:Destroy() -- Playerサービスクラスからパーツを触ったプレイヤーを取得 local player = Players:GetPlayerFromCharacter(partParent) -- プレイヤーからleaderstasを取得し、更新する local leaderstats = player.leaderstats local stage = leaderstats and leaderstats:FindFirstChild("Coin") if stage then stage.Value += 1 end end end -- coinパーツがなにかに触れられたときにonPartTouchを実行する part.Touched:Connect(onPartTouch)
結果