
Modül scriptleri konusundaki bilginizi 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 scripti oluşturun.
Proje kurulumu
Bu proje, anahtarlar ve hazine sandıkları için liderlik tablosu ve komut dosyası ile yerleştirilen nesneler içeren 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 scripti oluşturun
Oyuncuların sandıklardan hazine alabilmesi için, TreasureManager adında bir modül scripti oluşturun. Bir modül scripti kullanmak, alımları ve liderlik tablolarını birbirine bağlayacaktır.
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'u her iki yerde TreasureManager ile değiştirerek yeniden adlandırın.
local TreasureManager = {}return TreasureManager
Modül scriptlerinde fonksiyonlar kullanma
Modül scriptlerinde fonksiyonların nasıl çalıştığını test etmek için, getKey() adında yeni bir fonksiyon oluşturun. getKey() fonksiyonu başka bir scriptten çağrıldığında, bir anahtar parçasını yok edecek ve oyuncunun envanterindeki anahtar sayısını 1 artıracaktır.
Anahtarlar için bir modül fonksiyonu oluşturun
Bu modül scripti, modül ve yerel fonksiyonların bir kombinasyonunu kullanacaktır, bunları ayırmanıza yardımcı olmak için iki yorum satırı yazın.
local TreasureManager = {}------------------ Yerel Fonksiyonlar------------------ Modül Fonksiyonlarıreturn TreasureManagerModül Fonksiyonları yorumunun altına, TreasureManager adında yeni bir modül fonksiyonu ekleyin ve bu fonksiyona getKey() adını verin.
İki parametre kullanın:
- keyPart - yok edilecek 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 scriptlerde kullanılabilir. Bu fonksiyonu test etmek için, önceden yapılmış bir scripti açacak ve çağıracaksınız.
Workspace ⟩ Keys ⟩ KeyScript içindeki anahtar scriptini açın.
keyScript içinde, modül scriptini treasureManager adında bir değişkende depolayın ve şöyle ayarlayın: require(ServerStorage:WaitForChild("TreasureManager"))
local ServerStorage = game:GetService("ServerStorage")-- Aşağıdaki modül scriptini içe aktar ⯆local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))local keys = script.Parentlocal keysFolder = keys.Partslocal keysArray = keysFolder:GetChildren()partTouched() adında önceden tanımlanmış bir fonksiyon zaten var. Bir oyuncunun parçaya dokunması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 scriptini içe aktar ⯆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-- 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: "Sonsuz yield mümkün" içeren bir hata mesajı alıyorsunuz.
- Scriptteki modül scriptinizin yazımını kontrol edin. TreasureManager gibi bir modül scriptinin yazımı farklıysa, hata meydana gelecektir.
Sorun: "global" indeksleme denemesi içeren bir hata mesajı alıyorsunuz.
- keyScript içindeki modül scripti için require edilmiş satırı kontrol edin. Eğer modül require içermezse, o modül scriptinden fonksiyonları ve değişkenleri kullanamazsınız.
Sorun: Script çalışmıyor ya da anahtarları alamıyorsunuz.
Modül scriptinde, tüm kodun local TreasureManager = {} ve return TreasureManager arasında olduğundan emin olun. Dönüş, bir Modül Scriptindeki son satır olmalıdır.
require ile biten satırın sonunda iki parantez olduğundan emin olun, örneğin WaitForChild("TreasureManager")).
Yerel Bir Fonksiyon Oluşturun
Şu an, bir liderlik tablosu bir oyuncunun anahtarlarını ve hazinesini takip ediyor. Liderlik tablosu sayısını değiştirmek için, modül scriptinde yerel bir fonksiyon kullanın. Yerel bir fonksiyon, bir oyuncunun anahtar veya hazine değerlerini değiştirmek için yalnızca TreasureManager scriptinde gerek duyulacağından kullanılır, başka bir yerde değil.
ServerStorage içinde TreasureManager scriptini açın.
Aşağıdakileri yapmak için yerel değişkenler oluşturun:
Oyuncunun liderlik istatistikleriyle çalışmak için Players servisini 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ıp 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.
playerKeys'e keyDrop değerini 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 oyuncunun liderliğinde 1 eklediğini kontrol edin.

Gerekirse, herhangi bir sorun giderme sorunları için scriptinizi aşağıdaki ile karşılaştırın.
Geçerli TreasureManager Scripti
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 scriptlerinden bilgi alın
TreasureManager modül scripti, oyuncular bir hazine sandığına dokunduğunda kullanılacak ve onların açmadan önce en az bir anahtarları olup olmadığını kontrol edecektir ve onlara altın verecektir.
Sandıkların açılıp açılamayacağını kontrol edin
Öncelikle ServerStorage ⟩ TreasureManager scriptinde, bir sandıği açmak için gereken anahtar sayısını 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()endcanOpenChest() içine aşağıdaki kodu kopyala ve yapıştırarak, eğer oyuncunun yeterli anahtarı varsa true döndür, yoksa false döndür.
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 verecek bir fonksiyon oluşturun.
TreasureManager'a openChest() adında yeni bir modül fonksiyonu ekleyin.
İki argüman geçin:
- chestPart - yok edilecek sandık parçası.
- whichCharacter - hazineyi 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ıp yapıştırın. Bu kod, daha önce oluşturulan chestReward gibi değişkenleri kullanır, her sandığın ne kadar hazine verdiği.
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ğırma
Artık canOpenChest() ve openChest() adında iki modül fonksiyonu oluşturuldu, bu fonksiyonlar, oyuncular bir sandığı dokunduğunda partTouched() fonksiyonu ile çağrılabilir.
Workspace ⟩ Chests içinde ChestScript açın.
ServerStorage içinde TreasureManager modül scriptini içe aktarmak için treasureManager adında yeni bir değişken oluşturun.
local ServerStorage = game:GetService("ServerStorage")-- Aşağıdaki modül scriptini içe aktarlocal 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:
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 et, sonra onlara hazine ver-- =============================================local canOpen = treasureManager.canOpenChest(whichCharacter)-- =============================================endendSonra, 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.
Daha sonra 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 et, sonra onlara hazine ver-- =============================================local canOpen = treasureManager.canOpenChest(whichCharacter)if canOpen == true thentreasureManager.openChest(chestPart, whichCharacter)end-- =============================================endendProjeyi çalıştırın. Kontrol edin ki:
- 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, modül scriptinden çağrılan fonksiyonların, örneğin canOpenChest(), TreasureManager scriptinde tam olarak nasıl bulunduysalar yazıldığından emin olun. Herhangi bir farklılık bir hataya yol açabilir.
Kopyalanıp yapıştırılan fonksiyonların, örneğin treasureManager.openChest(), derste gösterildiği gibi tam olduğundan emin olun. Herhangi bir farklılık, scriptte ince hatalara sebep olabilir.
Tamamlanmış scriptler
Tamamlanmış TreasureManager Scripti
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 scriptini içe aktar ⯆
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 et, sonra onlara hazine ver
-- =============================================
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 scriptini içe aktar ⯆
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 deneyimlerinde modül scriptlerini kullanmanın yaygın bir uygulaması, oyunculara puan vermek gibi ortak görevleri yönetmektir. Bu örnek için, oyuncuların oyun içindeki nesnelerle etkileşime girdiklerinde anahtarlar ve hazine veren bir modül scripti olan TreasureManager oluşturulmuştur.