
Untuk menerapkan pengetahuan Anda tentang skrip modul, buat skrip modul yang memungkinkan pemain mengambil kunci dan menggunakannya untuk membuka peti harta karun.
Pengaturan proyek
Proyek ini mencakup peta awal dengan papan peringkat dan objek pengambilan yang diprogram untuk kunci dan peti harta karun.
Muat proyek awal
Di Roblox Studio, buka file yang diunduh: Intro to Module Scripts - Starter Project.rbxl.

Buat skrip modul
Agar pemain dapat mendapatkan harta dari peti, buat skrip modul bernama TreasureManager. Menggunakan skrip modul akan menghubungkan pengambilan dan papan peringkat bersama-sama.
Di ServerStorage, buat ModuleScript baru dan ganti namanya menjadi TreasureManager.

Di TreasureManager, ganti nama tabel modul default dengan mengganti module dengan TreasureManager di kedua tempat.
local TreasureManager = {}return TreasureManager
Gunakan fungsi dalam skrip modul
Untuk menguji bagaimana fungsi bekerja dalam skrip modul, buat fungsi baru bernama getKey(). Ketika fungsi getKey() dipanggil dari skrip lain, ia akan menerima bagian kunci untuk dihancurkan dan menambahkan 1 ke jumlah kunci dalam inventaris pemain.
Buat fungsi modul untuk kunci
Skrip modul ini akan menggunakan kombinasi fungsi modul dan lokal, ketik dua komentar untuk membantu Anda memisahkannya.
local TreasureManager = {}------------------ Fungsi Lokal------------------ Fungsi Modulreturn TreasureManagerDi bawah komentar Fungsi Modul, tambahkan fungsi modul baru ke TreasureManager bernama getKey().
Gunakan dua parameter:
- keyPart - bagian yang akan dihancurkan.
- whichCharacter - pemain yang menyentuh bagian kunci.
local TreasureManager = {}------------------ Fungsi Lokal------------------ Fungsi Modulfunction TreasureManager.getKey(keyPart, whichCharacter)endreturn TreasureManagerDi dalam getKey(), hancurkan keyPart.
function TreasureManager.getKey(keyPart, whichCharacter)keyPart:Destroy()end
Gunakan fungsi modul
Sekarang, fungsi modul getKey() dapat digunakan dalam skrip lain. Untuk menguji fungsi itu, Anda akan membuka skrip yang sudah dibuat dan memanggilnya.
Buka skrip kunci di Workspace ⟩ Keys ⟩ KeyScript.
Di keyScript, simpan skrip modul dalam variabel bernama treasureManager dan setel nilainya menjadi: require(ServerStorage:WaitForChild("TreasureManager"))
local ServerStorage = game:GetService("ServerStorage")-- Memerlukan skrip modul di bawah ⯆local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))local keys = script.Parentlocal keysFolder = keys.Partslocal keysArray = keysFolder:GetChildren()Sudah ada fungsi bernama partTouched() untuk memeriksa pemain yang menyentuh bagian. Di dalam partTouched():
- Panggil fungsi modul getKey() untuk menghancurkan kunci.
- Lewati keyPart dan whichCharacter.
local ServerStorage = game:GetService("ServerStorage")-- Memerlukan skrip modul di bawah ⯆local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))local keys = script.Parentlocal keysFolder = keys.Partslocal keysArray = keysFolder:GetChildren()local function partTouched(otherPart, keyPart)local whichCharacter = otherPart.Parentlocal humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")if humanoid then-- Berikan pemain kunci dan hancurkan bagian kunci-- =============================================treasureManager.getKey(keyPart, whichCharacter)-- =============================================endendJalankan proyek dan periksa bahwa menyentuh kunci menghancurkannya.
Tips pemecahan masalah
Masalah: Mendapatkan pesan kesalahan yang mencakup: "Infinite yield possible".
- Periksa ejaan skrip modul Anda dalam skrip. Jika skrip modul, seperti TreasureManager, dieja berbeda, akan ada kesalahan.
Masalah: Mendapatkan pesan kesalahan yang mencakup: "attempt to index global".
- Periksa baris yang mencakup require untuk skrip modul di keyScript. Jika modul tidak menyertakan require, ia tidak dapat menggunakan fungsi dan variabel dari skrip modul itu.
Masalah: Skrip tidak berjalan atau tidak dapat mengambil kunci.
Di dalam skrip modul, pastikan bahwa semua kode berada di antara local TreasureManager = {} dan return TreasureManager. Return harus menjadi baris terakhir dari kode dalam Skrip Modul.
Periksa bahwa ada dua tanda kurung di akhir baris dengan require, seperti di WaitForChild("TreasureManager")).
Buat Fungsi Lokal
Saat ini, papan peringkat melacak kunci dan harta pemain. Untuk mengubah angka papan peringkat, gunakan fungsi lokal dalam skrip modul. Fungsi lokal digunakan karena mengubah nilai kunci atau harta pemain hanya akan diperlukan dalam skrip TreasureManager, tidak di tempat lain.
Di ServerStorage, buka skrip TreasureManager.
Buat variabel lokal untuk melakukan hal berikut:
Dapatkan layanan Pemain sehingga skrip dapat bekerja dengan statistik papan peringkat pemain.
Simpan jumlah kunci yang diterima pemain setelah menyentuh keyPart.
local TreasureManager = {}local Players = game:GetService("Players")local keyDrop = 1------------------ Fungsi Lokal------------------ Fungsi Modulfunction TreasureManager.getKey(keyPart, whichCharacter)keyPart:Destroy()endreturn TreasureManagerSalin dan tempel dua fungsi lokal ini ke dalam bagian Fungsi Lokal.
getPlayerKeys() mengembalikan nilai dari Lockpicks leaderstat pemain.
getPlayerTreasure() mengembalikan nilai dari Treasure leaderstat pemain.
------------------ Fungsi Lokallocal function getPlayerKeys(whichCharacter)local player = Players:GetPlayerFromCharacter(whichCharacter)local leaderstats = player:FindFirstChild("leaderstats")return leaderstats:WaitForChild("Lockpicks")endlocal function getPlayerTreasure(whichCharacter)local player = Players:GetPlayerFromCharacter(whichCharacter)local leaderstats = player:FindFirstChild("leaderstats")return leaderstats:WaitForChild("Treasure")end------------------ Fungsi ModulUntuk menambahkan kunci pemain, di dalam fungsi modul getKey():
Buat variabel local untuk memanggil getPlayerKeys(whichCharacter).
Tambahkan nilai keyDrop ke playerKeys.
------------------ Fungsi Modulfunction TreasureManager.getKey(keyPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)playerKeys.Value = playerKeys.Value + keyDropkeyPart:Destroy()endJalankan proyek. Periksa bahwa menyentuh kunci menghancurkannya dan menambahkan 1 ke kunci pemain di papan peringkat.

