【Roblox Studio】ボタンで目の前にパーツが落ちてくる技

○○の作り方

完成動画

はじめに

今回は、ボタンをクリックすると目の前にパーツが上から降ってくる演出を作る方法を紹介します。

使用する主な機能

  • TextButton:クリック可能なUIボタンを表示する。
  • LocalScript & RemoteEvent:プレイヤーの入力をサーバーに送信する仕組み。
  • CFrame.LookVector:プレイヤーの向いている方向を取得。
  • Partのクローン:テンプレートから新しいパーツを生成。
  • Debrisサービス:パーツを一定時間後に自動で削除

手順動画

エクスプローラー構成

ReplicatedStorage
├─ DropPartEvent
└─ Part

ServerScriptService
└─ Script

StarterGui
└─ ScreenGui
    └─ TextButton
        └─ LocalScript

実装するにあたっての考え方

この機能を実装する際に意識したポイントは以下の3つです。

  1. クライアントとサーバーの役割分担
    プレイヤーがボタンを押す処理はクライアント(LocalScript)で行い、実際にパーツを出現させる処理はサーバー(Script)で実行しています。
  2. プレイヤーの「前方」を基準に落とす位置を設定
    HumanoidRootPartCFrame.LookVector を使用して、プレイヤーの正面を計算し、少し上の位置からパーツが落ちるようにしています。
  3. 不要なパーツの自動削除
    落ちたパーツは2秒後に Debris によって削除されるよう設定。

スクリプトの内容

ServerScriptService > Script

local replicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = replicatedStorage:WaitForChild("DropPartEvent")
local partTemplate = replicatedStorage:WaitForChild("Part")
local debris = game:GetService("Debris")

remoteEvent.OnServerEvent:Connect(function(player)
	local character = player.Character
	if not character then return end

	local hrp = character:FindFirstChild("HumanoidRootPart")
	if not hrp then return end

	-- プレイヤーの正面にランダムなXずれを加えて、パーツを上に出現させる
	local forward = hrp.CFrame.LookVector
	local dropPosition = hrp.Position + forward * 5 + Vector3.new(math.random(-2, 2), 10, 0)

	local partClone = partTemplate:Clone()
	partClone.CFrame = CFrame.new(dropPosition)
	partClone.Parent = workspace

	-- 2秒後に自動で削除
	debris:AddItem(partClone, 2)
end)

【ServerScriptService > Script】ReplicatedStorageとサービスの取得

local replicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = replicatedStorage:WaitForChild("DropPartEvent")
local partTemplate = replicatedStorage:WaitForChild("Part")
local debris = game:GetService("Debris")

この部分では、ゲーム内のサービスや必要なオブジェクトを取得しています。

  • ReplicatedStorage からリモートイベント (DropPartEvent) と、落とす対象のパーツ (Part) を取得。
  • Debris サービスは、一定時間後にオブジェクトを自動で削除するために使います。

【ServerScriptService > Script】リモートイベントの接続

