Modül betikleri ile oluşturun

*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.

Modül betikleri bilgilerinizi uygulamak için, oyuncuların anahtarları almasına ve bunları hazine sandıklarını açmak için kullanmasına olanak tanıyan bir modül betiği oluşturun.

Proje kurulumu

Bu proje, anahtarlar ve hazine sandıkları için liderlik tablosu ve betiklenmiş toplama nesneleri ile bir başlangıç haritası içerir.

Başlangıç projesini yükleyin

  1. Başlangıç projesini indirin.

  2. Roblox Studio'da indirilen dosyayı açın: Modül Betiklerine Giriş - Başlangıç Projesi.rbxl.

Bir modül betiği oluşturun

Oyuncuların sandıklardan hazine alabilmesi için, TreasureManager adında bir modül betiği oluşturun. Bir modül betiği kullanmak, toplama nesnelerini ve liderlik tablolarını bir araya getirecektir.

  1. ServerStorage içinde yeni bir ModuleScript oluşturun ve adını TreasureManager olarak değiştirin.

  2. TreasureManager içinde, varsayılan modül tablosunun adını module kelimesini her iki yerde de TreasureManager ile değiştirerek yeniden adlandırın.

    local TreasureManager = {}
    return TreasureManager

Modül betiklerinde fonksiyonları kullanma

Modül betiklerinde fonksiyonların nasıl çalıştığını test etmek için, getKey() adında yeni bir fonksiyon oluşturun. getKey() fonksiyonu başka bir betikten çağrıldığında, yok edilmesi gereken bir anahtar parçası alacak ve oyuncunun envanterindeki anahtar sayısını 1 artıracaktır.

Anahtarlar için bir modül fonksiyonu oluşturun

  1. Bu modül betiği, modül ve yerel fonksiyonların bir kombinasyonunu kullanacak, bunları ayırmanıza yardımcı olması için iki yorum yazın.

    local TreasureManager = {}
    ------------------ Yerel Fonksiyonlar
    ------------------ Modül Fonksiyonları
    return TreasureManager
  2. Modül Fonksiyonları yorumunun altında, TreasureManager'a getKey() adında yeni bir modül fonksiyonu ekleyin.

    İki parametre kullanın:

    • keyPart - yok edilmesi gereken parça.
    • whichCharacter - anahtar parçasına dokunan oyuncu.
    local TreasureManager = {}
    ------------------ Yerel Fonksiyonlar
    ------------------ Modül Fonksiyonları
    function TreasureManager.getKey(keyPart, whichCharacter)
    end
    return TreasureManager
  3. getKey() içinde, keyPart'ı yok edin.

    function TreasureManager.getKey(keyPart, whichCharacter)
    keyPart:Destroy()
    end

Modül fonksiyonunu kullanma

Artık getKey() modül fonksiyonu diğer betiklerde kullanılabilir. Bu fonksiyonu test etmek için, önceden hazırlanmış bir betiği açacak ve onu çağıracaksınız.

  1. WorkspaceKeysKeyScript içindeki anahtar betiğini açın.

  2. keyScript içinde, modül betiğini treasureManager adında bir değişkende saklayın ve bunu şu şekilde ayarlayın: require(ServerStorage:WaitForChild("TreasureManager"))

    local ServerStorage = game:GetService("ServerStorage")
    -- Aşağıdaki modül betiğini gerektir
    local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
    local keys = script.Parent
    local keysFolder = keys.Parts
    local keysArray = keysFolder:GetChildren()
  3. partTouched() adında zaten bir fonksiyon var. Bu fonksiyon, bir oyuncunun parçaya dokunup dokunmadığını kontrol eder. partTouched() içinde:

    • Anahtarı yok etmek için getKey() modül fonksiyonunu çağırın.
    • keyPart ve whichCharacter'ı geçirin.
    local ServerStorage = game:GetService("ServerStorage")
    -- Aşağıdaki modül betiğini gerektir
    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
    -- Oyuncuya bir anahtar ver ve anahtar parçasını yok et
    -- =============================================
    treasureManager.getKey(keyPart, whichCharacter)
    -- =============================================
    end
    end
  4. Projeyi çalıştırın ve bir anahtara dokunmanın onu yok ettiğini kontrol edin.

