ロブロックス(Roblox)スタジオのローカルスクリプトとは|Scriptとの違い・置き場所・RunContextを実際の画面で解説

制作手順難易度: 中級所要時間: 約40分(目安)情報確認日: 2026年10月23日

「LocalScriptとScriptは何が違うの?」「LocalScriptを置いたのに動かない」「自分の画面だけ色を変えたい」

ロブロックス(Roblox)スタジオのローカルスクリプト(LocalScript)とScriptの違いを、実際の画像付きで誰でも簡単に分かるように解説します。赤い床と青い床を並べ、色を変える2つのスクリプトを作って、1人のテストと2人のテストで見比べます。

中級ステップ1/28 前の記事:ロブロックス(Roblox)スタジオで共同作業するやり方 全体の順番を見る

使うもの:Roblox Studioが起動するパソコン、マウス、キーボード。Scriptの入れ方と貼り付け方はスクリプトの作り方で解説しています。

先に答え:LocalScriptは遊んでいる人のパソコン(クライアント)だけで動き、変えた結果はその人の画面にしか出ません。全員に同じ変化を見せたいときは、サーバーで動くScriptを使います。

RunContextは、Scriptを「どこで動かすか」を決めるプロパティです。

Script(RunContext Server)LocalScript
動く場所サーバー(ゲームの正しい状態を持っているRobloxのコンピューター)遊んでいる人のパソコン(クライアント)
変えた結果が見える人全員その人だけ
よく置く場所ServerScriptServiceStarterPlayerScripts
使う場面得点・保存・全員に関わる仕掛け画面の表示・カメラ・キー入力

サーバーとクライアントはなぜ分かれているの?

ロブロックスのゲームは、サーバーとクライアントの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の右の四角を押してチェックを入れます。

プロパティ値
Size8, 1, 8
Position(▼CFrameのすぐ下)-10, 0.5, -12
Color255, 0, 0
Anchoredチェックを入れる

次に、残りの5つの部品を複製で作ります。エクスプローラでServerPadを選んだ状態でCtrl + Dキーを押します。同じ場所に複製ができ、エクスプローラでは複製のほうが選ばれた状態になります。

複製を選んだままF2キーを押し、名前を「LocalPad」に変えます。

LocalPadを選んだ状態で、上と同じようにプロパティの検索欄からSize・Position(▼CFrameのすぐ下)・Colorを下の表の値に変え、それぞれEnterキーを押します。AnchoredはServerPadのチェックが入ったまま複製されるので、変えなくて大丈夫です。

残りのKeyPad・Gate・WallLeft・WallRightも、エクスプローラでServerPadを選んでからCtrl + Dキーを押し、同じ手順で名前とプロパティを変えます。

名前SizePosition(▼CFrameのすぐ下)Color
LocalPad8, 1, 810, 0.5, -120, 0, 255
KeyPad6, 1, 60, 0.5, -240, 200, 80
Gate12, 10, 10, 5, -32163, 162, 165
WallLeft20, 10, 1-16, 5, -32110, 110, 115
WallRight20, 10, 116, 5, -32110, 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
WorkspaceSSC×
ServerScriptServiceSS××
ReplicatedStorage×SC×
ServerStorage×S××
StarterGuiSS(2回)C(2回)C
StarterPlayerScripts×SC(2回)C
StarterCharacterScriptsSS(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回出る置き場所とRunContextRunContextをServerやClientにしたScriptを「Starter」の入れ物から出す
ほかの人が乗っても自分の画面が変わる触れた人の確かめ方hit.Parent == localPlayer.Characterで自分かどうかを確かめる

次のステップ(中級 2/28)

次は、ゲームを抜けても進み具合が残るようにします。

→ ロブロックス(Roblox)のDataStoreの使い方

次に知りたいことを選ぶ

次に読む記事