Kodu tekrar kullanılıyor

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

Birkaç senaryo oluşturduktan sonra, birkaç kodu farklı bir sunucu sınırındaki veya aynı sunucu sınırındaki kodlar arasında yeniden kullanmak istediğinizde asla uzun sürmez. Depois de criar alguns scripts, it's never long before you want to reuse some code between them. Depois de criar alguns scripts, it's never long before you want to reuse some code between them.

Modül Kodları Oluşturulması

Eğer yazılımlarınızı buraya yazarsanız, modül kaynaklarınızı her yere yazabilirsiniz, ancak ReplicatedStorage popüler bir konumdur; modül kaynaklarını buraya yazmak, sunucu ve istemciler arasında kodu yeniden kullanmanızı sağlar.

  1. In Roblox Studio, ReplicatedStorage penceresinde Explorer penceresinde ve + tıklayın.
  2. Yeni bir modül scripti eklemek için ModuleScript seçin.
  3. Script'i sağ tıklayın ve PickupManager olarak yeniden adlandırın.
  4. Script'i açmak için Script Editor 'a tıklayın.

Modül Kodunun Anatomisi

Her ModuleScript başlığında aşağıdaki kod ile başlar:


local module = {}
return module

Bu kod boş bir Luau tablosu oluşturur ve modül kodunu gerektiren herhangi bir koda içeriğini döndürür.

Dönüş değeri herhangi bir veri türü olabilir, ancak nil dışında, çoğu modül kodu bir işlevi, bir tablosu veya bir işlev tablosu iade eder. Onun dönüş değerini oluşturmak için modül kodları arbitral kodu, diğer modül kodlarını gerektiren kodu veya işlev tablosunu içerebilir.

Aşağıdaki örnek, getPickupBonus adındaki tek bir işlevi olan bir tablosunu içerir. Yeni modül kriptinize yapıştırın:


-- ReplicatedStorage'daki ModülScript
local PickupManager = {}
local defaultMultiplier = 1.25
local rarityMultipliers = {
common = 10,
uncommon = 20,
rare = 50,
legendary = 100
}
-- getPickupBonus işlevini PickupManager tabına ekleyin
PickupManager.getPickupBonus = function(rarity)
local bonus = rarityMultipliers[rarity] * defaultMultiplier
return bonus
end
return PickupManager

İşlevi bir tabloda eklemek zorunlu değildir—sadece işlevi kendisi ekleyebilirsiniz—fakat bu iyi bir alışkanlıktır; bir başka scriptten işlevi çağırdığınızda kolayca anlaşılır bir sintem sağlar ve modül kaynağınızı zamanla kolayca ekleyebilirsiniz.

Modül Kodları Gerektirir

Bir modül kodunu yüklemeyi, require() fonksiyonunu çağırır. In ReplicatedStorage , yeni bir kod ekler ve onun RunContext2> Client ına2> değiştirir. Sonra 5>PickupManager.getPickup

ReplicatedStorage'daki müşteri kısmı

local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- ModuleScript tarafından döndürülen değer alın
local PickupManager = require(ReplicatedStorage:WaitForChild("PickupManager"))
-- ModuleScript işlevini çağır
local bonus = PickupManager.getPickupBonus("legendary")
print(bonus) --> 125

Aynı kodu kullanarak ServerScriptService ile skripti gerektirebilirsiniz :

ServerScriptStorage'daki Skript

local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- PickupManager adlı ModülScript'in dönüş değerini alın
local PickupManager = require(ReplicatedStorage:WaitForChild("PickupManager"))

Global.LuaGlobals.gerek() 를 Class.ModuleScript üzerinde çağırırsanız, bir şekilde çalışır ve bir şekilde bir önbellek olarak tek bir öğe içerir.

Eğer client-server sınırının iki tarafından bir ModuleScript gerekirse, ModuleScript her bir taraf için benzersiz bir referans döndürür.

Patternler

Modül kodlarını basitleştirmek için kullanabileceğiniz bazı yaygın modül kodları vardır ve deneyiminizin boyutu ve karmaşıklığı arttıkça tuzakları ortadan kaldırmanız gerekir.

Veri Paylaşımı

Verileri bireysel nesnelerle ilişkilendirmek için onlara özellikler atayabilir veya Configuration veya StringValue gibi değer nesneleri oluşturabilirsiniz. Ancak, yüzlerce nesne veya veri değeri eklemek veya değiştirmek problemli olabilir. Ayrıca, onların tablolarını veya

Aynı öğenin birden fazla kopyasında aynı verileri değiştirmek veya farklı öğeler için aynı verileri tekrar kullanmak istiyorsanız, verileri ModuleScripts depolayın. Diğer kodlar için verileri yeniden kullanmanın daha kolay bir yoludur ve tabloları ve işlevleri depolayabilirsiniz.

Class.ReplicatedStorage|ReplicatedStorage içindeki ReplicatedStorage örneği, genel bir silah için yapılandırma değerlerini saklar:

ReplicatedStorage'daki ModülScript

local GunConfig = {}
GunConfig.MagazineSize = 20
GunConfig.AmmoCount = 100
GunConfig.Firerate = 600
GunConfig.Damage = {
["Head"] = 50;
["Torso"] = 40;
["Body"] = 25;
}
return GunConfig

