
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
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.
ServerStorage içinde yeni bir ModuleScript oluşturun ve adını TreasureManager olarak değiştirin.

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
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 TreasureManagerModü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)endreturn TreasureManagergetKey() 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.
Workspace ⟩ Keys ⟩ KeyScript içindeki anahtar betiğini açın.
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 gerektirlocal treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))local keys = script.Parentlocal keysFolder = keys.Partslocal keysArray = keysFolder:GetChildren()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 gerektirlocal 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-- Oyuncuya bir anahtar ver ve anahtar parçasını yok et-- =============================================treasureManager.getKey(keyPart, whichCharacter)-- =============================================endendProjeyi ç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.
ServerStorage içinde TreasureManager betiğini açın.
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()endreturn TreasureManagerAş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 Fonksiyonlarlocal 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------------------ Modül Fonksiyonları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 + keyDropkeyPart:Destroy()endProjeyi ç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.
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 TreasureManagerModü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
Öncelikle ServerStorage ⟩ TreasureManager 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 = 1local chestPickCost = 1local chestReward = 100------------------ Yerel Fonksiyonlarlocal function getPlayerKeys(whichCharacter)local player = Players:GetPlayerFromCharacter(whichCharacter)local leaderstats = player:FindFirstChild("leaderstats")return leaderstats:WaitForChild("Lockpicks")endBir 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)endfunction TreasureManager.getKey(keyPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)playerKeys.Value = playerKeys.Value + keyDropkeyPart:Destroy()endAş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 thenreturn trueelsereturn falseendend
Oyunculara hazine verin
Bir oyuncunun bir sandığı açabilmesi için, TreasureManager içinde onlara hazine veren bir fonksiyon oluşturun.
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)endBir 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 - chestPickCostplayerTreasure.Value = playerTreasure.Value + chestRewardchestPart.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.
Workspace ⟩ Chests içinde ChestScript'i açın.
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 gerektirlocal treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))local chests = script.Parentlocal chestsFolder = chests.Partslocal chestsArray = chestsFolder:GetChildren()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.Parentlocal 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)-- =============================================endendArdı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.Parentlocal 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 thentreasureManager.openChest(chestPart, whichCharacter)end-- =============================================endendProjeyi ç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
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 TreasureManagerlocal 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)
endlocal 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.