Birkaç kod oluşturduktan sonra, aralarında bazı kodları yeniden kullanmak istemeden önce asla uzun sürmez.konuma bağlı olarak, ModuleScripts kodu, müşteri-sunucu sınırının farklı taraflarındaki veya aynı sınır taraflarındaki senaryolarda yeniden kullanmanıza izin verir.
Modül kodlarını yerleştirebileceğiniz her yere modül kodlarını yerleştirebilirsiniz, ancak ReplicatedStorage popüler bir konumdur; modül kodlarını burada saklamak, sunucu ve istemciler arasındaki kodu yeniden kullanmanıza izin verir.
Bir modül kodunun anatomisi
Roblox Studio'da, bir modül senaryosunu ReplicatedStorage 'a ekleyin ve adını PickupManager olarak değiştirin. Her ModuleScript aşağıdaki kodla başlar:
local module = {}return module
Bu kod boş bir Luau tablosu oluşturur ve modül koduna ihtiyaç duyan herhangi bir kriptoya geri döndürür.
Geri dönüş değeri herhangi bir veri türü olabilir, ancak çoğu modül kodu bir fonksiyon, bir tablo veya bir fonksiyon tablosu döndürür.Geri dönüş değerini üretmek için, modül kodları tabii ki başka modül kodlarını gerektiren rastgele kod çalabilir, bu da diğer modül kodlarını gerektirir.
Aşağıdaki örnek, tek bir işlev olan getPickupBonus adlı bir tablo döndürür. Yeni modül koduna yapıştırın:
-- ReplicatedStorage'ta Modül Kodu
local PickupManager = {}
local defaultMultiplier = 1.25
local rarityMultipliers = {
common = 10,
uncommon = 20,
rare = 50,
legendary = 100
}
-- PickupManager tablosuna getPickupBonus işlevini ekleyin
PickupManager.getPickupBonus = function(rarity)
local bonus = rarityMultipliers[rarity] * defaultMultiplier
return bonus
end
return PickupManager
İşlevi bir tabloya eklemek kesinlikle gerekli değildir - sadece işlevin kendisini geri verebilirsiniz - ancak takip etedilmesi gereken iyi bir modeldir; işlevi başka bir senaryodan çağırdığınızda anlaşılması kolay bir sözdizimi verir ve zamanla modül koduna daha fazla işlev ekleyebilirsiniz.
Modül kodları gerektir
Bir modül senaryosunu yüklemek için, require() fonksiyonunu çağırırsınız.In ReplicatedStorage , yeni bir senaryo ekleyin ve onun RunContext 'sini Client 'e değiştirin.Sonra PickupManager.getPickupBonus fonksiyonunu çağırmak için aşağıdaki kodu ekleyin:
ReplicatedStorage'daki istemci kodu
local ReplicatedStorage = game:GetService("ReplicatedStorage")-- ModülScript tarafından döndürülen değeri alınlocal PickupManager = require(ReplicatedStorage:WaitForChild("PickupManager"))-- Bir ModülScript işlevi çağırlocal bonus = PickupManager.getPickupBonus("legendary")print(bonus) --> 125
Modül kodlarını ReplicatedStorage depolamak, sunucu ve istemci arasında kodu paylaşmanıza izin verir, böylece aynı kodu kullanarak senaryoyu ServerScriptService gerektirebilirsiniz:
ServerScriptService'teki senaryo
local ReplicatedStorage = game:GetService("ReplicatedStorage")local PickupManager = require(ReplicatedStorage:WaitForChild("PickupManager"))
require() 'yi bir ModuleScript üzerinde çağırdığınızda, bir kez çalışır ve bir referans olarak tek bir öğe döndürür. yeniden çağrılmak aynı referansı geri döndürür, yani eğer döndürülen tablosunu değiştirirseniz veya , sonraki çağrılar bu değiştirilmiş referansı geri döndürür.Modülün kendisi birden fazla kez çalışmaz.
Eğer müşteri-sunucu sınırının her iki tarafından bir ModuleScript gerekiyorsa, örnekte olduğu gibi, ModuleScript her taraf için benzersiz bir referans döndürür.
Kalıpler
Modül kodlarının kullanabileceğiniz bazı yaygın modelleri vardır ve deneyiminiz büyüdükçe kodlarınızı basitleştirmek ve hatalardan kaçınmak için.
Veri paylaşımı
Verileri bireysel nesnelerle eşleştirmek için, onlara öznitelikler atayabilir veya Configuration değerli nesneler gibi StringValue veya IntValue katılımlı klasörler oluşturabilirsiniz.Ancak, her iki yaklaşım da düzinelerce nesne veya veri değeri eklemek veya değiştirmek istiyorsanız sorunludur.Ayrıca masalar veya işlevler depolamazlar.
Aynı nesnenin çeşitli kopyaları için aynı verileri değiştirmek veya farklı nesneler için aynı verileri yeniden kullanmak istiyorsanız, verileri ModuleScripts depolayın.Diğer senaryolarda verileri yeniden kullanmanızı kolaylaştıran bir yol ve tabloları ve işlevleri depolayabilirsiniz.
Aşağıdaki örnek Class.ModuleScript``Class.ReplicatedStorage|ReplicatedStorage genel bir silah için yapılandırma değerlerini saklar:
ReplicatedStorage'ta Modül Kodu
local GunConfig = {}GunConfig.MagazineSize = 20GunConfig.AmmoCount = 100GunConfig.Firerate = 600GunConfig.Damage = {["Head"] = 50;["Torso"] = 40;["Body"] = 25;}return GunConfig
Özel etkinlikler
Özel etkinlikler, senaryoların birbiriyle iletişim kurmasına izin verir, ancak bireysel BindableEvent nesnelerin referanslarını takip etmek zorunda kalmak kodunuzu dağıtabilir.
ModuleScripts ile BindableEvents depolayabilir ve ModuleScript yöntemlerine doğrudan bağlı özel etkinlik elemanları sağlayabilirsiniz.
Aşağıdaki değiştirici durumu değiştiğinde ateşleyen özel bir etkinlik var:
ReplicatedStorage'ta Modül Kodu
local Switch = {}
-- Değiştirildiğinde herhangi bir senaryonun dinleyebilmesi için bağlanabilir oluşturma
local bindableEvent = Instance.new("BindableEvent")
Switch.Changed = bindableEvent.Event
local state = false
function Switch.flip()
state = not state
bindableEvent:Fire(state)
end
return Switch
Aşağıdaki istemci kodu ReplicatedStorage , Switch.Changed etkinliği ateşlendiğinde çağrılacak bir işlev bağlar.
ReplicatedStorage'ta Kod Yazma
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Switch = require(ReplicatedStorage:WaitForChild("Switch"))
Switch.Changed:Connect(function(newState)
print("Switch state is now", newState)
end
-- Birkaç kez çevirmeyi test et
task.wait(1)
Switch.flip()
task.wait(1)
Switch.flip()
Kapsüllenme
Kapsülleme, karmaşıklığı gizlemek için nesnelerin veya senaryo mantığının etrafında bir soyutlama tabakası oluşturma pratiğidir.kodbasitleştirmek için Roblox nesnelerini özel Luau işlevleriyle sarıp sarmalamak için ModuleScripts kullanabilirsiniz.
Örneğin, kapsüllemeyi kullanarak şunlara sahip olabilirsiniz:
- Tek bir RemoteEvent nesne ile ağ arası iletişimi basitleştirin.
- Hata eleme kodunu DataStoreService gibi hassas hizmetlerin etrafına sarın.
- Roblox nesne özelliklerini kontrol etmek veya genişletmek için özel yöntemler tanımlayın.
oyunağ yapmak için onlarca bireysel RemoteEvent nesneyi izlemek zordur.Bu sorunu basitleştirmek için tek bir ModuleScript kapsüllemek için bir RemoteEvent kullanabilirsiniz.Eşsiz bir id argümanı dahil ederek, yalnızca tek bir RemoteEvent kullanarak hala farklı ağ mesajları gönderebilirsiniz.
Aşağıdaki örnekte, ModuleScript adlı NetworkManagerClient yöntemi bu ekstra id argümanı dahil etmek için kapsar RemoteEvent:FireServer().Ayrıca, bu ModuleScript referansı RemoteEvent nesneyi kendisi referans eder, böylece kodunuzun diğer bölümlerine referans vermeniz gerekmez.Sadece ağ mesajları göndermek için bu ModuleScript gerektirmeniz gerekiyor ve kod tabanınızın geri kalanındaki RemoteEvent nesnelerle uğraşmanıza gerek yok.
Aşağıdaki Class.ModuleScript``Class.ReplicatedFirst , müşteri kodlarınızın bir ağ mesajı göndermesi için çağırabileceğiniz kapalı bir işlev sağlar:
Ağ Modülü
-- Yinelenenİlk adı NetworkManagerClient olan ModülScript
local NetworkManagerClient = {}
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:WaitForChild("RemoteEvent")
-- Uzak nesnenin Ateş Hizmeti işlevini sarma
function NetworkManagerClient.FireServer(id, ...)
remoteEvent:FireServer(id, ...)
end
return NetworkManagerClient
Aşağıdaki Class.ModuleScript``Class.ServerScriptService her kript için özel bir ID'ye bağlanmak için BindableEvents kullanılır.Bir istemci ağ mesajı gönderdiğinde, belirtilen ID ile ilişkili her BindableEvent ateşlenir.
-- NetworkManagerServer adlı ServerScriptService içindeki ModülScript hizmeti
local NetworkManagerServer = {}
local networkSignalList = {}
function NetworkManagerServer.GetServerEventSignal(id)
local bindableEvent = Instance.new("BindableEvent")
-- Yeni BağlanabilirEtkinin kimliğine bağlanması
table.insert(networkSignalList, {
id = id,
bindableEvent = bindableEvent,
})
return bindableEvent.Event
end
-- Bağlanmak için
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:WaitForChild("RemoteEvent")
remoteEvent.OnServerEvent:Connect(function(player, id, ...)
-- Alınan uzaktaki olayın kimliğine eşleşen her bağlanabilir olayı bulmak
for _, signal in networkSignalList do
if signal.id == id then
signal.bindableEvent:Fire(player, ...)
end
end
end)
return NetworkManagerServer
Aşağıdaki LocalScript , isteğe bağlı bir RequestA argümanı ile ID'si ile bir mesaj gönderir Hello.
-- ReplicatedFirst'te Yerel Kodlar LocalScriptlocal ReplicatedFirst = game:GetService("ReplicatedFirst")local NetworkManagerClient = require(ReplicatedFirst:WaitForChild("NetworkManagerClient"))NetworkManagerClient.FireServer("RequestA", "Hello")
Aşağıdaki Script ağ mesajı kimliğine bağlanır RequestA ve talepaldığında herhangi bir ek parametre ile bir ifade basar.
-- ServerScriptService'teki senaryo
local ServerScriptService = game:GetService("ServerScriptService")
local NetworkManagerServer = require(ServerScriptService:WaitForChild("NetworkManagerServer"))
NetworkManagerServer.GetServerEventSignal("RequestA"):Connect(function(player, ...)
print("Received RequestA from", player, ...)
end)