Gunakan kembali kode

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.

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 ModuleScript
local PickupManager = require(ReplicatedStorage:WaitForChild("PickupManager"))
-- Memanggil fungsi ModuleScript
local 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 = 20
GunConfig.AmmoCount = 100
GunConfig.Firerate = 600
GunConfig.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 ReplicatedFirst
local 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)