Setelah membuat beberapa skrip, tidak pernah lama sebelum Anda ingin menggunakan kembali beberapa kode di antara mereka.Tergantung pada lokasi , ModuleScripts memungkinkan Anda menggunakan kembali kode di antara skrip di berbagai sisi batas klien-server atau di sisi yang sama dari batas.
Anda dapat menempatkan skrip modul di mana pun Anda menempatkan skrip, tetapi ReplicatedStorage adalah lokasi populer; menyimpan skrip modul di sini memungkinkan Anda menggunakan kembali kode di antara server dan klien.
Anatomi naskah modul
Di Roblox Studio, tambahkan skrip modul ke ReplicatedStorage dan ganti namanya menjadi PickupManager. Setiap ModuleScript dimulai dengan kode berikut:
local module = {}return module
Kode ini membuat tabel Luau kosong dan mengembalikannya ke skrip apa pun yang memerlukan skrip modul.
Nilai pengembalian bisa apa pun jenis data kecuali untuk nil , tetapi sebagian besar skrip modul mengembalikan fungsi, tabel, atau tabel fungsi.Untuk menghasilkan nilai pengembaliannya, skrip modul dapat tentu saja menjalankan kode arbitrer, yang termasuk memerlukan skrip modul lain.
Contoh berikut ini mengembalikan tabel dengan satu fungsi yang disebut getPickupBonus. Tempelkan ke skrip modul baru:
-- ModuleScript dalam ReplicatedStorage
local PickupManager = {}
local defaultMultiplier = 1.25
local rarityMultipliers = {
common = 10,
uncommon = 20,
rare = 50,
legendary = 100
}
-- Tambahkan fungsi getPickupBonus ke tabel PickupManager
PickupManager.getPickupBonus = function(rarity)
local bonus = rarityMultipliers[rarity] * defaultMultiplier
return bonus
end
return PickupManager
Menambahkan fungsi ke tabel tidak harus dilakukan secara ketat - Anda hanya bisa mengembalikan fungsi itu sendiri - tetapi itu adalah pola yang baik untuk diikuti; itu memberi Anda syntax mudah dipahami saat Anda memanggil fungsi dari skrip lain dan memungkinkan Anda dengan mudah menambahkan lebih banyak fungsi ke skrip modul seiring waktu.
Memerlukan skrip modul
Untuk memuat skrip modul, Anda memanggil fungsi require().Di ReplicatedStorage , tambahkan skrip baru, dan ubah RunContext menjadi Client .Kemudian tambahkan kode berikut untuk memanggil fungsi PickupManager.getPickupBonus:
Skrip klien di ReplicatedStorage
local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Dapatkan nilai yang dikembalikan oleh ModuleScriptlocal PickupManager = require(ReplicatedStorage:WaitForChild("PickupManager"))-- Memanggil fungsi ModuleScriptlocal bonus = PickupManager.getPickupBonus("legendary")print(bonus) --> 125
Menyimpan skrip modul di ReplicatedStorage memungkinkan Anda berbagi kode antara server dan klien, sehingga Anda dapat menggunakan kode yang sama untuk memerlukan skrip dari ServerScriptService :
Skrip di ServerScriptService
local ReplicatedStorage = game:GetService("ReplicatedStorage")local PickupManager = require(ReplicatedStorage:WaitForChild("PickupManager"))
Ketika Anda memanggil require() pada ModuleScript, itu dijalankan sekali dan mengembalikan satu item sebagai referensi.Memanggil lagi mengembalikan referensi yang sama persis, yang berarti bahwa jika Anda memodifikasi tabel yang dikembalikan atau , panggilan berikutnya mengembalikan referensi yang dimodifikasi.Modul itu sendiri tidak berjalan beberapa kali.
Jika Anda membutuhkan ModuleScript dari kedua sisi batas klien-server, seperti dalam contoh di atas, ModuleScript memberikan referensi unik untuk setiap sisi.
Pola
Skrip modul memiliki beberapa pola umum yang dapat Anda gunakan untuk mempercepat kode Anda dan menghindari kesalahan saat pengalaman Anda tumbuh dalam ukuran dan kompleksitas.
Berbagi data
Untuk mengaitkan data dengan objek individu, Anda dapat menugaskan atribut kepada mereka atau membuat folder Configuration dengan objek nilai seperti StringValue atau IntValue .Namun, kedua pendekatan menjadi merepotkan jika Anda ingin menambahkan atau memodifikasi lusin objek atau nilai data.Mereka juga tidak menyimpan tabel atau fungsi.
Jika Anda ingin memodifikasi data yang sama untuk beberapa salinan objek yang sama atau menggunakan kembali data yang sama untuk objek yang berbeda, simpan data di ModuleScripts .Ini adalah cara yang lebih mudah bagi Anda untuk menggunakan ulang data di skrip lain, dan Anda dapat menyimpan tabel dan fungsi.
Contoh berikut ModuleScript di ReplicatedStorage menyimpan nilai konfigurasi untuk senjata umum:
ModuleScript dalam ReplicatedStorage
local GunConfig = {}GunConfig.MagazineSize = 20GunConfig.AmmoCount = 100GunConfig.Firerate = 600GunConfig.Damage = {["Head"] = 50;["Torso"] = 40;["Body"] = 25;}return GunConfig
Acara khusus
Acara khusus memungkinkan skrip untuk berkomunikasi satu sama lain, tetapi harus melacak referensi ke objek individu BindableEvent dapat membingungkan kode Anda.
Anda dapat menggunakan ModuleScripts untuk menyimpan BindableEvents dan memberikan penangan acara khusus yang terikat langsung ke metode ModuleScript .
Berikut adalah ModuleScript di ReplicatedStorage memiliki acara khusus yang dinyalakan saat sakelar mengubah status:
ModuleScript dalam ReplicatedStorage
local Switch = {}
-- Membuat terikat sehingga setiap skrip dapat mendengarkan ketika sakelar diubah
local bindableEvent = Instance.new("BindableEvent")
Switch.Changed = bindableEvent.Event
local state = false
function Switch.flip()
state = not state
bindableEvent:Fire(state)
end
return Switch
Skrip klien berikut di ReplicatedStorage terhubungkan fungsi untuk dipanggil saat peristiwa Switch.Changed terjadi.
Skrip di ReplicatedStorage
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Switch = require(ReplicatedStorage:WaitForChild("Switch"))
Switch.Changed:Connect(function(newState)
print("Switch state is now", newState)
end
-- Uji flip beberapa kali
task.wait(1)
Switch.flip()
task.wait(1)
Switch.flip()
Kapsulisasi
Kapsulisasi adalah praktik membuat lapisan abstraksi di sekitar objek atau logika pemrograman untuk menyembunyikan kompleksitas.Anda dapat menggunakan ModuleScripts untuk mengkapsulkan objek Roblox dengan fungsi Luau khusus untuk mempermudah kode
Sebagai contoh, Anda dapat menggunakan kapsulasi untuk:
- Sederhanakan komunikasi antar jaringan dengan satu objek RemoteEvent tunggal.
- Bungkus kode penanganan kesalahan di sekitar layanan sensitif seperti DataStoreService .
- Definisikan metode khusus untuk mengontrol atau memperluas fitur objek Roblox.
Sulit untuk melacak lusinan objek individu RemoteEvent untuk menerapkan jaringan di game Anda.Anda dapat menggunakan ModuleScript untuk mengkapsulkan tunggal RemoteEvent untuk membantu menyederhanakan masalah ini.Dengan menyertakan argumen unik id , Anda masih dapat mengirim pesan jaringan yang berbeda hanya dengan menggunakan satu RemoteEvent .
Dalam contoh di bawah ini, ModuleScript yang bernama NetworkManagerClient mengkapsulkan metode RemoteEvent:FireServer() untuk memasukkan argumen ekstra id ini.Selain itu, referensi ini ModuleScript merujuk pada objek RemoteEvent itu sendiri sehingga Anda tidak perlu merujuknya di bagian lain dari kode Anda.Anda hanya perlu mengharuskan ini ModuleScript untuk mengirim pesan jaringan dan tidak perlu berurusan dengan RemoteEvent objek di sisa kode basis Anda.
Berikut adalah ModuleScript di ReplicatedFirst memberikan fungsi terkapsul yang dapat Anda panggil pada skrip klien untuk mengirim pesan jaringan:
Modul Jaringan
-- ModuleScript dalam ReplicatedFirst bernama NetworkManagerClient
local NetworkManagerClient = {}
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:WaitForChild("RemoteEvent")
-- Mengkapsulkan fungsi FireServer remote object
function NetworkManagerClient.FireServer(id, ...)
remoteEvent:FireServer(id, ...)
end
return NetworkManagerClient
Berikut adalah ModuleScript di ServerScriptService menggunakan BindableEvents untuk setiap skrip untuk terhubung ke ID tertentu.Ketika klien mengirim pesan jaringan, masing-masing BindableEvent terkait dengan ID yang ditentukan terbakar.
-- ModuleScript dalam ServerScriptService bernama NetworkManagerServer
local NetworkManagerServer = {}
local networkSignalList = {}
function NetworkManagerServer.GetServerEventSignal(id)
local bindableEvent = Instance.new("BindableEvent")
-- Mengaitkan BindableEvent baru ke id
table.insert(networkSignalList, {
id = id,
bindableEvent = bindableEvent,
})
return bindableEvent.Event
end
-- Menghubungkan ke
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:WaitForChild("RemoteEvent")
remoteEvent.OnServerEvent:Connect(function(player, id, ...)
-- Menemukan setiap peristiwa yang dapat diikat yang cocok dengan id acara remote yang diterima
for _, signal in networkSignalList do
if signal.id == id then
signal.bindableEvent:Fire(player, ...)
end
end
end)
return NetworkManagerServer
Berikut adalah LocalScript mengirim pesan dengan ID RequestA dengan argumen opsional Hello .
-- Skrip Lokal di ReplicatedFirstlocal ReplicatedFirst = game:GetService("ReplicatedFirst")local NetworkManagerClient = require(ReplicatedFirst:WaitForChild("NetworkManagerClient"))NetworkManagerClient.FireServer("RequestA", "Hello")
Berikut adalah Script yang terhubung ke ID pesan jaringan RequestA dan mencetak pernyataan dengan parameter tambahan apa pun saat menerima permintaan.
-- Skrip di ServerScriptService
local ServerScriptService = game:GetService("ServerScriptService")
local NetworkManagerServer = require(ServerScriptService:WaitForChild("NetworkManagerServer"))
NetworkManagerServer.GetServerEventSignal("RequestA"):Connect(function(player, ...)
print("Received RequestA from", player, ...)
end)