Buat dengan skrip modul

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

Untuk menerapkan pengetahuan Anda tentang skrip modul, buat skrip modul yang memungkinkan pemain untuk mengambil kunci dan menggunakannya untuk membuka peti harta karun.

Pengaturan proyek

Proyek ini mencakup peta pemula dengan papan peringkat dan objek pengambilan skrip untuk kunci dan peti harta karun.

Muat proyek awal

  1. Unduh proyek pemula.

  2. Di Roblox Studio, buka file yang telah 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.

  1. Di ServerStorage, buat ModuleScript baru dan ganti namanya menjadi TreasureManager.

  2. 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

  1. Skrip modul ini akan menggunakan kombinasi fungsi modul dan fungsi lokal, ketik dua komentar untuk membantu Anda memisahkannya.


    local TreasureManager = {}
    ------------------ Fungsi Lokal
    ------------------ Fungsi Modul
    return TreasureManager
  2. Di 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 Modul
    function TreasureManager.getKey(keyPart, whichCharacter)
    end
    return TreasureManager
  3. Di 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 tersebut, Anda akan membuka skrip yang sudah dibuat dan memanggilnya.

  1. Buka skrip kunci di WorkspaceKeysKeyScript.

  2. Di dalam keyScript, simpan skrip modul dalam variabel bernama treasureManager dan setel nilainya menjadi: require(ServerStorage:WaitForChild("TreasureManager"))


    local ServerStorage = game:GetService("ServerStorage")
    -- Memanggil skrip modul di bawah ini ⯆
    local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
    local keys = script.Parent
    local keysFolder = keys.Parts
    local keysArray = keysFolder:GetChildren()
  3. Sudah ada fungsi bernama partTouched() untuk memeriksa pemain yang menyentuh bagian tersebut. Di dalam partTouched():

    • Panggil fungsi modul getKey() untuk menghancurkan kunci.
    • Kirim keyPart dan whichCharacter.

    local ServerStorage = game:GetService("ServerStorage")
    -- Memanggil skrip modul di bawah ini ⯆
    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
  4. Jalankan proyek dan periksa bahwa menyentuh kunci akan menghancurkannya.

Tips pemecahan masalah

Masalah: Mendapatkan pesan kesalahan yang menyertakan: "Infinite yield possible".

  • Periksa penulisan skrip modul Anda dalam skrip. Jika skrip modul, seperti TreasureManager, dieja berbeda, akan terjadi kesalahan.

Masalah: Mendapatkan pesan kesalahan yang menyertakan: "attempt to index global".

  • Periksa baris yang menyertakan pemanggilan untuk skrip modul dalam keyScript. Jika modul tidak menyertakan pemanggilan, itu tidak bisa menggunakan fungsi dan variabel dari skrip modul tersebut.

Masalah: Skrip tidak berjalan atau tidak bisa mengambil kunci.

  • Di dalam skrip modul, pastikan bahwa semua kode berada di antara local TreasureManager = {} dan return TreasureManager. Pengembalian harus menjadi baris terakhir kode dalam Skrip Modul.

  • Periksa bahwa terdapat dua tanda kurung di akhir baris dengan pemanggilan, seperti dalam 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 seorang pemain hanya akan diperlukan dalam skrip TreasureManager, tidak di tempat lain.

  1. Di ServerStorage, buka skrip TreasureManager.

  2. Buat variabel lokal untuk melakukan hal berikut:

    • Dapatkan layanan Players 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 Modul
    function TreasureManager.getKey(keyPart, whichCharacter)
    keyPart:Destroy()
    end
    return TreasureManager
  3. Salin dan tempel dua fungsi lokal ini ke dalam bagian Fungsi Lokal.

    • getPlayerKeys() mengembalikan nilai dari leaderstat Lockpicks pemain.

    • getPlayerTreasure() mengembalikan nilai dari leaderstat Treasure pemain.


    ------------------ 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
  4. Untuk menambah jumlah kunci pemain, di dalam fungsi modul getKey():

    • Buat variabel local untuk memanggil getPlayerKeys(whichCharacter).

    • Tambahkan nilai keyDrop ke playerKeys.


    ------------------ Fungsi Modul
    function TreasureManager.getKey(keyPart, whichCharacter)
    local playerKeys = getPlayerKeys(whichCharacter)
    playerKeys.Value = playerKeys.Value + keyDrop
    keyPart:Destroy()
    end
  5. Jalankan proyek. Periksa bahwa menyentuh kunci akan menghancurkannya dan menambah 1 ke kunci pemain di papan peringkat.