Sorun giderme ipuçları

Sorun: "Infinite yield possible" içeren bir hata mesajı alıyorsunuz.

  • Betikteki modül betiğinizin yazımını kontrol edin. TreasureManager gibi bir modül betiği farklı yazılmışsa, hata oluşacaktır.

Sorun: "attempt to index global" içeren bir hata mesajı alıyorsunuz.

  • keyScript içindeki modül betiği için gereksinim içeren satırı kontrol edin. Modül require içermiyorsa, o modül betiğindeki fonksiyonları ve değişkenleri kullanamaz.

Sorun: Betik çalışmıyor veya anahtarları alamıyorsunuz.

  • Modül betiğinde, tüm kodun local TreasureManager = {} ve return TreasureManager arasında olduğundan emin olun. Dönüş, bir Modül Betiğindeki son satır olmalıdır.

  • require ile ilgili satırın sonunda iki parantez olduğundan emin olun, örneğin WaitForChild("TreasureManager")).

Yerel Bir Fonksiyon Oluşturun

Şu anda, bir liderlik tablosu bir oyuncunun anahtarlarını ve hazinesini takip ediyor. Liderlik tablosu sayılarını değiştirmek için, modül betiğinde bir yerel fonksiyon kullanın. Yerel bir fonksiyon kullanılır çünkü bir oyuncunun anahtar veya hazine değerlerini değiştirmek yalnızca TreasureManager betiğinde gerekecektir, başka bir yerde değil.

  1. ServerStorage içinde TreasureManager betiğini açın.

  2. Aşağıdakileri yapmak için yerel değişkenler oluşturun:

    • Oyuncunun liderlik tablosu istatistikleri ile çalışabilmesi için Players hizmetini alın.

    • keyPart'a dokunduktan sonra oyuncunun aldığı anahtar sayısını saklayın.

    local TreasureManager = {}
    local Players = game:GetService("Players")
    local keyDrop = 1
    ------------------ Yerel Fonksiyonlar
    ------------------ Modül Fonksiyonları
    function TreasureManager.getKey(keyPart, whichCharacter)
    keyPart:Destroy()
    end
    return TreasureManager
  3. Aşağıdaki iki yerel fonksiyonu Yerel Fonksiyonlar bölümüne kopyalayın ve yapıştırın.

    • getPlayerKeys() oyuncunun Lockpicks lider istatistiğinin değerini döndürür.

    • getPlayerTreasure() oyuncunun Treasure lider istatistiğinin değerini döndürür.

    ------------------ Yerel Fonksiyonlar
    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
    ------------------ Modül Fonksiyonları
  4. Oyuncunun anahtarlarını eklemek için, getKey() modül fonksiyonunda:

    • getPlayerKeys(whichCharacter) çağırmak için bir local değişken oluşturun.

    • keyDrop değerini playerKeys'e ekleyin.

    ------------------ Modül Fonksiyonları
    function TreasureManager.getKey(keyPart, whichCharacter)
    local playerKeys = getPlayerKeys(whichCharacter)
    playerKeys.Value = playerKeys.Value + keyDrop
    keyPart:Destroy()
    end
  5. Projeyi çalıştırın. Bir anahtara dokunmanın onu yok ettiğini ve liderlik tablosundaki oyuncunun anahtarlarına 1 eklediğini kontrol edin.

Gerekirse, sorun giderme sorunları için betiğinizi aşağıdaki ile karşılaştırın.

