この記事で作るもの
同じタグが付いたPartだけ、サーバーのScriptからオレンジ色へ変える実験を作ります。タグを外したPartは、変更前の色へ戻します。対象はRoblox Studioの新規Baseplateと、ServerScriptService内の通常のScriptです。
CollectionServiceを使うと、同じタグが付いたオブジェクトをまとめて探せます。Partの名前を1個ずつ列挙する代わりに、今回はDemoLampという共通の目印で対象を選びます。ここでは色だけを変え、実際の照明や点滅は追加しません。CollectionServiceの公式資料
1. 3つのPartを置き、2つへタグを付ける
WorkspaceへPartを3つ作ります。次の高さは、Baseplateの上面がY=0の場合です。床を移動している場合は高さを合わせます。
| 対象 | Size | Position | Color |
|---|---|---|---|
| LampA | (4, 1, 4) | (-6, 0.5, -8) | RGB (140, 150, 165) |
| LampB | (4, 1, 4) | (0, 0.5, -8) | RGB (140, 150, 165) |
| PlainPart | (4, 1, 4) | (6, 0.5, -8) | RGB (60, 140, 220) |
3つともAnchoredとCanCollideをオンにします。色はPropertiesのColorで指定します。
- LampAを選び、Properties下部のTagsで
DemoLampを追加します。 - LampBにも同じ
DemoLampタグを追加します。大文字・小文字をそろえます。 - PlainPartにはタグを付けません。
- ServerScriptServiceへ通常のScriptを作り、
TaggedPartColorsと名付けます。
Propertiesが見当たらない場合はStudioのWindowメニューなどから開きます。タグは名前や親子関係とは別の目印です。フォルダー名をDemoLampへ変える操作とは区別します。Propertiesとタグの公式ガイド
Workspace
Baseplate
LampA (Part) ← DemoLampタグ
LampB (Part) ← DemoLampタグ
PlainPart (Part) ← タグなし
ServerScriptService
TaggedPartColors (Script)
2. 既存の対象と、あとから追加された対象を扱う
TaggedPartColorsの中身を次のコードへ置き換えます。各Partの子へ同じScriptを複製する必要はありません。
local CollectionService = game:GetService("CollectionService")
local TAG = "DemoLamp"
local TARGET_COLOR = Color3.fromRGB(255, 190, 70)
local originalColors = {}
local function applyColor(instance)
if not instance:IsA("BasePart") then
return
end
if not instance:IsDescendantOf(workspace) then
return
end
if originalColors[instance] ~= nil then
return
end
originalColors[instance] = instance.Color
instance.Color = TARGET_COLOR
end
local function restoreColor(instance)
local originalColor = originalColors[instance]
if originalColor == nil then
return
end
originalColors[instance] = nil
if instance:IsA("BasePart") then
instance.Color = originalColor
end
end
CollectionService:GetInstanceAddedSignal(TAG):Connect(applyColor)
CollectionService:GetInstanceRemovedSignal(TAG):Connect(restoreColor)
for _, instance in CollectionService:GetTagged(TAG) do
applyColor(instance)
end
処理の入口は2つあります。GetTagged()のループは、Scriptの開始時からタグが付いている対象へ対応します。GetInstanceAddedSignal()は、あとからタグを付けた対象などを受け取ります。追加通知だけを接続しても、開始前からあるPartの処理にはならないため、両方を用意します。
タグを外すとGetInstanceRemovedSignal()で元の色へ戻し、記録も消します。同じ対象へ処理が重なっても元の色を上書きしないよう、保存済みなら何もしない条件も入れています。タグの取得・追加通知・削除通知
3. 色を変える範囲を確認する
このScriptは、Workspaceの中にあるBasePartだけを対象にします。ModelやFolderへタグを付けても、子Partへ自動で同じタグは付きません。この教材では、色を変えるPartそのものへタグを付けます。
ReplicatedStorageのひな型にあらかじめタグを付け、あとからWorkspaceへ移動する運用は、このコードの対象外です。ゲーム全体の階層(DataModel)の中で親を移しただけでは、タグの追加通知に相当しない場合があります。この例で実行中に対象を増やすときは、先にタグなしのPartをWorkspaceへ置き、その後タグを付けます。
サーバーからColorを変えるので、同じサーバーのプレイヤーへ変更が共有されます。ただし、タグの操作や色の変更を別スクリプトからも行うと、この教材で保存した「元の色」と競合します。今回は色を管理するScriptを1つにします。
動作確認
Test(F5)で実行します。実行前に配置したLampAとLampBはオレンジ色になり、PlainPartは青いままになることを確認します。
実行中のタグ操作は、Studioをサーバー側の表示へ切り替えてから行います。クライアント側だけの変更を、サーバーへ保存された結果と取り違えないようにします。Studioのテストモード
| サーバー側での操作 | 期待する結果 |
|---|---|
| 実行開始 | LampAとLampBだけオレンジ色 |
| LampAのDemoLampタグを外す | LampAだけ元の灰色へ戻る |
| LampAへ同じタグを付け直す | LampAが再びオレンジ色になる |
| PlainPartへタグを付ける | PlainPartもオレンジ色になる |
| PlainPartのタグを外す | 最初の青色へ戻る |
| 新しいタグなしPartをWorkspaceへ作り、タグを付ける | そのPartもオレンジ色になる |
Stopすると、通常、テスト中に加えた変更は編集状態へ引き継がれません。保存するタグやPartの配置は、テスト終了後に編集状態で設定します。必要に応じてServer & Clientsで2人を起動し、同じPartの色が共有されていることも確認します。
うまく動かないとき
- 色が変わらない:通常のScriptがServerScriptServiceにあり、Enabledがオンか確認します。タグの綴りも確認します。
- Modelの中が変わらない:Model全体ではなく、各Partへタグを付けます。
- 元の色へ戻らない:クライアント側だけでタグを外していないか、別ScriptがColorを書き換えていないか確認します。
- 実行前からあるPartだけ変わらない:
GetTagged()の最初のループを省略していないか確認します。 - タグ付きの物を移動しても反応しない:この例の範囲を確認し、Workspaceへ置いてからタグを付けます。
まとめ
開始時の対象はGetTagged()、あとからの追加と削除はそれぞれの通知で扱います。色を変える前の値をPartごとに保存するので、タグを外したときはそれぞれの元の色へ戻せます。Partの固定方法を先に確認したい場合はPartとAnchoredの基本へ進めます。
この記事のまとめ
Roblox Studioのタグで複数Partをまとめて扱う例です。GetTaggedで既存の対象を探し、タグの追加で色を変更、削除で元へ戻す処理をサーバーのScriptにまとめます。
