「ボタンを押したら扉が開くようにしたい」「RemoteEventって何?なんで必要なの?」
ロブロックス(Roblox)スタジオのRemoteEvent(リモートイベント)の使い方を、実際の画像付きで誰でも簡単に分かるように解説します。この記事では、Eキーを押すと近くの扉が開く仕掛けを作り、遠くから押しても開かないように、サーバーで確かめるところまで進めます。
中級ステップ3/28 前の記事:ロブロックス(Roblox)のDataStoreの使い方 全体の順番を見る
使うもの:Roblox Studioが起動するパソコン、マウス、キーボード。パーツやスクリプトの入れ方はオビーの作り方で画像付きで解説しています。
今回の完成状態:下の画像のように、緑のボタンの近くでEキーを押すと、茶色の扉が半透明になって通れるようになれば成功です。

RemoteEventはなぜ必要?
ロブロックスのゲームは、遊ぶ人それぞれのパソコンやスマホ(クライアント)と、ゲームの正しい状態を持っているロブロックスのコンピューター(サーバー)に分かれて動いています。
| 場所 | 担当すること | 今回の例 |
|---|---|---|
| クライアント | キーやボタンが押されたことを受け取る | Eキーが押された |
| RemoteEvent | クライアントからサーバーへ知らせを届ける | 「押したよ」と伝える |
| サーバー | やってよいかを確かめて、結果を決める | 近くにいるなら扉を開ける |
キーを押したことはクライアントでしか分かりません。一方、扉を開けるのは全員に見える変化なので、サーバーで行う必要があります。この2つをつなぐのがRemoteEventです。
大事なのは、クライアントから届いた知らせを、サーバーがそのまま信じないことです。ずるをする人は、遠くからでも「押したよ」と送れてしまいます。サーバーで距離や状態を確かめれば、そうした操作をかなり防ぎやすくなります。サーバーとクライアントがなぜ分かれているのかは、ローカルスクリプトの記事で図を使って解説しています。
1. ボタンと扉を置く
Studioのホーム画面の左の「テンプレート」から「Baseplate」(赤い枠)を選ぶと、新しいBaseplateが開きます。画像の赤い枠が「次に押す場所」で、画像を押すと大きく表示できます。ボタンの名前や置き場所は、Roblox側の更新で変わることがあります。

新しいBaseplateを開き、エクスプローラの「Workspace」にマウスを乗せて、右に出る「+」(赤い枠)を押してください。

一覧の検索欄に「Part」と入れて、「Part」(赤い枠)を押しましょう。

できたPartをエクスプローラで選んでF2キーを押し、名前を「DoorButton」に変えます(赤い枠)。

続けてDoorButtonを選んだまま、プロパティの検索欄に「Size」と入力し、Sizeの欄を「2, 2, 1」に変えてEnterキーを押します。

DoorButtonを選んだまま、プロパティの検索欄に「Position」と入力します。「Position」はいくつか出てくるので、「▼CFrame」のすぐ下にあるPositionの欄を「6, 1, -14」に変えてEnterキーを押します。

DoorButtonを選んだまま、3D画面上部メニューのホームタブにある「色」ボタン(「素材」の右、「グループ」の左)の右の小さな矢印(画像の1)を押して色の一覧を開き、緑の「Lime green(ライムグリーン)」(画像の2)を選んでください。そのあと「色」ボタンのアイコン本体を押せば、パーツがその色になります。

続けてDoorButtonを選んだまま、同じホームタブの「固定」(赤い枠、「エクスプローラ」ボタンのすぐ左)を押してください。スポーン地点の前に、小さな緑のボタンができます。


エクスプローラでDoorButtonを選んでCtrl+Dキーを押すと、同じものがもう1つできます(赤い枠)。

Ctrl+Dキーのあとは、新しくできた下の方のDoorButtonが選ばれた状態になっています。そのままF2キーを押し、「Door」と入力してEnterキーを押します。
続けてDoorを選んだまま、プロパティの検索欄に「Size」と入力し、Sizeの欄を「8, 10, 1」に変えてEnterキーを押します。

Doorを選んだまま、プロパティの検索欄に「Position」と入力し、「▼CFrame」のすぐ下のPositionの欄を「0, 5, -16」に変えてEnterキーを押します。

最後にDoorを選んだまま、ホームタブの「色」ボタンの右の小さな矢印(画像の1)を押して色の一覧を開き、下の段の茶色「Burnt Sienna(焦げたシエナ)」(画像の2)を選んでから、「色」ボタンのアイコン本体を押します。

