Membuat dengan Modul Skrip

*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 script modul, buat script modul yang memungkinkan pemain untuk mengambil kunci dan menggunakannya untuk membuka peti harta karun.

Pengaturan Proyek

Proyek ini termasuk peta pemula dengan objek pengambilan berjalan dan objek pengambilan berjalan untuk kunci dan peti harta karun.

Muat Proyek Pemula

  1. Unduh proyek pemula.

  2. Di Roblox Studio, buka file yang diunduh: Intro to Module Scripts - Starter Project.rbxl .

Buat Skrip Modul

Jadi pemain dapat mendapatkan harta karun dari peti, membuat skrip modul bernama TreasureManager . Menggunakan modul script akan menghubungkan pickups dan leaderboard bersama-sama.

  1. Di ServerStorage , buat modul baru ModuleScript dan ganti nama itu TreasureManager .

  2. Di TreasureManager, ganti tabel modul default dengan menyetel ulang module dengan TreasureManager di kedua tempat.


    local TreasureManager = {}
    return TreasureManager

Menggunakan Fungsi dalam Modul Skrip

Untuk menguji cara fungsi bekerja dalam script modul, buat fungsi baru bernama getKey(). Ketika fungsi getKey() dapat dipanggil dari script lain, itu akan menerima bagian kunci untuk menghancurkan dan menambahkan 1 ke nomor kunci pemain di inventaris pemain.

Buat Fungsi Modul untuk kunci

  1. Skrip modul ini akan menggunakan kombinasi module dan fungsi lokal, tulis dua komentar untuk membantu Anda menjaga mereka terpisah.


    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 untuk dihancurkan.
    • whichCharacter - pemain yang menyentuh bagian kunci.

    local TreasureManager = {}
    ------------------ Fungsi Lokal
    ------------------ Fungsi Modul
    function TreasureManager.getKey(keyPart, whichCharacter)
    end
    return TreasureManager
  3. 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 ini, Anda akan membuka skrip prasetel dan meneleponnya.

  1. Buka naskah kunci di Ruang kerja > Tombol > Tombol pemutar .

  2. Di keyScript, simpan script modul dalam variabel bernama treasureManager dan tetapkan sama dengan: require(ServerStorage:WaitForChild("TreasureManager"))


    local ServerStorage = game:GetService("ServerStorage")
    -- Butuhkan naskah 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 apakah seorang pemain menyentuh bagian. Di dalam partTouched() :

    • Panggil fungsi modul getKey() untuk menghancurkan unit.
    • Pass dalam keyPart dan whichCharacter.

    local ServerStorage = game:GetService("ServerStorage")
    -- Butuhkan naskah 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. Lari proyek dan periksa bahwa menyentuh kunci menghancurkannya.

Tips Troubleshoot

Masalah: Dapatkan pesan kesalahan termasuk: "Infinite yield possible".

  • Periksa tata bahasa modul skrip Anda dalam script. Jika modul skrip, seperti TreasureManager , diucapkan secara berbeda, akan ada kesalahan. Masalah: Dapatkan pesan kesalahan termasuk: "attempt to index global".

  • Periksa garis yang mencakup persyaratan untuk skrip modul di keyScript . Jika modul tidak mencakup mensyaratkan/mengharuskan, itu tidak dapat menggunakan fungsi dan variabel dari skrip modul tersebut. Masalah: Skrip tidak berjalan atau tidak dapat mengambil kunci.

  • Dalam naskah modul, pastikan bahwa semua kode berada di antara local TreasureManager = {} dan return TreasureManager . Return harus menjadi baris terakhir dari kode dalam Naskah Modul.

  • Periksa apakah ada dua parenthes di akhir baris dengan mensyaratkan/mengharuskan, seperti dalam WaitForChild("TreasureManager")).

Buat Fungsi Lokal

Saat ini, papan peringkat melacak kunci dan harta karun pemain. Untuk mengubah nomor papan peringkat, gunakan fungsi lokal dalam script modul. Fungsi lokal digunakan karena mengubah nilai kunci atau harta karun pemain hanya akan diperlukan dalam script TreasureManager, tidak di tempat lain.

  1. Di ServerStorage , buka script TreasureManager.

  2. Buat variabel lokal untuk melakukan mengikuti:

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

    • getPlayerKeys() mengembalikan nilai pemimpin pemain Lockpicks .

    • getPlayerTreasure() mengembalikan nilai pemimpin 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
    ------------------ Module Functions
  4. Untuk menambahkan ke kunci pemain, 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 menghancurkannya dan menambahkan 1 ke kunci pemain di papan peringkat.

Jika perlu, periksa script Anda terhadap yang berikut untuk masalah solusi.

Current TreasureManager Script

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

