🪁

【Roblox】RemoteEventのつくり方

2024/02/27に公開

はじめに

こんにちは、まつさこ です。

今回は、RobloxでRemoteEventを使ってローカルスクリプトとサーバースクリプト間でデータを送受信する方法について解説します。

スクリプトの種類について

Robloxには、スクリプトの種類として以下の3つがあります。

  • LocalScript
  • Script
  • ModuleScript

今回、RemoteEventを使ってデータを送受信する際の登場人物は、LocalScriptとScriptです。

LocalScript

LocalScriptは、クライアント側で実行されるスクリプトです。例えば、プレイヤーが操作するキャラクターの動作や、UIの操作などに利用されます。
LocalScriptは、StarterPlayerStarterPlayerScripts 内に配置することで、ゲームが開始されたときに自動的に実行されます。

Script

Scriptは、サーバー側で実行されるスクリプトです。例えば、すべてのプレイヤーに共通のゲームの進行に関わる処理や、データの保存、 workspace 内のオブジェクトの操作などに利用されます。
Scriptは、ServerScriptService 内に配置することで、ゲームが開始されたときに自動的に実行されます。
また、 workspace 内のオブジェクトに配置することで、そのオブジェクトが生成されたときに自動的に実行されます。

ModuleScript

ModuleScriptは、関数や変数を定義するためのスクリプトです。例えば、複数のスクリプトで共通の関数や変数を利用する場合に利用されます。今回は使用しないので、詳細は割愛します。

RemoteEventの概要とつくり方

RemoteEventは、クライアント側のLocalScriptとサーバー側のScript間でデータを送受信するための機能です。例えば、プレイヤーがゲーム内でアイテムを取得したときに、その情報をサーバーに送信する場合などに利用されます。

RemoteEventは、ReplicatedStorage内に配置することで、クライアント側とサーバー側の両方からアクセスすることができます。中身に何か実装が必要というわけではなく、クライアント側とサーバー側でデータをやり取りするときの「箱」のようなものだと思ってください。

ReplicatedStorageにマウスを合わせて「+」をクリックし、RemoteEventを選択します。

RemoteEventは、役割や、送受信するスクリプトに応じて、それぞれ作成して名前を変えてください。

RemoteEventを使ってデータを送受信する

まず最初の注意点として、RemoteEvent利用は サーバー→クライアントクライアント→サーバー の2つの方向それぞれで、書き方が変わります。
この時「サーバー」はScript、「クライアント」はLocalScriptを指します。

詳細は公式ドキュメントも参考にしてみて下さい。

それぞれでの書き方を見ていきましょう。

サーバー→クライアント

サーバー→クライアントの場合、サーバー側のScriptでRemoteEventを発火させます。
送信するクライアントを指定することもできますし、全クライアントに送信することもできます。

■ サーバー側(Script)

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:WaitForChild("RemoteEvent")
local player = game.Players:GetPlayers()[0] -- 送信するプレイヤーを指定(今回は1番目のプレイヤー)

remoteEvent:FireAllClients(data) -- 全クライアントに送信
remoteEvent:FireClient(player, data) -- 特定のクライアントに送信

そしてクライアント側のLocalScriptでRemoteEventを受信します。
受信するplayerは暗黙的に分かっている(サーバー側で指定したプレイヤーにしかそもそもRemoteEventが飛ばない)ので、 FireClient した際の第二引数の data だけが、第一引数として受信されます。

■ クライアント側(LocalScript)

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:WaitForChild("RemoteEvent")

remoteEvent.OnClientEvent:Connect(function(data)
    -- ここにRemoteEventを受信したときの処理を書く
end)

クライアント→サーバー

クライアント→サーバーの場合、クライアント側のLocalScriptでRemoteEventを発火させます。

■ クライアント側(LocalScript)

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:WaitForChild("RemoteEvent")

remoteEvent:FireServer(data)

そしてサーバー側のScriptでRemoteEventを受信します。
サーバー→クライアントの時とは逆で、受信するサーバー側はどのプレイヤーからの送信かを識別するために、 player が第一引数に渡され、第二引数に data が渡されます。
これにより、例えばあるプレイヤーがアイテムを取得したときに、そのプレイヤーについてのみ体力やスコアを更新するなどの処理を書くことができます。

■ サーバー側(Script)

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:WaitForChild("RemoteEvent")

remoteEvent.OnServerEvent:Connect(function(player, data)
    -- ここにRemoteEventを受信したときの処理を書く
end)

まとめ

今回は、RobloxでRemoteEventを使ってローカルスクリプトとサーバースクリプト間でデータを送受信する方法について解説しました。
Roblox開発をするうえでRemoteEventは必須の機能なので、ぜひ使いこなせるようになってください!

読んでくださりありがとうございました🤗

moze テックブログ

Discussion