「LocalScriptとScriptは何が違うの?」「LocalScriptを置いたのに動かない」「自分の画面だけ色を変えたい」
ロブロックス(Roblox)スタジオのローカルスクリプト(LocalScript)とScriptの違いを、実際の画像付きで誰でも簡単に分かるように解説します。赤い床と青い床を並べ、色を変える2つのスクリプトを作って、1人のテストと2人のテストで見比べます。
中級ステップ1/28 前の記事:ロブロックス(Roblox)スタジオで共同作業するやり方 全体の順番を見る
使うもの:Roblox Studioが起動するパソコン、マウス、キーボード。Scriptの入れ方と貼り付け方はスクリプトの作り方で解説しています。
先に答え:LocalScriptは遊んでいる人のパソコン(クライアント)だけで動き、変えた結果はその人の画面にしか出ません。全員に同じ変化を見せたいときは、サーバーで動くScriptを使います。
RunContextは、Scriptを「どこで動かすか」を決めるプロパティです。
| Script(RunContext Server) | LocalScript | |
|---|---|---|
| 動く場所 | サーバー(ゲームの正しい状態を持っているRobloxのコンピューター) | 遊んでいる人のパソコン(クライアント) |
| 変えた結果が見える人 | 全員 | その人だけ |
| よく置く場所 | ServerScriptService | StarterPlayerScripts |
| 使う場面 | 得点・保存・全員に関わる仕掛け | 画面の表示・カメラ・キー入力 |
サーバーとクライアントはなぜ分かれているの?
ロブロックスのゲームは、サーバーとクライアントの2つに分かれて動いています。
| 役目 | 動く場所 | |
|---|---|---|
| サーバー | ゲームの正しい状態を持っている側。だれが何コイン持っているか、ドアが開いているかを決める | Robloxのコンピューター |
| クライアント | その状態を見せてもらい、操作を送る側 | 遊んでいる人1人ずつのパソコンやスマホ |
サーバーは、管理者のような人が操作しているわけではありません。Robloxのコンピューターの上で、作ったゲームのスクリプトが動いています。
分かれている理由は2つあります。1つ目は、遊んでいる全員に同じ世界を見せるためです。正しい状態を1か所で持ち、サーバーから全員に届けます。
2つ目は、ずるを防ぐためです。もし、お金を増やす処理をクライアントで自由にいじれたら、誰でも簡単にチートができてしまいます。Robloxの公式の説明でも、ずるをする人は自分の端末の状態と通信を自由に変えられるので、クライアントを信用してはいけないとしています。
そのため、お金を増やすような重要な処理は、クライアントがサーバーに「これをやっていい?」とお願いし、サーバーが確かめてから行います。

