- 完成動画
- はじめに
- 使用する主な機能
- 手順動画
- エクスプローラー構成
- 実装するにあたっての考え方
- スクリプトの内容
- 【ServerScriptService > Script】ReplicatedStorageとサービスの取得
- 【ServerScriptService > Script】リモートイベントの接続
- 【ServerScriptService > Script】プレイヤーのHumanoidRootPartを取得
- 【ServerScriptService > Script】パーツの出現位置を計算
- 【ServerScriptService > Script】パーツの生成と配置
- 【ServerScriptService > Script】パーツの自動削除設定
- 【TextButton > LocalScript】UIボタンとリモートイベント、プレイヤーサービスの取得
- 【TextButton > LocalScript】ボタンがクリックされたときの処理
- まとめ
完成動画
はじめに
今回は、ボタンをクリックすると目の前にパーツが上から降ってくる演出を作る方法を紹介します。
使用する主な機能
- TextButton:クリック可能なUIボタンを表示する。
- LocalScript & RemoteEvent:プレイヤーの入力をサーバーに送信する仕組み。
- CFrame.LookVector:プレイヤーの向いている方向を取得。
- Partのクローン:テンプレートから新しいパーツを生成。
- Debrisサービス:パーツを一定時間後に自動で削除
手順動画
エクスプローラー構成
ReplicatedStorage
├─ DropPartEvent
└─ Part
ServerScriptService
└─ Script
StarterGui
└─ ScreenGui
└─ TextButton
└─ LocalScript実装するにあたっての考え方
この機能を実装する際に意識したポイントは以下の3つです。
- クライアントとサーバーの役割分担
プレイヤーがボタンを押す処理はクライアント(LocalScript)で行い、実際にパーツを出現させる処理はサーバー(Script)で実行しています。 - プレイヤーの「前方」を基準に落とす位置を設定
HumanoidRootPartのCFrame.LookVectorを使用して、プレイヤーの正面を計算し、少し上の位置からパーツが落ちるようにしています。 - 不要なパーツの自動削除
落ちたパーツは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 を活用した位置計算、パーツの生成と破棄までを行いました。




コメント