Wiązalne wydarzenia i powiadomienia

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

BindableEvent i BindableFunction obiekty pozwalają wiązać zachowania między skryptami na tej samej stronie granicy klient-serwer, a komunikować określony pożądany wynik dla działań w doświadczeniu.

Najczęstszym przypadkiem użycia dla zdarzeń wiązanych jest sytuacja, w której doświadczenia mają strukturę opartą na rundach.Na przykład możesz mieć wydarzenie "match started", które pozwala innym skryptom uruchomić rankingi wyświetlać tabelę wyników, z odpowiednim wydarzeniem "match ended", które pozwala innym skryptom wiedzieć, kiedy przenieść graczy z powrotem do lobby i wyświetlać zwycięzców.

Ponieważ koordynują działania między skryptami, bindowane wydarzenia są zwykle używane na serwerze, ale możesz ich używać również na klientzie.

W zależności od tego, jak działa twoje doświadczenie, wiązane wydarzenia mogą pomóc uczynić twój kod bardziej modularnym, ale skrypty modułów są często lepszą alternatywą dla sytuacji, w których musisz udostępniać dane między skryptami.Możesz również używać wiązanych wydarzeń w połączeniu z kodami modułów do bardziej czystej syntezy, jak to zauważono w niestandardowych wydarzeniach.

Wiązalne wydarzenia

Przedmiot BindableEvent umożliwia niestandardowe zdarzenia poprzez asynchroniczną, jednostronną komunikację między skryptami.

Kiedy wystrzelasz poprzez metodę , skrypt strzelania nie nie wygeneruje, a funkcja docelowa otrzymuje przekazane argumenty z pewnymi ograniczeniami .Podobnie jak wszystkie wydarzenia, BindableEvents tworzy wątki każdej połączonej funkcji, więc nawet jeśli jedna wystąpi błąd, inne kontynuują.

Aby utworzyć nowy BindableEvent korzystając z okna Explorer w Studio:

  1. Najedź na pojemnik, do którego chcesz wstawić BindableEvent.Polecamy użycie ServerScriptService do komunikacji między skryptami serwerowymi i ReplicatedStorage do komunikacji między skryptami klienta.
  2. Kliknij przycisk , który pojawia się po prawej stronie nazwy kontenera, i wstaw instancję Wiązalnego instancja.
  3. Zmień nazwę instancji na TestBindableEvent.

Po utworzeniu BindableEvent połącz funkcję z jej wydarzeniem Event w jednym skrypcie, a następnie Fire() wydarzenie z innego skryptu.

Połączenie z wydarzeniem

local ServerScriptService = game:GetService("ServerScriptService")
-- Zdobądź odniesienie do instancji zdarzenia do instancja
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Połącz anonimową funkcję z wydarzeniem
bindableEvent.Event:Connect(function(data)
print(data) --> Runda rozpoczęta!
end)
Strzelanie zdarzeń

local ServerScriptService = game:GetService("ServerScriptService")
-- Zdobądź odniesienie do instancji zdarzenia do instancja
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Wyzwól zdarzenie wiązane z ogniem
bindableEvent:Fire("Round started!")

Niestandardowe wezwania zwrotne

Obiekt BindableFunction umożliwia synchroniczną, dwukierunkową komunikację między skryptami.Możesz go użyć do określenia niestandardowej funkcji powrotnej i uruchomić ją ręcznie, wywołując BindableFunction:Invoke().Kod wywołujący funkcję wyświetla do czasu znalezienia odpowiedniego powrotu, a powrót otrzymuje argumenty, które przekazałeś do Invoke().Jeśli wezwanie nie zostało nigdy ustawiać, skrypt, który je wywołuje, nie wznowi wykonania.

Aby utworzyć nowy BindableFunction korzystając z okna Explorer w Studio:

  1. Najedź na pojemnik, do którego chcesz wstawić BindableFunction.Polecamy użycie ServerScriptService do komunikacji między skryptami serwerowymi i ReplicatedStorage do komunikacji między skryptami klienta.
  2. Kliknij przycisk , który pojawia się po prawej stronie nazwy kontenera, i wstaw instancję instancjaprzypisywalna.
  3. Zmień nazwę instancji na TestBindableFunction.

Po utworzeniu BindableFunction możesz połączyć się z jego funkcją powrotną OnInvoke w jednym skrypcie, a następnie Invoke() funkcją powrotną z innego skryptu.

Połączenie powrotne

local ServerScriptService = game:GetService("ServerScriptService")
-- Zdobądź odniesienie do funkcji przypisywalnej
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Funkcja powrotu
local function addTwoNumbers(a, b)
return a + b
end
-- Ustaw funkcję jako powrót funkcji wiązalnej
bindableFunction.OnInvoke = addTwoNumbers
Zaproszenie do wydarzenia