Mendapatkan Informasi Dari Script 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 Bisa Dibuka

  1. Pertama di ServerStorage > TreasureManager skrip, konfigurasikan variabel untuk jumlah kunci yang dibutuhkan untuk membuka peti, dan berapa banyak emas 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 2> whichCharacter2> .


    ------------------ 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. Salinan dan pasta kode di bawah ini ke canOpenChest() untuk mengembalikan true jika pemain memiliki cukup kunci, dan false jika mereka tidak.


    function TreasureManager.canOpenChest(whichCharacter)
    local playerKeys = getPlayerKeys(whichCharacter)
    if playerKeys.Value >= chestPickCost then
    return true
    else
    return false
    end
    end

Berikan Permata Pemain

Jadi pemain dapat membuka peti, membuat fungsi di TreasureManager yang memberi mereka harta karun.

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

    Melewati dua argumen:

    • chestPart - bagian dada untuk dihancurkan.
    • whichCharacter - pemain untuk memberikan harta karun.

    function TreasureManager.openChest(chestPart, whichCharacter)
    end
  2. Untuk mengurangkan kunci pemain dan memberi mereka harta karun, salinan dan pasang kode di bawah ini di openChest() . Kode ini menggunakan variabel yang dibuat sebelumnya, seperti chestReward , jumlah harta karun 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:Destroy()
    end

Panggil Fungsi Peti

Sekarang bahwa dua fungsi modul, canOpenChest() dan openChest(), telah dibuat, mereka dapat dipanggil oleh bagian Chest setiap kali seorang pemain menyentuh mereka menggunakan fungsi premade partTouched() .

  1. Dalam Ruang kerja > Peti > Buka1>ChestScript1>.

  2. Buat variabel baru bernama treasureManager dan memerlukan script modul TreasureManager di ServerStorage .


    local ServerStorage = game:GetService("ServerStorage")
    -- Memerlukan naskah modul di bawah ini
    local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
    local chests = script.Parent
    local chestsFolder = chests.Parts
    local chestsArray = chestsFolder:GetChildren()
  3. Dalam partTouched() , di bawah pernyataan if humanoid, buat variabel baru bernama canOpen dan tetapkan sama dengan:

    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, lalu biarkan mereka mendapatkan harta karun
    -- ======
    local canOpen = treasureManager.canOpenChest(whichCharacter)
    -- ======
    end
    end
  4. Selanjutnya, buat pernyataan if untuk memeriksa apakah canOpen benar.

    • Jika demikian, panggil fungsi openChest() TreasureManager.

    • Kemudian, melewati dua parameter: chestPart, peti untuk dihancurkan, dan whichCharacter, pemain untuk memberikan harta karun.


    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 karun
    -- ======
    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 unit, menyentuh peti akan menghancurkannya dan memberikan harta karun.
    • Jika Anda memiliki 0 kunci, Anda tidak dapat membuka peti harta karun.

Tips Troubleshoot

  • Dalam ChestScript, pastikan bahwa fungsi yang dipanggil dari script modul seperti canOpenChest() diaktifkan dengan benar seperti yang ditemukan dalam script TreasureManager. Setiap perbedaan akan menyebabkan kesalahan.

  • Periksa bahwa fungsi yang disalin dan ditempel, seperti treasureManager.openChest() , sama persis seperti yang ditunjukkan dalam pelajaran. Perbedaan dapat menyebabkan kesalahan subyektif dalam script.

Skrip Selesai

Selesai Menyelesaikan Skrip TreasureManager

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: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
Selesai ChestScript

local ServerStorage = game:GetService("ServerStorage")
-- Butuhkan naskah 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, lalu biarkan mereka mendapatkan harta karun
-- ======
local canOpen = treasureManager.canOpenChest(whichCharacter)
if canOpen == true then
treasureManager.openChest(chestPart, whichCharacter)
end
-- ======
end
end
-- Ikat setiap bagian dada ke fungsi sentuh sehingga itu bekerja di semua bagian
for chestIndex = 1, #chestsArray do
local chestPart = chestsArray[chestIndex]
chestPart.Touched:Connect(function(otherPart)
partTouched(otherPart, chestPart)
end)
end
KeyScript selesai

local ServerStorage = game:GetService("ServerStorage")
-- Butuhkan naskah 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
-- Ikat setiap bagian kunci ke fungsi sentuh sehingga itu bekerja di semua bagian
for keyIndex = 1, #keysArray do
local keyPart = keysArray[keyIndex]
keyPart.Touched:Connect(function(otherPart)
partTouched(otherPart, keyPart)
end)
end

Sintesis

Aplikasi umum menggunakan script modul dalam game Roblox adalah menangani tugas umum yang digunakan oleh pemain, seperti memberi mereka poin. Untuk contoh ini, script modul bernama TreasureManager dibuat untuk menangani memberikan kunci pemain dan harta karun setiap kali mereka berinteraksi dengan objek dalam game.