remoteEvent.OnServerEvent:Connect(function(player)

クライアント(プレイヤー)から DropPartEvent が発火されたときに、処理を開始するイベントリスナーです。
この関数の引数 player は、イベントを発火したプレイヤーを指します。

【ServerScriptService > Script】プレイヤーのHumanoidRootPartを取得

	local character = player.Character
if not character then return end

local hrp = character:FindFirstChild("HumanoidRootPart")
if not hrp then return end

プレイヤーのキャラクターモデルとその中の HumanoidRootPart を取得しています。
これがないと位置情報が得られないため、存在しない場合は処理を中断しています。

【ServerScriptService > Script】パーツの出現位置を計算

	local forward = hrp.CFrame.LookVector
local dropPosition = hrp.Position + forward * 5 + Vector3.new(math.random(-2, 2), 10, 0)

プレイヤーの向いている方向(LookVector)を使って、プレイヤーの正面5スタッド、上に10スタッドの位置を計算。
さらに、X方向にランダムで -2~2 スタッドずれるようにして、パーツが少しランダムに落ちてくる演出をしています。

【ServerScriptService > Script】パーツの生成と配置

	local partClone = partTemplate:Clone()
partClone.CFrame = CFrame.new(dropPosition)
partClone.Parent = workspace

取得しておいた Part をクローンし、計算した位置に配置します。
その後、workspace に親として設定することで、実際にゲーム内に出現します。

【ServerScriptService > Script】パーツの自動削除設定

	debris:AddItem(partClone, 2)

Debris サービスを使って、出現させたパーツを2秒後に自動で削除するように設定しています。
これにより、ゲームのパフォーマンスを維持できます。

TextButton > LocalScript

local button = script.Parent
local remoteEvent = game:GetService("ReplicatedStorage"):WaitForChild("DropPartEvent")
local players = game:GetService("Players")

button.MouseButton1Click:Connect(function()
	local player = players.LocalPlayer
	if player then
		remoteEvent:FireServer()
	end
end)

【TextButton > LocalScript】UIボタンとリモートイベント、プレイヤーサービスの取得

local button = script.Parent
local remoteEvent = game:GetService("ReplicatedStorage"):WaitForChild("DropPartEvent")
local players = game:GetService("Players")

この部分では、以下のように必要なオブジェクトとサービスを取得しています。

  • script.Parent はこのスクリプトが仕込まれている TextButton を指します。
  • ReplicatedStorage 内にある DropPartEvent を取得。これはサーバーと通信するためのイベントです。
  • Players サービスを通して、ローカルプレイヤー(このスクリプトを実行しているプレイヤー)を取得します。

【TextButton > LocalScript】ボタンがクリックされたときの処理

button.MouseButton1Click:Connect(function()
local player = players.LocalPlayer
if player then
remoteEvent:FireServer()
end
end)

この部分は、ボタンがクリックされたときのイベント処理です。

  • MouseButton1Click は、プレイヤーがボタンを左クリックしたときに発火します。
  • players.LocalPlayer で、操作しているプレイヤー自身を取得。
  • そのプレイヤーが存在する場合、remoteEvent:FireServer() を実行してサーバー側のスクリプトに通知します。

まとめ

本記事では、UIボタンでプレイヤーの前にパーツを落とす仕組みを作成しました。
RemoteEvent を使ったクライアントとサーバーの通信や、CFrame を活用した位置計算、パーツの生成と破棄までを行いました。

チュートリアル系電子書籍の紹介
Roblox Studioでゲーム制作を始めてみませんか?
日本語版 ※英語版あり 「10時間でできる Roblox Studio アクションゲーム制作入門」では、Roblox Studioでのゲーム制作の基本から応用までを短時間で効率的に学びます。この一冊で、初心者でも簡単にアクションゲームを制作できるようになり、ゲーム制作の面白さと達成感を存分に味わうことができます。Roblox Studioの世界への扉を開き、あなたのクリエイティブな旅を始めましょう。
チュートリアル系動画
電子書籍を動画にしました!※無料クーポンあり!

「10時間でできる Roblox Studio アクションゲーム制作入門」の動画版では、書籍の内容をさらにわかりやすく、実際の画面操作を見ながら学べる形式でお届けします。初心者でも安心して取り組めるように、Roblox Studioの基本操作からアクションゲームの完成までを丁寧に解説。テンポよく進むレクチャー動画で、あなたのペースに合わせて学習できます。この動画シリーズを通して、ゲーム制作の基礎をしっかり習得し、Roblox Studioの可能性を広げましょう!

割引クーポンコードはこちらです↓
※3月12日21時まで!
6E0150A3770784ADF77D

Luaに関する電子書籍の紹介
Roblox Studioで使用するLua言語の基本を学ぼう!
日本語版 ※英語版あり 「5時間でできる Roblox Studio を使ったLuaの基本」では、Roblox Studioで使用するプログラミング言語Luaの基本をRoblox Studio上で学びます。また、学んだ知識を活かして、Roblox StudioでLuaを使用する応用部分も一部盛り込まれています。この一冊でLuaの基本を学ぶことで、よりRoblox Studioでのゲーム制作を楽しめるようになります。
アニメーション制作系電子書籍の紹介
Roblox Studioでアニメーションを作ってみよう!
「5時間でできる Roblox Studio アニメーション制作入門」では、Roblox Studioでのアニメーション制作の基本から実際に作るところまでを短時間で効率的に学びます。この一冊で、アニメーション制作の第一歩を踏み出すことができます。Roblox Studioで自由自在にアニメーションを作成し、よりクリエイティブなゲームを作りましょう!
○○の作り方Roblox Studio
シェアする
hideをフォローする
Roblox Studio 制作tips

コメント

タイトルとURLをコピーしました