Mevcut TreasureManager Betiği
local TreasureManager = {}
local Players = game:GetService("Players")
local keyDrop = 1
------------------ Yerel Fonksiyonlar
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
------------------ Modül Fonksiyonları
function TreasureManager.getKey(keyPart, whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
playerKeys.Value = playerKeys.Value + keyDrop
keyPart:Destroy()
end
return TreasureManager

Modül betiklerinden bilgi alın

TreasureManager modül betiği, oyuncular bir hazine sandığına dokunduğunda, onu açmadan önce en az bir anahtarlarının olup olmadığını kontrol etmek için kullanılacaktır ve onlara altın verecektir.

Sandıkların açılıp açılamayacağını kontrol edin

  1. Öncelikle ServerStorageTreasureManager betiğinde, bir sandığı açmanın ne kadar anahtar gerektirdiği ve her sandığın ne kadar altın içerdiği için değişkenler ayarlayın.

    local TreasureManager = {}
    local Players = game:GetService("Players")
    local keyDrop = 1
    local chestPickCost = 1
    local chestReward = 100
    ------------------ Yerel Fonksiyonlar
    local function getPlayerKeys(whichCharacter)
    local player = Players:GetPlayerFromCharacter(whichCharacter)
    local leaderstats = player:FindFirstChild("leaderstats")
    return leaderstats:WaitForChild("Lockpicks")
    end
  2. Bir oyuncunun bir sandığı açıp açamayacağını kontrol eden bir fonksiyon oluşturmak için, Modül Fonksiyonları bölümünde TreasureManager tablosuna canOpenChest() adında yeni bir fonksiyon ekleyin ve whichCharacter parametresini kullanın.

    ------------------ Modül Fonksiyonları
    function TreasureManager.canOpenChest(whichCharacter)
    end
    function TreasureManager.getKey(keyPart, whichCharacter)
    local playerKeys = getPlayerKeys(whichCharacter)
    playerKeys.Value = playerKeys.Value + keyDrop
    keyPart:Destroy()
    end
  3. Aşağıdaki kodu canOpenChest() içine kopyalayın ve yapıştırın, böylece oyuncunun yeterli anahtarı varsa true, yoksa false döndürsün.

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

Oyunculara hazine verin

Bir oyuncunun bir sandığı açabilmesi için, TreasureManager içinde onlara hazine veren bir fonksiyon oluşturun.

  1. TreasureManager'a openChest() adında yeni bir modül fonksiyonu ekleyin.

    İki argüman geçirin:

    • chestPart - yok edilmesi gereken sandık parçası.
    • whichCharacter - hazine verilecek oyuncu.
    function TreasureManager.openChest(chestPart, whichCharacter)
    end
  2. Bir oyuncunun anahtarlarını çıkarmak ve onlara hazine vermek için, openChest() içine aşağıdaki kodu kopyalayın ve yapıştırın. Bu kod, daha önce oluşturulan chestReward gibi değişkenleri kullanır, her sandık için verilen hazine miktarıdır.

    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

Sandık fonksiyonlarını çağırın

Artık iki modül fonksiyonu, canOpenChest() ve openChest(), oluşturulduğuna göre, bunlar bir oyuncu sandıklara dokunduğunda, önceden hazırlanmış partTouched() fonksiyonu kullanılarak çağrılabilir.

  1. WorkspaceChests içinde ChestScript'i açın.

  2. treasureManager adında yeni bir değişken oluşturun ve ServerStorage içindeki TreasureManager modül betiğini gerektirin.

    local ServerStorage = game:GetService("ServerStorage")
    -- Aşağıdaki modül betiğini gerektir
    local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
    local chests = script.Parent
    local chestsFolder = chests.Parts
    local chestsArray = chestsFolder:GetChildren()
  3. partTouched() içinde, if humanoid ifadesinin altında, canOpen adında yeni bir değişken oluşturun ve bunu şu şekilde ayarlayın:

    canOpen = treasureManager.canOpenChest(whichCharacter)

    local function partTouched(otherPart, chestPart)
    local whichCharacter = otherPart.Parent
    local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    -- Oyuncunun bir sandığı açıp açamayacağını kontrol edin, sonra onlara hazine verin
    -- =============================================
    local canOpen = treasureManager.canOpenChest(whichCharacter)
    -- =============================================
    end
    end
  4. Ardından, canOpen'in doğru olup olmadığını kontrol etmek için bir if ifadesi oluşturun.

    • Eğer öyleyse, TreasureManager'ın openChest() fonksiyonunu çağırın.

    • Ardından, iki parametre geçirin: chestPart, yok edilecek sandık ve whichCharacter, hazine verilecek oyuncu.

    local function partTouched(otherPart, chestPart)
    local whichCharacter = otherPart.Parent
    local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    -- Oyuncunun bir sandığı açıp açamayacağını kontrol edin, sonra onlara hazine verin
    -- =============================================
    local canOpen = treasureManager.canOpenChest(whichCharacter)
    if canOpen == true then
    treasureManager.openChest(chestPart, whichCharacter)
    end
    -- =============================================
    end
    end
  5. Projeyi çalıştırın. Kontrol edin:

    • Eğer en az 1 anahtarınız varsa, bir sandığa dokunmak onu yok eder ve hazine verir.
    • Eğer 0 anahtarınız varsa, bir hazine sandığını açamazsınız.

Sorun giderme ipuçları

  • ChestScript içinde, canOpenChest() gibi modül betiğinden çağrılan fonksiyonların TreasureManager betiğindeki gibi tam olarak yazıldığından emin olun. Herhangi bir farklılık hata oluşturacaktır.

  • Kopyalanan ve yapıştırılan fonksiyonların, treasureManager.openChest() gibi, derste gösterildiği gibi tam olarak olduğundan emin olun. Herhangi bir farklılık, betikte ince hatalara neden olabilir.

Tamamlanmış betikler

Tamamlanmış TreasureManager Betiği
local TreasureManager = {}
local Players = game:GetService("Players")
local keyDrop = 1
local chestPickCost = 1
local chestReward = 100
------------------ Yerel Fonksiyonlar
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
------------------ Modül Fonksiyonları
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
Tamamlanmış ChestScript
local ServerStorage = game:GetService("ServerStorage")
-- Aşağıdaki modül betiğini gerektir
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
-- Oyuncunun bir sandığı açıp açamayacağını kontrol edin, sonra onlara hazine verin
-- =============================================
local canOpen = treasureManager.canOpenChest(whichCharacter)
if canOpen == true then
treasureManager.openChest(chestPart, whichCharacter)
end
-- =============================================
end
end
-- Her sandık parçasını dokunma fonksiyonuna bağlar, böylece tüm parçalarda çalışır
for chestIndex = 1, #chestsArray do
local chestPart = chestsArray[chestIndex]:WaitForChild("Collider")
chestPart.Touched:Connect(function(otherPart)
partTouched(otherPart, chestPart)
end)
end
Tamamlanmış keyScript
local ServerStorage = game:GetService("ServerStorage")
-- Aşağıdaki modül betiğini gerektir
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
-- Oyuncuya bir anahtar ver ve anahtar parçasını yok et
-- =============================================
treasureManager.getKey(keyPart, whichCharacter)
-- =============================================
end
end
-- Her anahtar parçasını dokunma fonksiyonuna bağlar, böylece tüm parçalarda çalışır
for keyIndex = 1, #keysArray do
local keyPart = keysArray[keyIndex]
keyPart.Touched:Connect(function(otherPart)
partTouched(otherPart, keyPart)
end)
end

Özet

Roblox oyunlarında modül betiklerinin yaygın bir uygulaması, oyunculara puan verme gibi yaygın görevleri yönetmektir. Bu örnekte, oyunculara oyun içi nesnelerle etkileşime girdiklerinde anahtarlar ve hazine vermek için TreasureManager adında bir modül betiği oluşturulmuştur.

©2026 Roblox Corporation. Roblox, the Roblox logo and Powering Imagination are among our registered and unregistered trademarks in the U.S. and other countries.