BindableEvent と BindableFunction オブジェクトは、同じサイドのスクリプト間の動作をバインドし、 クライアント-サーバー 境界の適切な結果を伝達し、エクスペリエンス中のアクションに特定の期待される結果を通信します。
バインド可能なイベントの使用ケースは、ラウンドベースの構造を持つエクスペリエンスです。たとえば、「マッチが開始されました」イベントは、他のスクリプトがタイマーを開始し、リーダーボースコアボードを表示するようにします。それに対応する「マッチが終了しました」イベントは、他のスクリプトがプレイヤーをロビーに移動させ、勝者を表示するよ
スクリプト間のアクティビティを調整するために、バインド可能なイベントは通常、サーバーで使用されますが、クライアントでも使用できます。
エクスペリエンスの作動方法に応じて、バインド可能なイベントは、コードをよりモジュール化するために役立つことがありますが、 モジュールスクリプト は、スクリプト間のデータ共有が必要な状況において、より良い代替案です。モジュールスクリプトとバインド可能なイベントを組み合わせて、より清�
バインド可能なイベント
Class.BindableEvent オブジェクトは、スクリプト間の非同期一方通信を通じてカスタムイベントを有効にします。
Class.BindableEvent を発射すると、発射スクリプトは Fire() メソッドを通じて、 生成されません 、およびターゲット機能は、特定の 1>制限1> でパスされた引数を受信します。
Studioの BindableEvent ウィンドウを使用して新しい Class.BindableEvent を作成するには:
- Class.BindableEvent を挿入するコンテナにカーソルを置きます。ServerScriptService を使用することをお勧めします。ReplicatedStorage を使用することをお勧めします。
- コンテナの名前の右に表示される ⊕ ボタンをクリックし、 バインド可能イベント インスタンスを挿入します。
- インスタンスを TestBindableEvent に名前変更します。
Class.BindableEvent を作成した後、Event イベントに関数を接続し、Fire() イベントを別のスクリプトから接続します。
イベント接続
local ServerScriptService = game:GetService("ServerScriptService")
-- バインド可能なイベントインスタンスの参照を取得する
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- 匿名関数をイベントに接続
bindableEvent.Event:Connect(function(data)
print(data) --> ラウンドが開始しました!
end)
イベント発動
local ServerScriptService = game:GetService("ServerScriptService")-- バインド可能なイベントインスタンスの参照を取得するlocal bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- バインド可能なイベントbindableEvent:Fire("Round started!")
カスタムコールバック
Class.BindableFunction オブジェクトは、スクリプト間のシンクロした 2 方通信を可能にします。你可以使用它来定義カスタムコールバック関数並び呼び出す手動で BindableFunction:Invoke() 。コー
Studioの BindableFunction ウィンドウを使用して新しい Class.BindableFunction を作成するには:
- Class.BindableFunction を挿入するコンテナにカーソルを置きます。ServerScriptService を使用することをお勧めします。ReplicatedStorage を使用することをお勧めします。
- コンテナの名前の右に表示される ⊕ ボタンをクリックし、 バインド可能な関数 インスタンスを挿入します。
- インスタンスを TestBindableFunction に名前変更します。
Class.BindableFunction を作成したら、OnInvoke コールバックを 1つのスクリプトで接続し、Invoke() コールバック関数を別のスクリプトから実行できます。
コールバック接続
local ServerScriptService = game:GetService("ServerScriptService")
-- バインド可能な関数の参照を取得する
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- コールバック関数
local function addTwoNumbers(a, b)
return a + b
end
-- 関数をバインド可能な関数のコールバックとして設定
bindableFunction.OnInvoke = addTwoNumbers
イベントの呼び出し
local ServerScriptService = game:GetService("ServerScriptService")-- バインド可能な関数の参照を取得するlocal bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")-- コールバック関数を呼び出し、返された値を出力local sum = bindableFunction:Invoke(2, 4)print(sum) --> 6
引数の制限
Class.BindableEvent を発動するか、BindableFunction を呼び出すと、イベントまたはコールバック関数にパスするすべての引数をフォワードします。 Roblox オブジェクト (Enum 、1>Class.Instance1> な
非ストリングインデックス
パスされたテーブルの任意の インデックス が、Instance 、userdata 、または2> function2> など、非ストリングタイプのインデックスを含む場合、Roblox は自動的にそれらのインデックスを文字列に変換します。
イベント接続
local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEventFire(passedTable)
for k, v in passedTable do
print(typeof(k)) --> 文字列
end
end
-- 機能をイベントに接続
bindableEvent.Event:Connect(onEventFire)
イベント発動
local ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- スペースワークスペースインスタンスをキーとして含む Fire イベントbindableEvent:Fire({[workspace.Baseplate] = true})
テーブルインデックス
データテーブルをパスする場合、混合されたテーブルの数値とストリングキーをパスするのではなく、キーバリューペア (ディクション) または数値インデックス (配列) の完全なテーブルをパスします。
イベント接続
local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEventFire(passedTable)
for k, v in passedTable do
print(k .. " = " .. v)
--> 1 = 剣
--> 2 = 弓
--> CharName = ドィーバドラゴンスレイヤー
--> CharClass = ローグ
end
end
-- 機能をイベントに接続
bindableEvent.Event:Connect(onEventFire)
イベント発動
local ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- 数値でインデックスされたテーブルlocal inventoryData = {"Sword", "Bow"}-- 辞書テーブルlocal characterData = {CharName = "Diva Dragonslayer",CharClass = "Rogue"}-- 一貫してインデックスされたテーブルでイベントを発生させるbindableEvent:Fire(inventoryData)bindableEvent:Fire(characterData)
テーブルの正体
バインド可能なイベントとコールバックに渡されるテーブルは、コピーされ、イベントを発動するときやコールバックを呼び出すときには、それらが正確に同等であることはなくなります。また、 BindableFunction に戻されたテーブルは、コピーされていないので、同等ではありません。これを示すには、次
コールバック接続
local ServerScriptService = game:GetService("ServerScriptService")
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- コールバック関数
local function returnTable(passedTable)
-- 呼び出しのときにテーブルのイденティティを出力
print(tostring(passedTable)) --> テーブル: 0x48eb7aead27563d9
return passedTable
end
-- 関数をバインド可能な関数のコールバックとして設定
bindableFunction.OnInvoke = returnTable
イベントの呼び出し
local ServerScriptService = game:GetService("ServerScriptService")local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")local inventoryData = {"Sword", "Bow"}-- オリジナルのテーブルID を出力します。print(tostring(inventoryData)) --> テーブル: 0x059bcdbb2b576549local invokeReturn = bindableFunction:Invoke(inventoryData)-- 戻りにテーブルのイデンティティを出力print(tostring(invokeReturn)) --> table: 0x9fcae7919563a0e9
メタテーブル
テーブルにメタテーブルがある場合、メタテーブル情報はすべて、NumWheels プロパティが含まれているので、Car メタテーブルに含まれています。次のコードサンプルでは、 NumWheels</
イベント接続
local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEvent(param)
print(param) --> { ["Name"] = "MyTruck"
end
-- 機能をイベントに接続
bindableEvent.Event:Connect(onEvent)
イベント発動
local ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")local Car = {}Car.NumWheels = 4Car.__index = Carlocal truck = {}truck.Name = "MyTruck"setmetatable(truck, Car)-- メタテーブルを含むテーブルでテーブルイベントを発生させるbindableEvent:Fire(truck)