Événements et rappels liés bindables

*Ce contenu est traduit en utilisant l'IA (Beta) et peut contenir des erreurs. Pour consulter cette page en anglais, clique ici.

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 :

  1. 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.
  2. Cliquez sur le bouton qui apparaît à droite du nom du conteneur et insérez une instance d'événement liable .
  3. 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 liable
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Événement pouvant être lié au feu
bindableEvent: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 :

  1. 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.
  2. Cliquez sur le bouton qui apparaît à droite du nom du conteneur et insérez une instance Fonction récupérable .
  3. 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 bindable
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Invocation de la fonction de rappel et de la valeur de sortie retournée
local 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ée
local inventoryData = {
"Sword", "Bow"
}
-- Tableau de dictionnaire
local characterData = {
CharName = "Diva Dragonslayer",
CharClass = "Rogue"
}
-- Événement de feu avec des tables indexées de manière cohérente
bindableEvent: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 sortie
print(tostring(inventoryData)) --> table : 0x059bcdbb2b576549
local invokeReturn = bindableFunction:Invoke(inventoryData)
-- Identité de table de sortie lors du renvoyer
print(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 = 4
Car.__index = Car
local truck = {}
truck.Name = "MyTruck"
setmetatable(truck, Car)
-- Événement de feu avec table incluant une métatable
bindableEvent:Fire(truck)