Obiekty Class.BindableEvent i Class.BindableFunction pozwalają ci wiązać zachowania między skryptami na tej samej stronie i na granicy klienta-serwera i komunikować określony pożądany wynik dla działań w trybie wdrożeniowym.
Najczęstszym przypadkiem użycia wiążących wydarzeń jest dla doświadczeń, które mają strukturę opartą na rundach. Na przykład możesz mieć wydarzenie "match started", które umożliwia innym skryptom uruchomienie kalendarza i wyświetlenie tabeli ranking, a następnie "match ended", aby umożliwić innym skryptom znalezienie czasu i wyświetlenie zwycięzców.
Ponieważ koordynują one działania między skryptami, wiążące się wydarzenia są zwykle używane na serwerze, ale możesz je również użyć na klienta.
W zależności od tego, jak Twoja wrażliwość działa, możliwe jest związanie więcej wydarzeń, aby uczynić swój kod bardziej modułowy, ale skrypciki modułowe są często lepszym rozwiązaniem dla sytuacji, w których musisz dzielić się danymi między skryptami. Możesz również używać skrypcików modułowych w połączeniu z modułowymi skryptami dla
Związane wydarzenia
Przedmiot BindableEvent umożliwia wysyłanie niestandardowych wydarzeń poprzez asynchroniczną komunikację jednokierunkową między skryptami.
Gdy wyrzucasz BindableEvent za pośrednictwem metody Fire(), skrypt wyrzucania nie wytwarza wyniku, a funkcja docelowa otrzymuje przekazane argumenty z pewnymi ograniczeniami . Tak jak wszystkie wydarzenia, 1>
Aby utworzyć nowy BindableEvent używając okna Explorer w Studio:
- Przytrzymaj kursor nad kontenerem, do którego chcesz wstawić BindableEvent. Zalecamy używanie ServerScriptService dla komunikacji między serwerowymi skryptami i ReplicatedStorage dla komunikacji między klientami.
- Kliknij przycisk ⊕ , który pojawia się po prawej stronie nazwy kontenera i wpisz instancję BindableEvent .
- Zmień nazwę instancji na TestBindableEvent .
Po utworzeniu BindableEvent połącz funkcję z jej wydarzeniem Event w jednym skrypcie, a następnie Fire() wydarzeniem z innego skrypcu.
Połączenie wątku
local ServerScriptService = game:GetService("ServerScriptService")
-- Zdobądź odniesienie do instancji instancja
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Połącz anonimową funkcję z wydarzeniem
bindableEvent.Event:Connect(function(data)
print(data) -->Runda rozpoczęła się!
end)
Wydarzenie발생
local ServerScriptService = game:GetService("ServerScriptService")-- Zdobądź odniesienie do instancji instancjalocal bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Wydarzenie do wiązaniabindableEvent:Fire("Round started!")
Niestandardowe wezwania
Przedmiot BindableFunction umożliwia synchronizację dwukolorową komunikację między skryptami. Możesz użyć go do zdefiniowania niestandardowej funkcji zwrotu i wywołania jej ręcznie poprzez wezwanie Class.BindableFunction:Execute
Aby utworzyć nowy BindableFunction używając okna Explorer w Studio:
- Przytrzymaj kursor nad kontenerem, do którego chcesz wstawić BindableFunction. Rekomendujemy używanie ServerScriptService dla komunikacji między serwerowymi skryptami i ReplicatedStorage dla komunikacji między klientami.
- Kliknij przycisk ⊕ , który pojawia się po prawej stronie nazwy kontenera i wpisz instancję BindableFunction .
- Zmień nazwę instancji na TestBindableFunction .
Gdy stworzyłeś BindableFunction, możesz połączyć się z jego OnInvoke wezwieć w jednym skrypcie, a następnie Class.BindableFunction:Execute()|Execute() funkcję wezwania z innego skrypcu.
Połączenie zwrotne
local ServerScriptService = game:GetService("ServerScriptService")
-- Zdobądź odniesienie do funkcji wiążącej
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Funkcja zwrotu
local function addTwoNumbers(a, b)
return a + b
end
-- Ustaw funkcję jako wiązaną funkcję
bindableFunction.OnInvoke = addTwoNumbers
Zakup wydarzenia
local ServerScriptService = game:GetService("ServerScriptService")-- Zdobądź odniesienie do funkcji wiążącejlocal bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")-- Przywołaj funkcję zwrotu i wygeneruj wartośćlocal sum = bindableFunction:Invoke(2, 4)print(sum) --> 6
Ograniczenia argumentów
Gdy wyrzucasz BindableEvent lub wzywasz BindableFunction, przekazuje on wszystkie argumenty, które przesłałeś z wydarzenia lub funkcji zwrotnej. Możesz przekazać dowolny typ obiektu Roblox ( Enum, 2>Class.Instance2>, itp.).
Niezależne wskaźniki
Jeśli którekolwiek indeksy tabeli przepustej są nierozdzielane typy, takie jak Instance , userdata lub 1>funkcja1>, Roblox automatycznie konwertuje te indeksy w rzeczywiste struny.
Połączenie wątku
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)
Wydarzenie발생
local ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Wydarzenie ognia z tabelą zawierającą instancję przestrzeni roboczej jako kluczbindableEvent:Fire({[workspace.Baseplate] = true})
Indeksowanie Tabel
Jeśli przeszesz tabelę danych, nie przeszesz mieszaną tabelę kluczy numerowych i literackich. Zamiast tego przeszesz tabelę, która składa się w całości pary kluczowe (słownik) lub w całości kluczowe indeksy (maszyna).
Połączenie wątku
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
--> CharName = Diva Dragonslayer
--> CharClass = Rogue
end
end
-- Połącz funkcję z wydarzeniem
bindableEvent.Event:Connect(onEventFire)
Wydarzenie발생
local ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Liczbowo z索wana tabelalocal inventoryData = {"Sword", "Bow"}-- Tabela słownikalocal characterData = {CharName = "Diva Dragonslayer",CharClass = "Rogue"}-- Wydarzenie ognia z konsekwentnie indeksowanymi tabelamibindableEvent:Fire(inventoryData)bindableEvent:Fire(characterData)
Tożsamość tabeli
Tabely przesłane jako argumenty do wiązalnych wydarzeń i wezwywanych funkcji są kopiowane, co oznacza, że nie będą dokładnie równoważne tym, które są dostarczane podczas uruchamiania wydarzenia lub wzywania funkcji. Nie zostaną również zwrócone tabelki zwrócone do właściwego węzła. Możesz to zobaczyć, wykonując następujący skrypt na Class.Bindable
Połączenie zwrotne
local ServerScriptService = game:GetService("ServerScriptService")
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Funkcja zwrotu
local function returnTable(passedTable)
-- Wyświetl tożsamość tabeli przy wezwaniu
print(tostring(passedTable)) --> tabela: 0x48eb7aead27563d9
return passedTable
end
-- Ustaw funkcję jako wiązaną funkcję
bindableFunction.OnInvoke = returnTable
Zakup wydarzenia
local ServerScriptService = game:GetService("ServerScriptService")local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")local inventoryData = {"Sword", "Bow"}-- Wyświetl oryginalną tożsamość tabeliprint(tostring(inventoryData)) --> tabela: 0x059bcdbb2b576549local invokeReturn = bindableFunction:Invoke(inventoryData)-- Wyświetl tożsamość tabeli przy powrocieprint(tostring(invokeReturn)) --> table: 0x9fcae7919563a0e9
Metatabela
Jeśli tabela ma metabelę, wszystkie informacje o metabeli w przekazie zostaną stracone. W następnym przykładzie kodu właściwość NumWheels jest częścią metabeli Car. Gdy serwer otrzymuje następującą tabelę, właściwość
Połączenie wątku
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)
Wydarzenie발생
local ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")local Car = {}Car.NumWheels = 4Car.__index = Carlocal truck = {}truck.Name = "MyTruck"setmetatable(truck, Car)-- Wydarzenie ognia z tabelą zawierającą metabelębindableEvent:Fire(truck)