Jika perlu, periksa skrip Anda dengan yang di bawah ini untuk masalah pemecahan masalah.
local TreasureManager = {}
local Players = game:GetService("Players")
local keyDrop = 1
------------------ Fungsi Lokal
local function getPlayerKeys(whichCharacter)
local player = Players:GetPlayerFromCharacter(whichCharacter)
local leaderstats = player:FindFirstChild("leaderstats")
return leaderstats:WaitForChild("Lockpicks")
end
local function getPlayerTreasure(whichCharacter)
local player = Players:GetPlayerFromCharacter(whichCharacter)
local leaderstats = player:FindFirstChild("leaderstats")
return leaderstats:WaitForChild("Treasure")
end
------------------ Fungsi Modul
function TreasureManager.getKey(keyPart, whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
playerKeys.Value = playerKeys.Value + keyDrop
keyPart:Destroy()
end
return TreasureManagerDapatkan informasi dari skrip modul
Skrip modul TreasureManager akan digunakan ketika pemain menyentuh peti harta karun untuk memeriksa apakah mereka memiliki setidaknya satu kunci sebelum membukanya dan memberi mereka emas.
Periksa apakah peti dapat dibuka
Pertama di skrip TreasureManager ⟩ ServerStorage, atur variabel untuk berapa banyak kunci yang dibutuhkan untuk membuka peti, dan berapa banyak emas yang terkandung di setiap peti.
local TreasureManager = {}local Players = game:GetService("Players")local keyDrop = 1local chestPickCost = 1local chestReward = 100------------------ Fungsi Lokallocal function getPlayerKeys(whichCharacter)local player = Players:GetPlayerFromCharacter(whichCharacter)local leaderstats = player:FindFirstChild("leaderstats")return leaderstats:WaitForChild("Lockpicks")endUntuk membuat fungsi yang memeriksa apakah pemain dapat membuka peti, di bagian Fungsi Modul, tambahkan fungsi baru ke tabel TreasureManager bernama canOpenChest() dengan parameter whichCharacter.
------------------ Fungsi Modulfunction TreasureManager.canOpenChest(whichCharacter)endfunction TreasureManager.getKey(keyPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)playerKeys.Value = playerKeys.Value + keyDropkeyPart:Destroy()endSalin dan tempel kode di bawah ini ke dalam canOpenChest() untuk mengembalikan true jika pemain memiliki cukup kunci, dan false jika tidak.
function TreasureManager.canOpenChest(whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)if playerKeys.Value >= chestPickCost thenreturn trueelsereturn falseendend
Berikan harta kepada pemain
Agar pemain dapat membuka peti, buat fungsi di TreasureManager yang memberikan mereka harta.
Tambahkan fungsi modul baru ke TreasureManager bernama openChest().
Lewati dua argumen:
- chestPart - bagian peti yang akan dihancurkan.
- whichCharacter - pemain yang akan diberikan harta.
function TreasureManager.openChest(chestPart, whichCharacter)endUntuk mengurangi kunci pemain dan memberikan mereka harta, salin dan tempel kode di bawah ini ke dalam openChest(). Kode ini menggunakan variabel yang dibuat sebelumnya, seperti chestReward, jumlah harta yang diberikan per peti.
function TreasureManager.openChest(chestPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)local playerTreasure = getPlayerTreasure(whichCharacter)playerKeys.Value = playerKeys.Value - chestPickCostplayerTreasure.Value = playerTreasure.Value + chestRewardchestPart.Parent:Destroy()end
Panggil fungsi peti
Sekarang bahwa dua fungsi modul, canOpenChest() dan openChest(), telah dibuat, mereka dapat dipanggil oleh bagian Chest setiap kali pemain menyentuhnya menggunakan fungsi partTouched() yang sudah dibuat.
Di Workspace ⟩ Chests buka ChestScript.
Buat variabel baru bernama treasureManager dan memerlukan skrip modul TreasureManager di ServerStorage.
local ServerStorage = game:GetService("ServerStorage")-- Memerlukan skrip modul di bawahlocal treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))local chests = script.Parentlocal chestsFolder = chests.Partslocal chestsArray = chestsFolder:GetChildren()Di partTouched(), di bawah pernyataan if humanoid, buat variabel baru bernama canOpen dan setel nilainya menjadi:
treasureManager.canOpenChest(whichCharacter)
local function partTouched(otherPart, chestPart)local whichCharacter = otherPart.Parentlocal humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")if humanoid then-- Periksa apakah pemain dapat membuka peti, lalu biarkan mereka mendapatkan harta-- =============================================local canOpen = treasureManager.canOpenChest(whichCharacter)-- =============================================endendSelanjutnya, buat pernyataan if untuk memeriksa apakah canOpen benar.
Jika ya, panggil fungsi openChest() dari TreasureManager.
Kemudian, lewati dua parameter: chestPart, peti yang akan dihancurkan, dan whichCharacter, pemain yang akan diberikan harta.
local function partTouched(otherPart, chestPart)local whichCharacter = otherPart.Parentlocal humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")if humanoid then-- Periksa apakah pemain dapat membuka peti, lalu biarkan mereka mendapatkan harta-- =============================================local canOpen = treasureManager.canOpenChest(whichCharacter)if canOpen == true thentreasureManager.openChest(chestPart, whichCharacter)end-- =============================================endendJalankan proyek. Periksa bahwa:
- Jika Anda memiliki setidaknya 1 kunci, menyentuh peti akan menghancurkannya dan memberikan harta.
- Jika Anda memiliki 0 kunci, Anda tidak dapat membuka peti harta.
Tips pemecahan masalah
Di ChestScript, pastikan bahwa fungsi yang dipanggil dari skrip modul seperti canOpenChest() dieja persis seperti yang ditemukan dalam skrip TreasureManager. Setiap perbedaan akan menyebabkan kesalahan.
Periksa bahwa fungsi yang disalin dan ditempel, seperti treasureManager.openChest(), persis seperti yang ditunjukkan dalam pelajaran. Setiap perbedaan dapat menyebabkan kesalahan halus dalam skrip.
Skrip yang selesai
local TreasureManager = {}
local Players = game:GetService("Players")
local keyDrop = 1
local chestPickCost = 1
local chestReward = 100
------------------ Fungsi Lokal
local function getPlayerKeys(whichCharacter)
local player = Players:GetPlayerFromCharacter(whichCharacter)
local leaderstats = player:FindFirstChild("leaderstats")
return leaderstats:WaitForChild("Lockpicks")
end
local function getPlayerTreasure(whichCharacter)
local player = Players:GetPlayerFromCharacter(whichCharacter)
local leaderstats = player:FindFirstChild("leaderstats")
return leaderstats:WaitForChild("Treasure")
end
------------------ Fungsi Modul
function TreasureManager.openChest(chestPart, whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
local playerTreasure = getPlayerTreasure(whichCharacter)
playerKeys.Value = playerKeys.Value - chestPickCost
playerTreasure.Value = playerTreasure.Value + chestReward
chestPart.Parent:Destroy()
end
function TreasureManager.canOpenChest(whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
if playerKeys.Value >= chestPickCost then
return true
else
return false
end
end
function TreasureManager.getKey(keyPart, whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
playerKeys.Value = playerKeys.Value + keyDrop
keyPart:Destroy()
end
return TreasureManagerlocal ServerStorage = game:GetService("ServerStorage")
-- Memerlukan skrip modul di bawah ⯆
local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
local chests = script.Parent
local chestsFolder = chests.Parts
local chestsArray = chestsFolder:GetChildren()
local function partTouched(otherPart, chestPart)
local whichCharacter = otherPart.Parent
local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
if humanoid then
-- Periksa apakah pemain dapat membuka peti, lalu biarkan mereka mendapatkan harta
-- =============================================
local canOpen = treasureManager.canOpenChest(whichCharacter)
if canOpen == true then
treasureManager.openChest(chestPart, whichCharacter)
end
-- =============================================
end
end
-- Mengikat setiap bagian peti ke fungsi sentuh sehingga berfungsi di semua bagian
for chestIndex = 1, #chestsArray do
local chestPart = chestsArray[chestIndex]:WaitForChild("Collider")
chestPart.Touched:Connect(function(otherPart)
partTouched(otherPart, chestPart)
end)
endlocal ServerStorage = game:GetService("ServerStorage")
-- Memerlukan skrip modul di bawah ⯆
local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
local keys = script.Parent
local keysFolder = keys.Parts
local keysArray = keysFolder:GetChildren()
local function partTouched(otherPart, keyPart)
local whichCharacter = otherPart.Parent
local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
if humanoid then
-- Berikan pemain kunci dan hancurkan bagian kunci
-- =============================================
treasureManager.getKey(keyPart, whichCharacter)
-- =============================================
end
end
-- Mengikat setiap bagian kunci ke fungsi sentuh sehingga berfungsi di semua bagian
for keyIndex = 1, #keysArray do
local keyPart = keysArray[keyIndex]
keyPart.Touched:Connect(function(otherPart)
partTouched(otherPart, keyPart)
end)
endRingkasan
Aplikasi umum dari penggunaan skrip modul dalam permainan Roblox adalah untuk menangani tugas umum yang digunakan oleh pemain, seperti memberikan mereka poin. Untuk contoh ini, skrip modul bernama TreasureManager dibuat untuk menangani pemberian kunci dan harta kepada pemain setiap kali mereka berinteraksi dengan objek dalam permainan.