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)

結果