Bağlanabilir olaylar ve geri çağrılar

*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.

ve nesneleri, klien-sunucu sınırının aynı tarafındaki scriptler arasında davranışları bağlamanıza ve deneyim içi eylemler için belirli bir istenen sonucu iletişime geçmenize izin verir.

Bağlanabilir olaylar için en yaygın kullanım durumu, tur tabanlı bir yapıya sahip deneyimlerdir.Örneğin, başka kodların bir zamanlayıcı başlatmasına ve bir liderlik tablosugörüntülemesine izin veren "eşleşme başladı" olayına sahip olabilirsiniz, böylece diğer kodlar oyuncuları bir lobiye geri taşımak ve kazananları göstermek için ne zaman hareket edeceklerini bilirler.

Çünkü senaryolar arasındaki faaliyetleri koordine ediyorlar, bağlanabilir olaylar genellikle sunucuda kullanılır, ancak istemci üzerinde de kullanabilirsiniz.

Deneyiminizin nasıl çalıştığına bağlı olarak, bağlanabilir olaylar kodunuzu daha modüler hale getirmeye yardımcı olabilir, ancak modül kodları genellikle verileri paylaşmanız gereken durumlar için daha iyi bir alternatiftir.Ayrıca, daha temiz bir sentaks için modül kodlarıyla birlikte bağlanabilir etkinlikleri kullanabilirsiniz, Özel etkinlikler olarak belirtildiği gibi.

Bağlanabilir olaylar

The BindableEvent nesnesi, senaryolar arasında asenkron, tek yönlü iletişim yoluyla özel olayları etkinleştirir.

yöntemi aracılığıyla bir ateşlediğinizde, atış senaryosu vermez ve hedef işlevi geçen argümanları belirli sınırlamalarla alır.Tüm olaylar gibi, BindableEvents bağlı her işlevin içeriğini oluşturan bağlantılar oluşturur, böylece bir hata olsa bile diğerleri devam eder.

Studio'daki Gezgini penceresini kullanarak yeni bir oluşturmak için:

  1. BindableEvent 'yi yerleştirmek istediğiniz konteynere tıklayın.Sunucu kodları ve müşteri kodları arasındaki iletişim için ServerScriptService ve müşteri kodları arasındaki iletişim için ReplicatedStorage kullanmanızı öneririz.
  2. Konteynerin adının sağında görünen düğmesine tıklayın ve bir BağlanabilirEtkinlik durumgirin.
  3. Instansı TestBindableEvent olarak yeniden adlandırın.

Bir BindableEvent oluşturduktan sonra, bir işlevi bir senaryoda Event etkinliğine bağlayın ve ardından başka bir senaryiden olayı Fire() edin.

Etkinlik Bağlantısı

local ServerScriptService = game:GetService("ServerScriptService")
-- Bağlanabilir etkinlik örneğine referans alın
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Anonim işlevi etkinliğe bağla
bindableEvent.Event:Connect(function(data)
print(data) --> Tur başladı!
end)
Etkinlik Ateşleme

local ServerScriptService = game:GetService("ServerScriptService")
-- Bağlanabilir etkinlik örneğine referans alın
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Ateşlenebilir olay bağlanabilir etkinlik
bindableEvent:Fire("Round started!")

Özel geri aramalar

The BindableFunction nesnesi, senkronik, iki yönlü kod arası iletişim sağlar.Bunu özel bir geri arama işlevini tanımlamak ve manuel olarak çağırarak BindableFunction:Invoke() çağırmak için kullanabilirsiniz.İşlevi çağıran kod, eşleşen geri çağrı bulana kadar üretir , ve geri çağrı, Invoke() 'e geçirdiğiniz argümanları alır.Geri çağrı asla ayarlanmadıysa, onu çağıran kod yeniden başlatmayı sürdürmez.

Studio'daki Gezgini penceresini kullanarak yeni bir oluşturmak için:

  1. BindableFunction 'yi yerleştirmek istediğiniz konteynere tıklayın.Sunucu kodları ve müşteri kodları arasındaki iletişim için ServerScriptService ve müşteri kodları arasındaki iletişim için ReplicatedStorage kullanmanızı öneririz.
  2. Konteynerin adının sağında görünen düğmesine tıklayın ve bir BağlanabilirFonksiyon durumgirin.
  3. Instansı TestBindableFunction olarak yeniden adlandırın.

Bir oluşturduktan sonra, bir senaryoda onun geri çağrısına bağlanabilir ve ardından başka bir senaryodan geri çağrı işlevi.

Geri Çağrı Bağlantısı

local ServerScriptService = game:GetService("ServerScriptService")
-- Bağlanabilir işlev için referans alın
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Geri çağırma işlevi
local function addTwoNumbers(a, b)
return a + b
end
-- İşlev bağlanabilir işlevin geri çağrısı olarak ayarla
bindableFunction.OnInvoke = addTwoNumbers
Etkinlik Daveti Etme

