Setelah membuat beberapa script, itu tidak pernah lama sebelum Anda ingin menggunakan beberapa kode di antara mereka. Tergantung pada lokasi , ModuleScripts memungkinkan Anda menggunakan kode di antara skrip di berbagai sisi dari batas klien-server atau sisi yang sama dari batas.
Membuat Skrip Modul
Anda dapat menempatkan skrip modul di mana saja Anda menempatkan skrip, tetapi ReplicatedStorage adalah lokasi populer; menyimpan skrip modul di sini memungkinkan Anda menggunakan kembali kode antara server dan klien.
- Pilih ModuleScript untuk menambahkan naskah modul baru.
- Klik kanan pada script dan ganti nama menjadi PickupManager .
- Klik dua kali script untuk membukanya di Editor Skrip .
Anatomi Skrip Modul
Setiap ModuleScript dimulai dengan kode berikut:
local module = {}return module
Kode ini membuat tabel Luau kosong dan mengembalikannya ke setiap skrip yang memerlukan skrip modul.
Nilai kembalinya dapat apa pun jenis data kecuali nil, tetapi kebanyakan script modul mengembalikan fungsi, tabel, atau tabel fungsi. Untuk menghasilkan nilai kembalinya, script modul dapat tentu saja mengeksekkan kode arbitrer, yang termasuk memerlukan modul lain.
Contoh berikut mengembalikan tabel dengan satu fungsi bernama getPickupBonus . Tempelkan di naskah modul baru Anda:
-- ModuleScript di 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 diperlukan secara ketat — Anda hanya bisa mengembalikan fungsi itu sendiri — tetapi itu adalah pola yang baik untuk diikuti; itu memberi Anda struktur yang mudah dimengerti saat Anda memanggil fungsi dari script lain dan memungkinkan Anda dengan mudah menambahkan lebih banyak fungsi ke tabel skrip selama waktu.
Memerlukan Modul Skrip
Untuk memuat skrip modul, Anda memanggil fungsi require(). Di ReplicatedStorage, tambahkan skrip baru, dan ubah RunContext Anda ke 1> Client1> . Kemudian tambahkan kode berikut untuk memanggil fungsi 4> PickupManager.getPick
Skrip klien di ReplicatedStorage
local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Dapatkan nilai yang dikembalikan oleh ModuleScriptlocal PickupManager = require(ReplicatedStorage:WaitForChild("PickupManager"))-- Panggil fungsiModuleScriptlocal bonus = PickupManager.getPickupBonus("legendary")print(bonus) --> 125
Anda dapat menggunakan kode yang sama untuk mengharuskan skrip dari ServerScriptService :
Skrip di ServerScriptStorage
local ReplicatedStorage = game:GetService("ReplicatedStorage")-- Dapatkan nilai kembali untuk ModulScript bernama "PickupManager"local PickupManager = require(ReplicatedStorage:WaitForChild("PickupManager"))
Ketika Anda menelepon require() di ModuleScript , itu berjalan sekali dan mengembalikan satu item sebagai referensi. Menelepon Global.LuaGlobals.
Jika Anda memerlukan ModuleScript dari kedua sisi batas klien-server, ModuleScript mengembalikan referensi unik untuk setiap sisi.
Pattern
Skrip modul memiliki beberapa pola umum yang dapat Anda gunakan untuk menyederakan kode Anda dan menghindari perangkap saat pengalaman Anda tumbuh dalam ukuran dan kompleksitas.
Berbagi Data
Untuk menghubungkan data dengan objek tunggal, Anda dapat menetapkan atribut kepada mereka atau membuat Configuration folder dengan objek nilai seperti StringValue atau IntValue . Namun, kedua pendekatan ini rumit jika Anda ingin menambahkan atau mengubah puluhan objek atau nilai data. Mereka juga tid
Jika Anda ingin mengubah data yang sama untuk beberapa salinan dari objek yang sama atau menggunakan data yang sama untuk berbagai objek, simpan data di ModuleScripts . Ini adalah cara yang lebih mudah bagi Anda untuk menggunakan data di script lain, dan Anda dapat menyimpan tabel dan fungsi.
Contoh berikut ModuleScript di ReplicatedStorage menyimpan nilai konfigurasi untuk senjata generik:
ModuleScript di ReplicatedStorage
local GunConfig = {}GunConfig.MagazineSize = 20GunConfig.AmmoCount = 100GunConfig.Firerate = 600GunConfig.Damage = {["Head"] = 50;["Torso"] = 40;["Body"] = 25;}return GunConfig
Acara Kustom
Acara khusus mengaktifkan skrip untuk berkomunikasi satu sama lain, tetapi harus menjaga jejak referensi ke objek BindableEvent individual dapat menumpukkan kode Anda.
Anda dapat menggunakan ModuleScripts untuk menyimpan BindableEvents dan memberikan penangani acara khusus yang langsung terikat dengan metode ModuleScript .
Berikut adalah ModuleScript di ReplicatedStorage yang memiliki acara khusus yang diaktifkan ketika tombol berubah status:
ModuleScript di ReplicatedStorage
local Switch = {}
-- Membuat biner yang dapat dimasukkan sehingga setiap script dapat mendengarkan ketika tombolnya berubah
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 menghubungkan fungsi untuk dipanggil ketika acara Switch.Changed diaktifkan.
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 flipping beberapa kali
task.wait(1)
Switch.flip()
task.wait(1)
Switch.flip()
Kapsulisasi
Kapsulisasi adalah praktik membuat lapisan abstraksi di sekitar objek atau logika skrip untuk menyembunyikan kompleksitas. Anda dapat menggunakan ModuleScripts untuk kapsulkan objek Roblox dengan fungsi Lua khusus untuk memperederkan kode.
Misalnya, Anda dapat menggunakan kapsulisasi untuk:
- Sederkan komunikasi antar jaringan dengan satu objek RemoteEvent saja.
- Wrap error handling code di sekitar layanan sensitif seperti DataStoreService .
- Definisikan metode khusus untuk mengontrol atau menambahkan fitur objek Roblox.
Sulit untuk melacak puluhan objek RemoteEvent individual untuk menerapkan jaringan di game Anda. Anda dapat menggunakan ModuleScript untuk mengkapsulkan satu RemoteEvent untuk membantu menyederhanakan masalah ini. D
Dalam contoh di bawah ini, ModuleScript bernama NetworkManagerClient mengkapsul met
Berikut adalah ModuleScript dalam ReplicatedFirst yang memberikan fungsi yang dikapsul yang dapat Anda panggil ke skrip klien Anda untuk mengirim pesan jaringan:
Modul Jaringan
-- ModuleScript di ReplicatedFirst bernama NetworkManagerClient
local NetworkManagerClient = {}
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:WaitForChild("RemoteEvent")
-- Mengkapsul fungsi FireServer objek jauh
function NetworkManagerClient.FireServer(id, ...)
remoteEvent:FireServer(id, ...)
end
return NetworkManagerClient
Berikut adalah ModuleScript di ServerScriptService menggunakan BindableEvents untuk setiap script untuk terhubung ke ID spesifik. Saat klien mengirim pesan jaringan, setiap 1> Class.BindableEvent1> yang terkait dengan ID spesifik diaktifkan.
-- ModuleScript di ServerScriptService bernama NetworkManagerServer
local NetworkManagerServer = {}
local networkSignalList = {}
function NetworkManagerServer.GetServerEventSignal(id)
local bindableEvent = Instance.new("BindableEvent")
-- Mengikuti BindableEvent ke id
table.insert(networkSignalList, {
id = id,
bindableEvent = bindableEvent,
})
return bindableEvent.Event
end
-- Terhubung ke
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteEvent = ReplicatedStorage:WaitForChild("RemoteEvent")
remoteEvent.OnServerEvent:Connect(function(player, id, ...)
-- Menemukan setiap acara yang dapat disesuaikan 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 Hello yang op션.
-- Skrip Lokal di ReplicatedFirstlocal ReplicatedFirst = game:GetService("ReplicatedFirst")local NetworkManagerClient = require(ReplicatedFirst:WaitForChild("NetworkManagerClient"))NetworkManagerClient.FireServer("RequestA", "Hello")
Berikut Script terhubung ke ID pesan jaringan RequestA dan mencetak pernyataan dengan parameter tambahan 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)