イベントは、ゲーム内で発生し、リスンして反応することができる現象です。多くのRobloxサービスおよびオブジェクトには、特定のアクションや変更に応じて自動的に発生する組み込みイベントがあります。
たとえば、プレイヤーの Character が BasePart に触れると、Touched イベントが自動的に発生します。プレイヤーがゲームに参加するたびに、Players.PlayerAdded イベントが発生します。
イベントの数が非常に多く、クライアント-サーバーアーキテクチャを考慮すると、Robloxスクリプティングはしばしばイベント駆動型と呼ばれます。このアプローチは、多くの他のゲームエンジンとは異なり、フレームごとにコードを実行することを重視しています。
イベントをリスンしたり、イベントに応じて何か行動を起こしたりする必要はありませんが、イベントは発生し、利用可能です。しかし、イベントに応答する必要がある場合は、関数を接続します。
イベントに関数を接続する
Connect() を使用してイベントに関数を接続し、イベントが発生するたびにコードを実行します。ほとんどのイベントは、それに接続された関数に引数を渡します。たとえば、BasePart.Touched イベントは、部品に触れたオブジェクト(左手や車の車輪など)を渡し、Players.PlayerAdded イベントは、あなたのゲームに参加した Player を渡します。
次のコードサンプルは、Touched イベントに onPartTouched() という関数を接続する方法を示しています。
-- スクリプトが部品に親付けされていることを前提としています
local part = script.Parent
-- 実行したい関数
local function onPartTouched(object)
print("Partが", object:GetFullName(), "によって触れられました")
end
-- 部品のTouchedイベントに関数を接続
part.Touched:Connect(onPartTouched)
変数を親スコープから使用したい場合や、関数を他で使用する必要がない場合は、匿名関数をイベントに接続することもできます。たとえば、このコードサンプルは、サービスの類似サンプルから不格好な中間関数を省略しています。
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SaveManager = require(ReplicatedStorage:WaitForChild("SaveManager"))
local function saveProgress(character)
local position = character:FindFirstChild("HumanoidRootPart").Position
SaveManager.saveData(character, position)
end
-- プレイヤーがゲームから離れたときにsaveProgress()を呼び出す匿名関数
Players.PlayerAdded:Connect(function(player)
player.CharacterRemoving:Connect(saveProgress)
end)
イベントから関数を切断する
Connect() メソッドは、RBXScriptConnection オブジェクトを返します。イベントに関数を接続したが、次回のイベント発生時にその関数を呼び出したくない場合(たとえば、特定の条件が満たされた場合など)は、Disconnect() を RBXScriptConnection オブジェクトで呼び出して切断します。
次のコードサンプルは、Part.Touched イベントに対して関数を接続および切断する方法を示しています。
local Workspace = game:GetService("Workspace")
local part = Workspace.Part
local targetPart = Workspace.TargetPart
-- 接続用の空のプレースホルダ変数を宣言
local connection
local function onPartTouched(otherPart)
if otherPart == targetPart then
print("その部品がターゲットに当たりました!")
-- 接続を切断
connection:Disconnect()
end
end
-- 上記の関数をTouchedイベントに接続
connection = part.Touched:Connect(onPartTouched)
イベントが発生するのを待つ
特定のイベントが発生するまでスクリプトを待機させたい場合は、Wait() メソッドを使用します。このメソッドは、イベントの引数を返し、後で使用するために変数に割り当てることができます。
local Workspace = game:GetService("Workspace")local part = Workspace.Partlocal touchedPart = part.Touched:Wait()print("その部品は", touchedPart:GetFullName(), "によって触れられました")
その他のタイプのイベント
バインド可能イベントは、クライアント-サーバー境界の同じ側のスクリプト間で通信することを可能にします。
リモートイベントは、クライアント-サーバー境界を越えて通信することを可能にします。
遅延エンジンイベントは、特定の再開ポイントまでイベントハンドラーを遅延させます。