これで扉の色は茶色になります。緑のボタンの奥に、背の高い扉が立ちます。下の画像は、ボタンと扉が両方見えるように、カメラを右前から見る向きに動かしています。

| 名前 | 大きさ(Size) | 位置(Position) | 色 |
|---|---|---|---|
| DoorButton | 2, 2, 1 | 6, 1, -14 | Lime green(ライムグリーン) |
| Door | 8, 10, 1 | 0, 5, -16 | 茶(Burnt Sienna) |
2. RemoteEventを入れる
エクスプローラの「ReplicatedStorage」にマウスを乗せて、「+」を押します。ReplicatedStorageは、サーバーとクライアントの両方から見える場所です。

検索欄に「RemoteEvent」と入れて、「RemoteEvent」を押します。

エクスプローラでF2キーを押し、名前を「OpenDoor」に変えます。

3. サーバーのスクリプトを入れる
エクスプローラの「ServerScriptService」にマウスを乗せて、右に出る「+」(赤い枠)を押してください。

一覧の「Script」(赤い枠)を押して入れてください。

エクスプローラにできた「Script」を選んだ状態でF2キーを押し、「DoorServer」と入力してEnterキーを押します。
続けてDoorServerを選んだまま、プロパティの検索欄に「RunContext」と入力し、「▼動作」の欄にあるRunContextの一覧から「Server」を選びます。RunContextは、スクリプトをサーバーとクライアントのどちらで動かすかを決める設定です。

DoorServerのタブで、中身を全部消して、次のコードを貼り付けます。
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local openDoor = ReplicatedStorage:WaitForChild("OpenDoor")
local button = workspace:WaitForChild("DoorButton")
local door = workspace:WaitForChild("Door")
local MAX_DISTANCE = 10 -- ボタンから何スタッド以内なら押せるか
local COOLDOWN = 1 -- 同じ人が続けて押せない秒数
local lastPressed = {} -- 人ごとの、最後に押した時刻
local isOpen = false
openDoor.OnServerEvent:Connect(function(player)
-- 1. 連続で押していないか
local now = os.clock()
if lastPressed[player] and now - lastPressed[player] < COOLDOWN then
return
end
lastPressed[player] = now
-- 2. ボタンの近くにいるか(位置はサーバーが自分で調べる)
local character = player.Character
local root = character and character:FindFirstChild("HumanoidRootPart")
if not root then return end
local distance = (root.Position - button.Position).Magnitude
if distance > MAX_DISTANCE then
print(player.Name, "はボタンから遠いので受け付けません", math.floor(distance))
return
end
-- 3. 扉の状態に合っているか
if isOpen then return end
isOpen = true
door.Transparency = 0.8
door.CanCollide = false
print(player.Name, "が扉を開けました")
end)
game:GetService("Players").PlayerRemoving:Connect(function(player)
lastPressed[player] = nil
end)

このスクリプトは、「押したよ」と届くたびに、次の3つを順番に確かめます。1つでも当てはまらなければ、何もせずに終わります。
| 確かめること | コードの部分 | 理由 |
|---|---|---|
| 連続で押していないか | COOLDOWN(1秒) | 一瞬に何百回も送る操作を防ぐ |
| ボタンの近くにいるか | MAX_DISTANCE(10スタッド) | 遠くから開ける操作を防ぐ。位置はサーバーが自分で調べる |
| 扉はまだ閉まっているか | isOpen | 開いている扉を何度も開けない |
スタッドは、Studioで使う長さの単位です。距離は、アバターの体の中心にある部品「HumanoidRootPart」から、ボタンまでの長さで測っています。
4. クライアントのスクリプトを入れる
エクスプローラの「StarterPlayer」の三角を押して開き、「StarterPlayerScripts」の「+」を押します。

検索欄に「LocalScript」と入れて、「LocalScript」を押します。