Jika perlu, periksa skrip Anda terhadap skrip di bawah ini untuk masalah pemecahan masalah.

Skrip TreasureManager Saat Ini

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 TreasureManager

Dapatkan informasi dari skrip modul

Skrip modul TreasureManager akan digunakan saat pemain menyentuh peti harta untuk memeriksa apakah mereka memiliki setidaknya satu kunci sebelum membukanya dan memberi mereka emas.

Periksa apakah peti dapat dibuka

  1. Pertama, di skrip TreasureManagerServerStorage, atur variabel untuk berapa banyak kunci yang diperlukan untuk membuka peti, dan berapa banyak emas yang terkandung dalam setiap peti.


    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
  2. Untuk 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 Modul
    function TreasureManager.canOpenChest(whichCharacter)
    end
    function TreasureManager.getKey(keyPart, whichCharacter)
    local playerKeys = getPlayerKeys(whichCharacter)
    playerKeys.Value = playerKeys.Value + keyDrop
    keyPart:Destroy()
    end
  3. Salin 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 then
    return true
    else
    return false
    end
    end

Berikan harta kepada pemain

Agar pemain dapat membuka peti, buat fungsi di TreasureManager yang memberikan mereka harta.

  1. Tambahkan fungsi modul baru ke TreasureManager bernama openChest().

    Kirim dua argumen:

    • chestPart - bagian peti untuk dihancurkan.
    • whichCharacter - pemain untuk diberikan harta.

    function TreasureManager.openChest(chestPart, whichCharacter)
    end
  2. Untuk mengurangi jumlah 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 - chestPickCost
    playerTreasure.Value = playerTreasure.Value + chestReward
    chestPart.Parent:Destroy()
    end

Panggil fungsi peti

Sekarang bahwa dua fungsi modul, canOpenChest() dan openChest(), telah dibuat, mereka dapat dipanggil oleh bagian Chest kapan pun pemain menyentuhnya menggunakan fungsi premade partTouched().

  1. Di WorkspaceChests, buka ChestScript.

  2. Buat variabel baru bernama treasureManager dan panggil skrip modul TreasureManager di ServerStorage.


    local ServerStorage = game:GetService("ServerStorage")
    -- Memanggil skrip modul di bawah ini
    local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
    local chests = script.Parent
    local chestsFolder = chests.Parts
    local chestsArray = chestsFolder:GetChildren()
  3. Di dalam 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.Parent
    local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    -- Periksa apakah pemain dapat membuka peti, kemudian biarkan mereka mendapatkan harta
    -- =============================================
    local canOpen = treasureManager.canOpenChest(whichCharacter)
    -- =============================================
    end
    end
  4. Selanjutnya, buat pernyataan if untuk memeriksa apakah canOpen benar.

    • Jika ya, panggil fungsi openChest() dari TreasureManager.

    • Kemudian, kirim dua parameter: chestPart, peti untuk menghancurkan, dan whichCharacter, pemain yang akan diberikan harta.


    local function partTouched(otherPart, chestPart)
    local whichCharacter = otherPart.Parent
    local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    -- Periksa apakah pemain dapat membuka peti, kemudian biarkan mereka mendapatkan harta
    -- =============================================
    local canOpen = treasureManager.canOpenChest(whichCharacter)
    if canOpen == true then
    treasureManager.openChest(chestPart, whichCharacter)
    end
    -- =============================================
    end
    end
  5. Jalankan 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-fungsi yang dipanggil dari skrip modul seperti canOpenChest() dieja persis seperti yang ada di skrip TreasureManager. Setiap perbedaan akan menyebabkan kesalahan.

  • Periksa bahwa fungsi yang disalin dan ditempel, seperti treasureManager.openChest(), adalah tepat seperti yang ditunjukkan dalam pelajaran. Setiap perbedaan dapat menyebabkan kesalahan halus dalam skrip.

Skrip yang Selesai

Skrip TreasureManager 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 TreasureManager
Skrip ChestScript yang Selesai

local ServerStorage = game:GetService("ServerStorage")
-- Memanggil skrip modul di bawah ini ⯆
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, kemudian 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)
end
Skrip keyScript yang Selesai

local ServerStorage = game:GetService("ServerStorage")
-- Memanggil skrip modul di bawah ini ⯆
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)
end

Ringkasan

Aplikasi umum dari penggunaan skrip modul dalam pengalaman 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.

©2026 Roblox Corporation. Roblox, logo Roblox, dan Powering Imagination termasuk dalam merek dagang kami yang terdaftar dan tidak terdaftar di AS dan negara lainnya.