BindableEvent ve BindableFunction nesneleri, aynı tarafındaki betikler arasında davranışları bağlamanıza bir isteğe bağlı sonuç iletişimi sağlamanıza olanak tanır. istemci-sunucu sınırı.
Bağlanabilir olayların en yaygın kullanım durumu, tur bazlı bir yapıya sahip oyunlar içindir. Örneğin, diğer betiklerin bir zamanlayıcı başlatmasına ve bir liderlik tablası görüntülemesine izin veren "maç başladı" olayı ve oyuncuları bir lobide geri alması ve kazananları göstermesi gereken diğer betiklere bilgi veren "maç bitti" olayı oluşturabilirsiniz.
Betikler arasında etkinlikleri koordine ettikleri için, bağlanabilir olaylar genellikle sunucuda kullanılır, ancak istemcide de kullanabilirsiniz.
Oyununuzun nasıl çalıştığına bağlı olarak, bağlanabilir olaylar kodunuzu daha modüler hale getirebilir, ancak modül betikleri genellikle betikler arasında veri paylaşmanız gereken durumlar için daha iyi bir alternatif olabilir. Ayrıca, daha temiz bir sözdizimi için, Özel olaylar bölümünde belirtildiği gibi, modül betikleriyle birlikte bağlanabilir olayları da kullanabilirsiniz.
Bağlanabilir olaylar
BindableEvent nesnesi, betikler arasında asenkron, tek yönlü iletişim aracılığıyla özel olaylar oluşturmanıza olanak tanır.
BindableEvent'i Fire() yöntemiyle ateşlediğinizde, ateşleme betiği beklemiyor ve hedef işlev belirli sınırlamalar ile birlikte geçirilen argümanları alır. Tüm olaylar gibi, BindableEvents her bağlı işlev için iş parçacıkları oluşturur, bu nedenle biri hata verse bile diğerleri devam eder.
Yeni bir BindableEvent oluşturmak için Explorer penceresinde:
- BindableEvent eklemek istediğiniz kapsayıcının üzerine gelin. Sunucu betikleri arasında iletişim için ServerScriptService ve istemci betikleri arasında iletişim için ReplicatedStorage kullanmanızı öneririz.
- Kapsayıcının adının sağında görünen ⊕ butonuna tıklayın ve bir BindableEvent örneği ekleyin.
- Örneği TestBindableEvent olarak yeniden adlandırın.
Bir BindableEvent oluşturduktan sonra, bir betikte Event olayına bir işlev bağlayın ve ardından başka bir betikten Fire() olayını ateşleyin.
Olay Bağlantısı
local ServerScriptService = game:GetService("ServerScriptService")
-- Bağlanabilir olay örneğine referans al
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Olay için anonim işlevi bağla
bindableEvent.Event:Connect(function(data)
print(data) --> Tur başladı!
end)
Olay Ateşilocal ServerScriptService = game:GetService("ServerScriptService")-- Bağlanabilir olay örneğine referans allocal bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Bağlanabilir olayı ateşlebindableEvent:Fire("Tur başladı!")
Özel geri çağırmalar
BindableFunction nesnesi, betikler arasında senkron, çift yönlü iletişim sağlar. Bir özel geri çağırma işlevi tanımlamak ve bunu BindableFunction:Invoke() ile bilgilendirerek manuel olarak çağırmak için kullanabilirsiniz. İşlevi çağıran kod bekleme yapar, çağrılı geri çağırma bulunduğunda ise geri çağırma, Invoke() ile geçirdiğiniz argümanları alır. Geri çağırma asla ayarlanmamışsa, onu çağıran betik yürütmeye devam etmez.
Yeni bir BindableFunction oluşturmak için Explorer penceresinde:
- BindableFunction eklemek istediğiniz kapsayıcının üzerine gelin. Sunucu betikleri arasında iletişim için ServerScriptService ve istemci betikleri arasında iletişim için ReplicatedStorage kullanmanızı öneririz.
- Kapsayıcının adının sağında görünen ⊕ butonuna tıklayın ve bir BindableFunction örneği ekleyin.
- Örneği TestBindableFunction olarak yeniden adlandırın.
Bir BindableFunction oluşturduktan sonra, bir betikte OnInvoke geri çağrısına bağlanabilir, ardından başka bir betikten Invoke() geri çağırma işlevini çağırabilirsiniz.
Geri Çağırma Bağlantısı
local ServerScriptService = game:GetService("ServerScriptService")
-- Bağlanabilir işleve referans al
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Geri çağırma işlevi
local function addTwoNumbers(a, b)
return a + b
end
-- İşlevi bağlanabilir işlevin geri çağırması olarak ayarlayın
bindableFunction.OnInvoke = addTwoNumbers
Olay Çağrısılocal ServerScriptService = game:GetService("ServerScriptService")-- Bağlanabilir işleve referans allocal bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")-- Geri çağırma işlevini çağır ve dönen değeri yazdırlocal sum = bindableFunction:Invoke(2, 4)print(sum) --> 6
Argüman sınırlamaları
Bir BindableEvent veya BindableFunction çağırdığınızda, olayla veya geri çağırma işlevine geçirilen argümanları iletirsiniz. Olayla veya geri çağırma işlevine geçirilen herhangi bir tür Roblox nesnesini (Enum, Instance, vb.) ve sayılar, dizeler ve booleans gibi Luau türlerini geçirebilirsiniz, ancak aşağıdaki sınırlamaları dikkatlice göz önünde bulundurmalısınız.
Dize olmayan indeksler
Geçirilen tablonun herhangi bir indeksi dize türleri olmayan türlerse, örneğin bir Instance, userdata veya fonksiyon, Roblox bu indeksleri otomatik olarak dizelere dönüştürür.
Olay Bağlantısı
local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEventFire(passedTable)
for k, v in passedTable do
print(typeof(k)) --> string
end
end
-- Fonksiyonu olaya bağla
bindableEvent.Event:Connect(onEventFire)
Olay Ateşilocal ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Bir çalışma alanı örneğini anahtar olarak içeren bir tablo ile olayı ateşlebindableEvent:Fire({[workspace.Baseplate] = true})
Tablo dizinleme
Bir veri tablosu geçiriyorsanız, sayısal ve dize anahtarların karışık bir tablosunu geçirmeyin. Bu, aktarım sırasında elemanların kaybolmasına neden olabilir. Bunun yerine, tamamen anahtar-değer çiftlerinden (bir sözlük) veya tamamen sayısal indekslerden (bir dizi) oluşan bir tablo geçirin.
Olay Bağlantısı
local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEventFire(passedTable)
for k, v in passedTable do
print(k .. " = " .. v)
--> 1 = Kılıç
--> 2 = Yay
--> CharName = Diva Dragonslayer
--> CharClass = Rogue
end
end
-- Fonksiyonu olaya bağla
bindableEvent.Event:Connect(onEventFire)
Olay Ateşilocal ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")-- Sayısal indeksli tablolocal inventoryData = {"Kılıç", "Yay"}-- Sözlük tablosulocal characterData = {CharName = "Diva Dragonslayer",CharClass = "Rogue"}-- Sürekli indekslenmiş tablolara sahip olayları ateşlebindableEvent:Fire(inventoryData)bindableEvent:Fire(characterData)
Tablo kimlikleri
Bağlanabilir olaylar ve geri çağırmalar için argüman olarak geçirilen tablolar kopyalanır, yani bunlar ateşleme olayı sırasında veya geri çağırmayı çağırdığınızda sağlananlarla tam olarak eşit olmayacaktır. Ayrıca, invoke eden kişiye dönen tablolar da sağlananlarla tam olarak eşit olmayacaktır. Bunu, BindableFunction üzerinde aşağıdaki betiği çalıştırarak ve tablo kimliklerinin farklılaştırıldığını gözlemleyerek gösterebilirsiniz.
Geri Çağırma Bağlantısı
local ServerScriptService = game:GetService("ServerScriptService")
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Geri çağırma işlevi
local function returnTable(passedTable)
-- Çağırıldığında tablo kimliğini yazdır
print(tostring(passedTable)) --> table: 0x48eb7aead27563d9
return passedTable
end
-- İşlevi bağlanabilir işlevin geri çağırması olarak ayarlayın
bindableFunction.OnInvoke = returnTable
Olay Çağrısılocal ServerScriptService = game:GetService("ServerScriptService")local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")local inventoryData = {"Kılıç", "Yay"}-- Orijinal tablo kimliğini yazdırprint(tostring(inventoryData)) --> table: 0x059bcdbb2b576549local invokeReturn = bindableFunction:Invoke(inventoryData)-- Dönüşte tablo kimliğini yazdırprint(tostring(invokeReturn)) --> table: 0x9fcae7919563a0e9
Metabler
Bir tablonun bir metabelası varsa, aktarımda tüm metabela bilgileri kaybolur. Aşağıdaki kod örneğinde, NumWheels özelliği Car metabelasının bir parçasıdır. Sunucu aşağıdaki tabloyu aldığında, truck tablosu Name özelliğine sahip ama NumWheels özelliğine sahip değildir.
Olay Bağlantısı
local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEvent(param)
print(param) --> {["Name"] = "MyTruck"}
end
-- Fonksiyonu olaya bağla
bindableEvent.Event:Connect(onEvent)
Olay Ateşilocal ServerScriptService = game:GetService("ServerScriptService")local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")local Car = {}Car.NumWheels = 4Car.__index = Carlocal truck = {}truck.Name = "MyTruck"setmetatable(truck, Car)-- Metabelalı bir tablo içeren olayı ateşlebindableEvent:Fire(truck)