エクスプローラにできた「LocalScript」を選んだ状態でF2キーを押し、「DoorClient」と入力してEnterキーを押します。
DoorClientのタブで、中身を全部消して、次のコードを貼り付けます。
local UserInputService = game:GetService("UserInputService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local openDoor = ReplicatedStorage:WaitForChild("OpenDoor")
-- Eキーを押したら「押した」とだけサーバーに伝える
UserInputService.InputBegan:Connect(function(input, processed)
if processed then return end
if input.KeyCode == Enum.KeyCode.E then
openDoor:FireServer()
end
end)

クライアントのコードは、Eキーが押されたことを伝えるだけです。どのプレイヤーが押したかは、RemoteEventが自動でサーバーに伝えてくれるので、名前や位置を送る必要はありません。
5. 遠くと近くで押して確かめる
3D画面の上の作品のタブ「Place1」を押して3D画面に戻り、F5キーでテストを始めます(タブの名前はパソコンによって違います)。スポーン地点の上でEキーを押します。ボタンから離れているので、扉は開かず、出力に「(アカウント名)はボタンから遠いので受け付けません」と出ます(赤い枠)。最後の数字は、ボタンまでの距離です。

Wキーでボタンの近くまで歩き、もう一度Eキーを押します。扉が半透明になり、出力に「(アカウント名)が扉を開けました」と出れば成功です。半透明になった扉は、通り抜けられます。出力の上の行の「受け付けません」は、さきほどスポーン地点の上で押したときの表示です。

6. 2人で、ほかの人にも開いて見えるか確かめる
サーバーで扉を開けたので、ほかの人の画面でも扉が開いているかを、2人のテストで確かめます。
Shift + F5キーでテストを停止します。Studioの窓の左上で、青い再生ボタンの左にある「テスト」の右の「∨」を押し、一覧から「サーバーとクライアント」(赤い枠)を選びます。

人数の上向き三角(画像の1)を押して「2」にし、青い再生ボタン(画像の2)を押してください。

しばらく待つと、元のStudioの窓とは別に、「サーバー」の窓と、Player1・Player2のテストの窓が開きます。テストの窓の右上の一覧では、その窓の人の名前が白く、もう1人の名前は灰色で出ます。これで、どちらがPlayer1の窓かを見分けます。一覧が出ていないときは、窓の3D画面を1回押してからTabキーを押します。
Player1の窓を押して前に出し、Wキーでボタンの近くまで歩いて、Eキーを押します。下の画像は、Player1とPlayer2の窓を左右に並べたものです。左がPlayer1、右がPlayer2の画面です。何もしていないPlayer2の画面でも、扉が開いて見えれば成功です。

確かめたら、元のStudioの窓に戻り、左上の赤い丸の「終了」ボタンを押して2人のテストを閉じます。
よくある間違い
| 間違い | なぜ困るか | 直し方 |
|---|---|---|
| LocalScriptで扉を直接開ける | 自分の画面でしか開かず、ほかの人には閉まって見える | RemoteEventでサーバーに伝えて、サーバーで開ける |
| クライアントから自分の位置を送る | うその位置を送られると、遠くからでも開けられる | 位置はサーバーが自分で調べる |
| クライアントから「コインを100枚ください」と送る | 好きな数を送られてしまう | 何枚もらえるかはサーバーで決める |
| 連打を防がない | 一瞬に何度も処理が走る | 人ごとに最後に押した時刻を覚えて、間をあける |
AIに頼むときの伝え方
RemoteEventを使うコードをAIに頼むときは、サーバーで何を確かめてほしいかを一緒に伝えます。
Roblox Studioで、ボタンの近くにいるプレイヤーだけが扉を開けられる仕掛けを作っています。
入力はLocalScriptで受け取り、RemoteEventでサーバーに伝えます。
サーバー側で、連続で押していないか、ボタンの近くにいるか(位置はサーバーで調べる)、扉の状態を確かめてください。
クライアントから送られた値をそのまま使わない理由も説明してください。
よくある質問
RemoteEventとRemoteFunctionは何が違う?
RemoteEventは知らせを送るだけで、返事を待ちません。RemoteFunctionは、送ったあとに返事が来るまで待ちます。扉を開けるような「やってほしいことを伝えるだけ」の仕掛けは、RemoteEventで十分です。
スマホでも動く?
今回のコードはEキーで動くので、キーボードのないスマホでは押せません。スマホでも遊べるようにするには、画面にボタンを置き、そのボタンが押されたときに同じように「OpenDoor」を送ります。画面のボタンの作り方は、ボタンの作り方で解説しています。
次は、ゲームパスを作って売ります。次のステップ(中級 4/28)
次に知りたいことを選ぶ
- 次のステップ:ゲームパスを作って売ります → ロブロックス(Roblox)のゲームパスの作り方
- スクリプトが思いどおりに動かない → ロブロックス(Roblox)のスクリプトが動かないときの直し方
- ゲームが重くなってきた → ロブロックス(Roblox)のゲームが重いときの直し方