local ServerScriptService = game:GetService("ServerScriptService")
-- Zdobądź odniesienie do funkcji przypisywalnej
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Wezwij funkcję powrotną i wyświetl wartość zwróconą
local sum = bindableFunction:Invoke(2, 4)
print(sum) --> 6

Ograniczenia argumentów

Kiedy wystrzelasz BindableEvent lub wzywasz BindableFunction, przekazujesz wszystkie argumenty, które przekazujesz z wydarzeniem lub do funkcji powrotu.Możesz przekazać dowolny typ obiektu Roblox (Enum , Instance , itp.), a także typy Luau takie jak liczby, ciągi i booliany, choć powinieneś uważnie rozważyć następujące ograniczenia.

Nie stringowe indeksy

Jeśli którekolwiek indeksy z przekazanego stołu są typami nietekstowymi, takimi jak Instance , dane użytkownika lub funkcja, Roblox automatycznie konwertuje te indeksy na struny.

Połączenie z wydarzeniem

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEventFire(passedTable)
for k, v in passedTable do
print(typeof(k)) --> ciąg
end
end
-- Połącz funkcję z wydarzeniem
bindableEvent.Event:Connect(onEventFire)
Strzelanie zdarzeń

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Wydarzenie ognia z tabelą zawierającą instancję przestrzeni roboczej jako klucz
bindableEvent:Fire({
[workspace.Baseplate] = true
})

Indeksowanie tabel

Jeśli przekazujesz tabelę danych, nie przekazuj mieszanej tabeli liczbowych i kluczy tekstowych.Zamiast tego przekaż tabelę, która składa się w całości z par klucz-wartość (słownik) lub w całości z indeksów liczbowych (matryca).

Połączenie z wydarzeniem

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEventFire(passedTable)
for k, v in passedTable do
print(k .. " = " .. v)
--> 1 = Miecz
--> 2 = Łuk
--> Nazwa postaci = Diva Dragonslayer
--> CharClass = Szkodnik
end
end
-- Połącz funkcję z wydarzeniem
bindableEvent.Event:Connect(onEventFire)
Strzelanie zdarzeń

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Tablica numerowo indeksowana
local inventoryData = {
"Sword", "Bow"
}
-- Tabela słownika
local characterData = {
CharName = "Diva Dragonslayer",
CharClass = "Rogue"
}
-- Wydarzenie ognia z konsekwentnie indeksowanymi tablicami
bindableEvent:Fire(inventoryData)
bindableEvent:Fire(characterData)

Tożsamości tabel

Tabele przekazywane jako argumenty do wiązanych wydarzeń i powrotów są kopiowane, co oznacza, że nie będą dokładnie równoważne tym dostarczonym podczas uruchamiania wydarzenia lub wzywania powrotu.Nie będą również tabele zwracane do invokera dokładnie odpowiadały tym dostarczonym.Możesz to pokazać, uruchamiając następujący skrypt na BindableFunction i obserwując, jak różnią się identyfikatory tabeli.

Połączenie powrotne

local ServerScriptService = game:GetService("ServerScriptService")
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Funkcja powrotu
local function returnTable(passedTable)
-- Wyświetlanie tożsamości tablicy wyników przy wezwaniu
print(tostring(passedTable)) --> stół: 0x48eb7aead27563d9
return passedTable
end
-- Ustaw funkcję jako powrót funkcji wiązalnej
bindableFunction.OnInvoke = returnTable
Zaproszenie do wydarzenia

local ServerScriptService = game:GetService("ServerScriptService")
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
local inventoryData = {
"Sword", "Bow"
}
-- Wyświetl oryginalną tożsamość tablicy
print(tostring(inventoryData)) --> stół: 0x059bcdbb2b576549
local invokeReturn = bindableFunction:Invoke(inventoryData)
-- Wyświetlanie tożsamości tabeli po powrocie
print(tostring(invokeReturn)) --> table: 0x9fcae7919563a0e9

Metatabelki

Jeśli stół ma metatable, wszystkie informacje metatable są utracone w transferze.W następnym przykładzie kodu właściwość NumWheels jest częścią Car metatable.Kiedy serwer otrzymuje poniższą tabelę, tabela ma właściwość , ale nie ma właściwości .

Połączenie z wydarzeniem

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEvent(param)
print(param) --> { ["Nazwa"] = "MyTruck"}
end
-- Połącz funkcję z wydarzeniem
bindableEvent.Event:Connect(onEvent)
Strzelanie zdarzeń

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)
-- Wydarzenie ognia z tabelą, w której znajduje się metabela
bindableEvent:Fire(truck)