お願いを届ける仕組みがRemoteEventで、作り方はRemoteEventの使い方で解説しています。
| よくある混乱 | 答え |
|---|---|
| Scriptはサーバー、LocalScriptはクライアントと決まっている? | LocalScriptはクライアントだけで動きます。Scriptは最初はサーバーで動き、RunContextを変えるとクライアントでも動きます |
| LocalScriptで床の色を変えたのに、ほかの人の画面で変わらない | クライアントで変えた結果はサーバーに伝わらないからです。5節のテストで確かめます |
| ボタンや画面の表示はどちらで作る? | 押されたことを受け取るのも表示を変えるのもLocalScriptです。お金や得点の結果を決めるのはScriptです |
1. 赤い床・青い床・緑の床・門を置く
新しいBaseplateを開きます。エクスプローラの「Workspace」にマウスを乗せて、右に出る「+」を押します。一覧の検索欄に「Part」と入れ、一覧の「Part」を押します。
入ったPartを選んだままF2キーを押し、名前を「ServerPad」に変えます。
エクスプローラでServerPadを選んだ状態で、プロパティの検索欄に「Size」と入力し、Sizeの欄を「8, 1, 8」に変えてEnterキーを押します。同じように、検索欄に「Position」と入力し、「▼CFrame」のすぐ下のPositionの欄を「-10, 0.5, -12」に変えてEnterキーを押します。検索欄に「Color」と入力し、Colorの欄を「255, 0, 0」に変えてEnterキーを押します。最後に検索欄に「Anchored」と入力し、Anchoredの右の四角を押してチェックを入れます。
| プロパティ | 値 |
|---|---|
| Size | 8, 1, 8 |
| Position(▼CFrameのすぐ下) | -10, 0.5, -12 |
| Color | 255, 0, 0 |
| Anchored | チェックを入れる |
次に、残りの5つの部品を複製で作ります。エクスプローラでServerPadを選んだ状態でCtrl + Dキーを押します。同じ場所に複製ができ、エクスプローラでは複製のほうが選ばれた状態になります。
複製を選んだままF2キーを押し、名前を「LocalPad」に変えます。
LocalPadを選んだ状態で、上と同じようにプロパティの検索欄からSize・Position(▼CFrameのすぐ下)・Colorを下の表の値に変え、それぞれEnterキーを押します。AnchoredはServerPadのチェックが入ったまま複製されるので、変えなくて大丈夫です。
残りのKeyPad・Gate・WallLeft・WallRightも、エクスプローラでServerPadを選んでからCtrl + Dキーを押し、同じ手順で名前とプロパティを変えます。
| 名前 | Size | Position(▼CFrameのすぐ下) | Color |
|---|---|---|---|
| LocalPad | 8, 1, 8 | 10, 0.5, -12 | 0, 0, 255 |
| KeyPad | 6, 1, 6 | 0, 0.5, -24 | 0, 200, 80 |
| Gate | 12, 10, 1 | 0, 5, -32 | 163, 162, 165 |
| WallLeft | 20, 10, 1 | -16, 5, -32 | 110, 110, 115 |
| WallRight | 20, 10, 1 | 16, 5, -32 | 110, 110, 115 |
下の画像のように、手前に赤と青の床、その先に緑の床と門が並べば準備は完了です。

2. Scriptで赤い床を黄色にする
エクスプローラのWorkspaceの左の「▼」を押して閉じ、「ServerScriptService」にマウスを乗せて、右に出る「+」を押します(赤い枠)。

一覧の検索欄に「Script」と入れ、一覧の「Script」を押します(赤い枠)。

ServerScriptServiceの中にScriptが入り、スクリプトの画面が開きます。Scriptを選んだまま、プロパティの検索欄に「RunContext」と入力し、「▼動作」の欄のRunContextの右の「▼」を押します。最初は「Legacy」になっていて、Client・Legacy・Plugin・Serverの4つから選べます(赤い枠)。

一覧の「Server」を押して選びます。RunContextは「どこで動かすか」を決める欄で、Serverはサーバーで動かすという意味です。
エクスプローラでScriptを選んだままF2キーを押し、名前を「ServerPadScript」に変えます。下の画像は、RunContextが「Server」になり(赤い枠)、名前を変えているところです。

スクリプトの画面で、中身を全部消して、次のコードを貼り付けます。
-- 置き場所:ServerScriptService の Script(名前は ServerPadScript、RunContext は Server)
-- 赤い床(ServerPad)に誰かが乗ったら、床を黄色にする
-- サーバーで色を変えるので、全員の画面で黄色になる
local Players = game:GetService("Players")
local YELLOW = Color3.fromRGB(255, 220, 0)
local serverPad = workspace:WaitForChild("ServerPad")
serverPad.Touched:Connect(function(hit)
-- もう黄色なら何もしない(出力に同じ行が何回も出ないように)
if serverPad.Color == YELLOW then
return
end
-- 触れた部品の親(キャラクター)から、プレイヤーを探す
local player = Players:GetPlayerFromCharacter(hit.Parent)
if player then
serverPad.Color = YELLOW
print("サーバー:赤い床が黄色になった") -- 名前は出さない(1人のテストではアカウント名になるため)
end
end)

3. LocalScriptで青い床を黄色にする
エクスプローラの「ServerScriptService」の左の「▼」を押して閉じ、エクスプローラを下へスクロールします。「StarterPlayer」の左の「▶」を押して開きます。中の「StarterPlayerScripts」にマウスを乗せて、右に出る「+」を押します(赤い枠)。

一覧の検索欄に「LocalScript」と入れ、一覧の「LocalScript」を押します(赤い枠)。

StarterPlayerScriptsの中にLocalScriptが入ります。LocalScriptを選んだまま、プロパティの検索欄に「RunContext」と入力しても、何も出てきません(赤い枠)。LocalScriptは必ずクライアントで動くので、RunContextの欄がありません。

