BindableEvent et BindableFunction objets vous permettent de lier des comportements entre les scripts du même côté de la frontière client-serveur et de communiquer un résultat souhaité spécifique pour les actions en expérience.
Le cas d'utilisation le plus courant pour les événements liés est pour les expériences qui ont une structure en plusieurs manches.Par exemple, vous pouvez avoir un événement « correspondance commencée » qui permet à d'autres scripts de démarrer une minuterie et d'afficher un classements, avec un événement correspondant « correspondance terminée » qui permet à d'autres scripts de savoir quand retourner les joueurs dans un lobby et afficher les gagnants.
Comme ils coordonnent les activités entre les scripts, les événements bindables sont généralement utilisés sur le serveur, mais vous pouvez les utiliser sur le client aussi.
En fonction de la façon dont votre expérience fonctionne, les événements liés peuvent aider à rendre votre code plus modulaire, mais les scripts de module sont souvent une meilleure alternative pour les situations dans lesquelles vous devez partager des données entre les scripts.Vous pouvez également utiliser des événements bindables en conjonction avec les scripts de module pour une syntaxe plus propre, comme indiqué dans événements personnalisés.
Événements liés bindables
L'objet BindableEvent permet des événements personnalisés grâce à une communication asynchrone et unilatérale entre les scripts.
Lorsque vous tirez un via la méthode , le script de tir ne produit pas de résultat, et la fonction cible reçoit les arguments passés avec certaines limites .Comme tous les événements, BindableEvents crée des fils de chaque fonction connectée, donc même si un erreur se produit, d'autres se poursuivent.
Pour créer un nouveau BindableEvent à l'aide de la fenêtre Explorateur dans Studio :
- Passez la souris sur le conteneur dans lequel vous voulez insérer le BindableEvent .Nous recommandons d'utiliser ServerScriptService pour la communication entre les scripts du serveur et ReplicatedStorage pour la communication entre les scripts du client.
- Cliquez sur le bouton ⊕ qui apparaît à droite du nom du conteneur et insérez une instance d'événement liable .
- Renommez l'instance à TestBindableEvent.
Après avoir créé un BindableEvent, connectez une fonction à son événement Event dans un script, puis Fire() l'événement d'un autre script.
Connexion d'événement
local ServerScriptService = game:GetService("ServerScriptService")
-- Obtenir une référence à l'instance d'événement liable
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Relier la fonction anonyme à l'événement
bindableEvent.Event:Connect(function(data)
print(data) --> Manche commencée !
end)
Tir d'événement
local ServerScriptService = game:GetService("ServerScriptService")-- Obtenir une référence à l'instance d'événement liablelocal bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Événement pouvant être lié au feubindableEvent:Fire("Round started!")
Appels personnalisés
L'objet BindableFunction permet une communication synchronisée en deux sens entre les scripts.Vous pouvez l'utiliser pour définir une fonction de rappel personnalisée et l'invoquer manuellement en appelant BindableFunction:Invoke() .Le code invoquant la fonction produit jusqu'à ce que le rappel correspondant soit trouvé et que le rappel reçoive les arguments que vous avez transmis à Invoke().Si le rappel n'a jamais été configurer, le script qui l'invoque ne reprend pas l'exécution.
Pour créer un nouveau BindableFunction à l'aide de la fenêtre Explorateur dans Studio :
- Passez la souris sur le conteneur dans lequel vous voulez insérer le BindableFunction .Nous recommandons d'utiliser ServerScriptService pour la communication entre les scripts du serveur et ReplicatedStorage pour la communication entre les scripts du client.
- Cliquez sur le bouton ⊕ qui apparaît à droite du nom du conteneur et insérez une instance Fonction récupérable .
- Renommez l'instance à TestBindableFunction.
Une fois que vous avez créé un BindableFunction , vous pouvez vous connecter à son rappel OnInvoke dans un script, puis Invoke() la fonction de rappel d'un autre script.
Connexion de rappel
local ServerScriptService = game:GetService("ServerScriptService")
-- Obtenir une référence à la fonction bindable
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Fonction de rappel
local function addTwoNumbers(a, b)
return a + b
end
-- Définir la fonction comme rappel de fonction bindable
bindableFunction.OnInvoke = addTwoNumbers
Invocation d'événement
local ServerScriptService = game:GetService("ServerScriptService")-- Obtenir une référence à la fonction bindablelocal bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")-- Invocation de la fonction de rappel et de la valeur de sortie retournéelocal sum = bindableFunction:Invoke(2, 4)print(sum) --> 6
Limites d'argumentation
Lorsque vous tirez un BindableEvent ou que vous invoquez un BindableFunction, il transmet tous les arguments que vous passez avec l'événement ou à la fonction de rappel.Vous pouvez passer n'importe quel type d'objet Roblox (Enum , Instance , etc.), ainsi que des types Luau comme des nombres, des chaînes et des booléens, bien que vous deviez examiner attentivement les limites suivantes.
Index non-texte
Si aucun indice d'une table passée n'est de type chaîne, comme un Instance, données utilisateur, ou fonction, Roblox convertit automatiquement ces index en chaîne.
Connexion d'événement
local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEventFire(passedTable)
for k, v in passedTable do
print(typeof(k)) --> chaîne
end
end
-- Fonction de connexion à l'événement
bindableEvent.Event:Connect(onEventFire)
Tir d'événement
local ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Événement de feu avec table contenant une instance d'espace de travail comme clébindableEvent:Fire({[workspace.Baseplate] = true})
Indexation de table
Si vous passez une table de données, ne passez pas une table mixte de clés numériques et de chaînes.Au lieu de cela, passez une table qui se compose entièrement de paires clé-valeur (un dictionnaire) ou entièrement d'index numériques (un matrice).
Connexion d'événement
local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEventFire(passedTable)
for k, v in passedTable do
print(k .. " = " .. v)
--> 1 = Épée
--> 2 = Arc
--> CharName = Diviseur de dragons Diva
--> CharClass = Voleur
end
end
-- Fonction de connexion à l'événement
bindableEvent.Event:Connect(onEventFire)
Tir d'événement
local ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Table numérotée indexéelocal inventoryData = {"Sword", "Bow"}-- Tableau de dictionnairelocal characterData = {CharName = "Diva Dragonslayer",CharClass = "Rogue"}-- Événement de feu avec des tables indexées de manière cohérentebindableEvent:Fire(inventoryData)bindableEvent:Fire(characterData)
Identités de table
Les tables transmises en tant qu'arguments pour les événements et les rappels liables sont copiées, ce qui signifie qu'elles ne seront pas exactement équivalentes à celles fournies lors du tir de l'événement ou de l'invocation du rappel.Les tables retournées à l'invocateur ne seront pas exactement équivalentes à celles fournies.Vous pouvez le démontrer en exécutant le script suivant sur un BindableFunction et en observant comment les identités de table diffèrent.
Connexion de rappel
local ServerScriptService = game:GetService("ServerScriptService")
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Fonction de rappel
local function returnTable(passedTable)
-- Identité de table de sortie lors de l'invocation
print(tostring(passedTable)) --> table : 0x48eb7aead27563d9
return passedTable
end
-- Définir la fonction comme rappel de fonction bindable
bindableFunction.OnInvoke = returnTable
Invocation d'événement
local ServerScriptService = game:GetService("ServerScriptService")local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")local inventoryData = {"Sword", "Bow"}-- Identité de table d'origine de sortieprint(tostring(inventoryData)) --> table : 0x059bcdbb2b576549local invokeReturn = bindableFunction:Invoke(inventoryData)-- Identité de table de sortie lors du renvoyerprint(tostring(invokeReturn)) --> table: 0x9fcae7919563a0e9
Tableaux métriques
Si une table a un métadonnées, toutes les informations métadonnées sont perdues lors de la transmission.Dans l'exemple de code suivant, la propriété NumWheels fait partie du Car métatable.Lorsque le serveur reçoit la table suivante, la table a la propriété mais pas la propriété .
Connexion d'événement
local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEvent(param)
print(param) --> {["Nom"] = "MyTruck()}
end
-- Fonction de connexion à l'événement
bindableEvent.Event:Connect(onEvent)
Tir d'événement
local ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")local Car = {}Car.NumWheels = 4Car.__index = Carlocal truck = {}truck.Name = "MyTruck"setmetatable(truck, Car)-- Événement de feu avec table incluant une métatablebindableEvent:Fire(truck)