Menggunakan Kode yang Sama

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

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.

  1. Di Roblox Studio, hover over ReplicatedStorage dalam jendela Explorer dan klik + .
  2. Pilih ModuleScript untuk menambahkan naskah modul baru.
  3. Klik kanan pada script dan ganti nama menjadi PickupManager .
  4. 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 ModuleScript
local PickupManager = require(ReplicatedStorage:WaitForChild("PickupManager"))
-- Panggil fungsiModuleScript
local 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 = 20
GunConfig.AmmoCount = 100
GunConfig.Firerate = 600
GunConfig.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 ReplicatedFirst
local 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)