エクスプローラでLocalScriptを選んだままF2キーを押し、名前を「LocalPadScript」に変えます。スクリプトの画面で、中身を全部消して、次のコードを貼り付けます。
-- 置き場所:StarterPlayer の中の StarterPlayerScripts の LocalScript(名前は LocalPadScript)
-- 青い床(LocalPad)に「自分」が乗ったら、床を黄色にする
-- LocalScript で色を変えるので、黄色になるのは自分の画面だけ
local Players = game:GetService("Players")
local YELLOW = Color3.fromRGB(255, 220, 0)
local localPlayer = Players.LocalPlayer -- このパソコンで遊んでいる人
local localPad = workspace:WaitForChild("LocalPad")
localPad.Touched:Connect(function(hit)
-- もう黄色なら何もしない
if localPad.Color == YELLOW then
return
end
-- ほかの人のアバターが触れたときは何もしない
if hit.Parent == localPlayer.Character then
localPad.Color = YELLOW
print("クライアント:青い床が黄色になった")
end
end)

2つのコードはよく似ていますが、LocalPadScriptではPlayers.LocalPlayer(このパソコンで遊んでいる人)を使って、「自分」が乗ったときだけ色を変えています。LocalPlayerは、サーバーで動くScriptでは使えません。
4. テストで見比べる
3D画面の上の作品のタブ「Place1」を押して3D画面に戻り、F5キーでテストを始めます(タブの名前はパソコンによって違います)。F5キーのテストは、自分1人だけで遊ぶテストです。この記事では「1人のテスト」と呼び、5節からの「2人のテスト」と分けます。
WASDキーでアバターを歩かせ、赤い床と青い床に順に乗ると、両方とも黄色になります(画像の1)。出力の欄には「サーバー:赤い床が黄色になった」と「クライアント:青い床が黄色になった」の2行が出ます(画像の2)。行の右はしの「サーバー」「クライアント」は、その行をどちら側のスクリプトが出したかを表しています。下の画像は、このテスト中の画面です。

ここまでは同じに見えますが、サーバーから見ると違います。テスト中に、画面の左上の赤い四角の停止ボタンのすぐ右にある、画面の形のボタン(クライアント表示の切り替え)を押します(赤い枠)。

サーバーの表示に切りかわり、3D画面のふちが緑になります。3D画面の上のタブは「サーバー」が選ばれた状態になります(赤い枠)。赤い床は黄色ですが、青い床は青のままです(赤い枠)。LocalScriptで変えた色は、自分のパソコンの中だけの変化で、サーバーには伝わっていません。

もう一度同じボタンを押すとクライアントの表示に戻ります。Shift + F5キーでテストを停止します。
5. 2人のテストで見比べる
サーバーに伝わらないということは、ほかの人の画面でも変わらないということです。2人のテストで確かめます。
3D画面の上の作品のタブ「Place1」を押して3D画面に戻ります。画面左上の「テスト」と書かれた欄を押します(画像の1)。出てきた一覧の「サーバーとクライアント」を押します(画像の2)。

欄の表示が「サーバー…」に変わり(画像の1)、右に人の形のアイコンと数字の欄が出ます。最初は「0」です。数字の右の小さな上向きの矢印を2回押して「2」にします(画像の2)。最後に、欄のすぐ右の青い三角の再生ボタンを押します(画像の3)。

2人のテストのやり方はオビーの作り方でも画像付きで解説しています。
Player1とPlayer2の窓が開いたら、Player1の窓の3D画面を1回押してから、WASDキーでPlayer1を歩かせ、赤い床と青い床に乗せます。Player2の窓は何もさわりません。下の画像の左がPlayer1の窓、右がPlayer2の窓です。Player1の画面では両方黄色ですが、Player2の画面では赤い床だけが黄色で、青い床は青のままです。