Özel Etkinlikler

Özel etkinlikler, kodların birbirleriyle iletişim kurmasını sağlar, ancak bireysel BindableEvent nesnelerine referansları takip etmek kodunuzu karmaşık hale getirebilir.

Class.ModuleScript|ModuleScripts kullanarak BindableEvents depolayabilir ve ModuleScript metodlarına doğrudan bağlı özel etkinlik eşleyicileri sağlayabilirsiniz.

Class.ReplicatedStorage|ReplicatedStorage içindeki şu ReplicatedStorage , anahtarın devletini değiştirdiğinde çalışan özel bir etkinliğe sahiptir:

ReplicatedStorage'daki ModülScript

local Switch = {}
-- Değiştiriciyi değiştirildiğinde herhangi bir kullanıcı tarafından dinlenebilir hale getirerek bağlantı oluşturulur
local bindableEvent = Instance.new("BindableEvent")
Switch.Changed = bindableEvent.Event
local state = false
function Switch.flip()
state = not state
bindableEvent:Fire(state)
end
return Switch

Class.ReplicatedStorage içindeki şu klien senaryosu, Switch.Changed olayının çalıştığında çağırılan bir işlevi bağlar.

ReplicatedStorage'daki Skript

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 flipping'i test edin
task.wait(1)
Switch.flip()
task.wait(1)
Switch.flip()

Kapsüllendirme

Kapsüllendirme, karmaşıklığı gizlemek için nesnelerin veya senaryo mantığının etrafında bir abstraktasyon katmanı oluşturmanın pratiğidir. ModuleScripts kullanılarak Roblox nesnelerini özelleştirilmiş Lua işlevleriyle kapsüllendirerek kodbasitleştirebilirsiniz.

Örneğin, kapsüllendirmeyi kullanarak şunları yapabilirsiniz:

  • Tek bir RemoteEvent nesne ile ağ arası iletişimi basitleştirin.
  • Hata ayıklama kodunu DataStoreService gibi hassas hizmetler etrafında örgütleyin.
  • Roblox nesne özelliklerini kontrol etmek veya genişletmek için özel yöntemler tanımlayın.

oyunağı etkinleştirmek için onlarca RemoteEvent nesneyi takip etmek zor. Bir ModuleScript kullanarak tek bir RemoteEvent nesneyi kapsüle etmek problemi basitleştirebilir. Ayrıca,

Aşağıdaki örnekte, ModuleScript adındaki NetworkManagerClient şu <

Class.ReplicatedFirst içindeki şu ReplicatedFirst , ağ mesajı göndermek için istemcisi kullanabilirsiniz kapapsız bir işlev sağlar:

Ağ Modülü

-- ReplicatedFirst adındaki NetworkManagerClient
local NetworkManagerClient = {}
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:WaitForChild("RemoteEvent")
-- Uzaktaki FireServer işlevini kapsayan
function NetworkManagerClient.FireServer(id, ...)
remoteEvent:FireServer(id, ...)
end
return NetworkManagerClient

Class.ServerScriptService ın önündeki ServerScriptService , her kullanıcının bağlanması için BindableEvents kullanır. Bir klien ağ mesajı gönderdiğinde, belirli ID ile bağlantı kuran her kullanıcının 1>Class.BindableEvent1> ile ilişkili her bir 4>


-- NetworkManagerServer adındaki ServerScript hizmetinde
local NetworkManagerServer = {}
local networkSignalList = {}
function NetworkManagerServer.GetServerEventSignal(id)
local bindableEvent = Instance.new("BindableEvent")
-- Yeni bağlanabilir olayın ID'sine bağlanması
table.insert(networkSignalList, {
id = id,
bindableEvent = bindableEvent,
})
return bindableEvent.Event
end
-- Bağlanıyor
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:WaitForChild("RemoteEvent")
remoteEvent.OnServerEvent:Connect(function(player, id, ...)
-- Alınan uzaktaki etkinliğin kimliğine eşdeğer olan her bağlanabilir etkinliği bulmak
for _, signal in networkSignalList do
if signal.id == id then
signal.bindableEvent:Fire(player, ...)
end
end
end)
return NetworkManagerServer

Aşağıdaki LocalScript bir mesaj gönderir, RequestA ile bir seçenekli Hello argümanı.


-- ReplicatedFirst'deki Yerel Kod
local ReplicatedFirst = game:GetService("ReplicatedFirst")
local NetworkManagerClient = require(ReplicatedFirst:WaitForChild("NetworkManagerClient"))
NetworkManagerClient.FireServer("RequestA", "Hello")

Aşağıdaki Script ağ mesaj ID'si ile bağlanır RequestA ve talepaldığında ek göstergelerle bir ifadeyi yazdırır.


-- ServerScriptService'deki Skript
local ServerScriptService = game:GetService("ServerScriptService")
local NetworkManagerServer = require(ServerScriptService:WaitForChild("NetworkManagerServer"))
NetworkManagerServer.GetServerEventSignal("RequestA"):Connect(function(player, ...)
print("Received RequestA from", player, ...)
end)