local ServerScriptService = game:GetService("ServerScriptService")
-- Bağlanabilir işlev için referans alın
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Geri arama işlevini çağır ve döndürülen değeri gönder
local sum = bindableFunction:Invoke(2, 4)
print(sum) --> 6

Argüman sınırları

Bir BindableEvent ateşlediğinizde veya bir BindableFunction çağrısı yaptığınızda, olayla veya geri çağrı işleviyle geçirdiğiniz herhangi bir argümanı yönlendirir.Herhangi bir Roblox nesnesini (Enum , Instance , vb.) geçebilirsiniz, sayılar, dize ve booleans gibi Luau türleri de dahil olmak üzere, ancak aşağıdaki kısıtlamaları dikkatlice göz önünde bulundurmalısınız.

Dize olmayan indeksler

Geçmiş bir tablodaki herhangi bir indeks (örneğin, Instance , kullanıcı verileri veya fonksiyon) bir dizeye dönüştürülürse, Roblox bunları otomatik olarak dizeye dönüştürür.

Etkinlik 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)) --> dizi
end
end
-- İşlevi etkinliğe bağla
bindableEvent.Event:Connect(onEventFire)
Etkinlik Ateşleme

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Anahtar olarak bir çalışma alanı instansı içeren tablo ile ateş et anahtar
bindableEvent:Fire({
[workspace.Baseplate] = true
})

Tablo indeksleme

Bir veri tablosu geçerseniz, karışık bir sayı ve dize anahtar tablosu geçirmeyin.Bunun yerine, tümüyle anahtar-değer çiftlerinden oluşan bir tabloyu (bir sözlük) veya tümüyle sayısal indekslerden oluşan bir dizi (bir dizi) geçin.

Etkinlik 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 = Düzenbaz
end
end
-- İşlevi etkinliğe bağla
bindableEvent.Event:Connect(onEventFire)
Etkinlik Ateşleme

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
-- Sayısal indeksli tablo
local inventoryData = {
"Sword", "Bow"
}
-- Dizin tablosu
local characterData = {
CharName = "Diva Dragonslayer",
CharClass = "Rogue"
}
-- Tutarlı indeksli tablolarla ateş etkinliği
bindableEvent:Fire(inventoryData)
bindableEvent:Fire(characterData)

Tablo kimlikleri

Bağlanabilir olaylara ve geri çağrılara aktarılan tablolar, bağlantı kurmak için verilenlere eşit olmayacak şekilde kopyalanır, yani olayı ateşlemek veya geri çağrıyı yaparken sağlananlarla aynı olmayacaklar.Ayrıca, geri verilen masaların invokatöre sağlananlara eşit olması da garanti edilmez.Bunu şu kodu bir BindableFunction üzerinde çalıştırarak ve tablo kimliklerinin nasıl farklı olduğunu gözlemleyerek gösterabilirsiniz.

Geri Çağrı Bağlantısı

local ServerScriptService = game:GetService("ServerScriptService")
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
-- Geri çağırma işlevi
local function returnTable(passedTable)
-- Çağrı sırasında çıktı tablosu kimliği
print(tostring(passedTable)) --> tablo: 0x48eb7aead27563d9
return passedTable
end
-- İşlev bağlanabilir işlevin geri çağrısı olarak ayarla
bindableFunction.OnInvoke = returnTable
Etkinlik Daveti Etme

local ServerScriptService = game:GetService("ServerScriptService")
local bindableFunction = ServerScriptService:WaitForChild("TestBindableFunction")
local inventoryData = {
"Sword", "Bow"
}
-- Orijinal tablo kimliğini çıkart
print(tostring(inventoryData)) --> tablo: 0x059bcdbb2b576549
local invokeReturn = bindableFunction:Invoke(inventoryData)
-- Döndürme sırasında çıktı tablosu kimliği
print(tostring(invokeReturn)) --> table: 0x9fcae7919563a0e9

Met tabloları

Bir tablonun bir metatablosu varsa, tüm metatablo bilgileri transferde kaybolur.Aşağıdaki kod örneğinde, NumWheels özelliği Car metatable'in bir parçasıdır.Sunucu aşağıdaki tabloyu aldığında, tablosu özelliğine sahiptir, ancak değil özelliği.

Etkinlik Bağlantısı

local ServerScriptService = game:GetService("ServerScriptService")
local bindableEvent = ServerScriptService:WaitForChild("TestBindableEvent")
local function onEvent(param)
print(param) --> { ["İsim"] = "MyTruck"}
end
-- İşlevi etkinliğe bağla
bindableEvent.Event:Connect(onEvent)
Etkinlik Ateşleme

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)
-- Bir metatable içeren masa ile ateş etkinliği
bindableEvent:Fire(truck)