もとのStudioの窓に戻り、左上の赤い丸に縦の線のボタン(マウスを乗せると「セッションを終了」と出ます)を押してテストを終わります。
6. 自分だけ通れる門を作る
LocalScriptで変えたことはその人の画面だけ、という性質を使うと、「緑の床に乗った人だけ通れる門」が作れます。
エクスプローラの「StarterPlayerScripts」にマウスを乗せて、右に出る「+」を押します。一覧の検索欄に「LocalScript」と入れ、一覧の「LocalScript」を押します。
入ったLocalScriptを選んだままF2キーを押し、名前を「LocalGateScript」に変えます。
スクリプトの画面で、中身を全部消して、次のコードを貼り付けます。
-- 置き場所:StarterPlayerScripts の LocalScript(名前は LocalGateScript)
-- 緑の床(KeyPad)に乗った人だけ、門(Gate)を通り抜けられるようにする
-- 門の見た目と当たり判定を変えるのは、乗った人のパソコンの中だけ
local Players = game:GetService("Players")
local localPlayer = Players.LocalPlayer
local keyPad = workspace:WaitForChild("KeyPad")
local gate = workspace:WaitForChild("Gate")
keyPad.Touched:Connect(function(hit)
if hit.Parent == localPlayer.Character then
gate.Transparency = 0.6 -- 半分すける
gate.CanCollide = false -- 通り抜けられる
end
end)

3D画面の上の作品のタブ「Place1」を押して3D画面に戻ります。画面左上の「テスト」の右の「∨」を押し、一覧の「サーバーとクライアント」を押します。前のテストの設定が残っているので、「サーバー…」と人数「2」のままになっています(違っていたら上と同じように直します)。
青い三角の再生ボタンを押して、2人のテストを始めます。
Player1の窓の3D画面を1回押してから、WASDキーでPlayer1を歩かせ、緑の床に乗せてから門へ歩かせます。
Player2の窓の3D画面を1回押してから、WASDキーでPlayer2を歩かせ、緑の床には乗せずに門へ歩かせます。
下の画像の左のPlayer1の画面では、門が半分すけて、Player1は門を通り抜けて向こう側にいます。右のPlayer2の画面では、門はすけておらず、Player2は門の前で止まっています。Player2の画面では、門の向こうのPlayer1は門に隠れて見えません。

もとのStudioの窓に戻り、左上の赤い丸に縦の線のボタン(マウスを乗せると「セッションを終了」と出ます)を押してテストを終わります。当たり判定(CanCollide)の考え方は当たり判定を消す方法で詳しく解説しています。
7. Player・Character・Humanoidのつながり
LocalScriptでよく使う3つの言葉を、テスト中のエクスプローラで確かめます。
| 言葉 | 意味 | エクスプローラでの場所 |
|---|---|---|
| Player | 遊んでいる人 | Players の中 |
| Character | その人のアバターの体 | Workspace の中(Player と同じ名前) |
| Humanoid | 体力や歩く速さを持つ部品 | Character の中 |
3D画面の上の作品のタブ「Place1」を押して3D画面に戻ります。画面左上の「テスト」の右の「∨」を押し、一覧の「サーバーとクライアント」を押します。前のテストの設定が残っているので、「サーバー…」と人数「2」のままになっています(違っていたら上と同じように直します)。
青い三角の再生ボタンを押して、2人のテストを始めます。
Player1の窓のエクスプローラで、「Workspace」の左の「▶」を押して開きます。続けて「Players」の左の「▶」を押して開きます。Playersの中とWorkspaceの中の両方に「Player1」があります(画像の左)。
Workspaceの中の「Player1」の左の「▶」を押して開くと、中にHumanoidがあります(画像の右)。

3つのつながりを、出力でも確かめます。もとのStudioの窓に戻り、左上の赤い丸に縦の線のボタン(マウスを乗せると「セッションを終了」と出ます)を押してテストを終わります。
エクスプローラの「StarterPlayerScripts」にマウスを乗せて、右に出る「+」を押します。一覧の検索欄に「LocalScript」と入れ、一覧の「LocalScript」を押します。
入ったLocalScriptを選んだままF2キーを押し、名前を「WhoAmI」に変えます。
WhoAmIのスクリプトの画面が開いていなければ、エクスプローラのWhoAmIをダブルクリックして開きます。スクリプトの画面で、中身を全部消して、次のコードを貼り付けます。
-- 置き場所:StarterPlayerScripts の LocalScript(名前は WhoAmI)
-- Player(遊ぶ人)→ Character(アバターの体)→ Humanoid(体力や歩く速さ)のつながりを出力に出す
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local character = player.Character or player.CharacterAdded:Wait() -- 体ができるまで待つ
local humanoid = character:WaitForChild("Humanoid")
print("Player の名前:" .. player.Name)
print("Character の名前:" .. character.Name)
print("体力:" .. humanoid.Health .. " 歩く速さ:" .. humanoid.WalkSpeed)

