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

  1. Başlangıç projesini indirin.

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

  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'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

  1. 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 TreasureManager
  2. Modü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)
    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 scriptlerde kullanılabilir. Bu fonksiyonu test etmek için, önceden yapılmış bir scripti açacak ve çağıracaksınız.

  1. WorkspaceKeysKeyScript içindeki anahtar scriptini açın.

  2. 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.Parent
    local keysFolder = keys.Parts
    local keysArray = keysFolder:GetChildren()
  3. 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.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: "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.

  1. ServerStorage içinde TreasureManager scriptini açın.

  2. 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()
    end
    return TreasureManager
  3. Aş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 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.

    • playerKeys'e keyDrop değerini 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 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

  1. Öncelikle ServerStorageTreasureManager 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 = 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. canOpenChest() 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 then
    return true
    else
    return false
    end
    end

Oyunculara hazine verin

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

  1. 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)
    end
  2. Bir 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 - chestPickCost
    playerTreasure.Value = playerTreasure.Value + chestReward
    chestPart.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.

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

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

    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 et, sonra onlara hazine ver
    -- =============================================
    local canOpen = treasureManager.canOpenChest(whichCharacter)
    -- =============================================
    end
    end
  4. Sonra, 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.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
  5. Projeyi ç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.

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