3D画面の上の作品のタブ「Place1」を押して3D画面に戻ります。画面左上の「テスト」の右の「∨」を押し、一覧の「サーバーとクライアント」を押します。前のテストの設定が残っているので、「サーバー…」と人数「2」のままになっています(違っていたら上と同じように直します)。
青い三角の再生ボタンを押して、もう一度2人のテストを始めます。
Player1の窓の出力には、次のように出ます。2人のテストでは、1人目の名前が「Player1」になります。4節の1人のテスト(F5キー)でこのスクリプトを動かしたときは、「Player1」の所が自分のアカウント名になります。

8. どこに置くと動く?(置き場所の早見表)
同じスクリプトでも、置く場所によって動いたり動かなかったりします。以下は、アソビシフト編集部が7か所に4種類のスクリプトを入れ、1人のテスト(4節と同じF5キーのテスト)でどちらで動いたかを確かめた結果です。
S=サーバーで動いた、C=クライアントで動いた、×=動かなかった、(2回)=同じスクリプトが2回動いた
| 置き場所 | Script(Legacy) | Script(Server) | Script(Client) | LocalScript |
|---|---|---|---|---|
| Workspace | S | S | C | × |
| ServerScriptService | S | S | × | × |
| ReplicatedStorage | × | S | C | × |
| ServerStorage | × | S | × | × |
| StarterGui | S | S(2回) | C(2回) | C |
| StarterPlayerScripts | × | S | C(2回) | C |
| StarterCharacterScripts | S | S(2回) | C(2回) | C |
この表から分かることは3つです。
- LocalScriptは、Workspace・ServerScriptService・ReplicatedStorage・ServerStorageに置いても動きません。「LocalScriptが動かない」ときは、まず置き場所を確かめます
- RunContextをServerにしたScriptは、表の7か所のどこに置いても動きます。Clientにしたものは、ServerScriptServiceとServerStorageでは動きません。どちらも、StarterGuiとStarterCharacterScriptsに置くと、元の場所と遊ぶ人に配られた先の両方で動き、2回動いてしまいます。Clientにしたものは、StarterPlayerScriptsでも2回動きます
- 迷ったら、サーバーで動かすScriptはServerScriptService、LocalScriptはStarterPlayerScriptsに置くのが安心です
どちらを使う?
| やりたいこと | 使うもの |
|---|---|
| 得点を増やす、データを保存する、全員に見える扉を開ける | Script(ServerScriptService) |
| 自分の画面にボタンや文字を出す、カメラを動かす、キー入力を受け取る | LocalScript(StarterPlayerScripts) |
| ボタンを押したらサーバーで何かを起こす | LocalScriptからRemoteEventでScriptへ合図を送る |
LocalScriptで得点を増やしても、自分の画面の中で数字が変わるだけで、ほかの人やサーバーには伝わりません。LocalScriptからサーバーに合図を送る方法はRemoteEventの使い方、得点の保存はDataStoreの使い方で解説しています。
動かないときの直し方
| こまっていること | 見るところ | 直し方 |
|---|---|---|
| LocalScriptを置いたのに何も起きない | 置き場所 | StarterPlayerScripts・StarterGui・StarterCharacterScriptsのどれかに移す |
| 自分の画面では変わったのに、ほかの人の画面で変わらない | スクリプトの種類 | 全員に見せたいことはScriptで変える |
| 同じ出力が2回出る | 置き場所とRunContext | RunContextをServerやClientにしたScriptを「Starter」の入れ物から出す |
| ほかの人が乗っても自分の画面が変わる | 触れた人の確かめ方 | hit.Parent == localPlayer.Characterで自分かどうかを確かめる |
次は、ゲームを抜けても進み具合が残るようにします。次のステップ(中級 2/28)
次に知りたいことを選ぶ
- 次のステップ:ゲームを抜けても進み具合が残るようにします → ロブロックス(Roblox)のDataStoreの使い方
- ボタンからサーバーに合図を送りたい → RemoteEventの使い方
- 抜けても進み具合が残るようにしたい → DataStoreの使い方