Modül Kodları ile Oluşturma

*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 kodlarınızı uygulamak için, oyuncuların anahtarları toplayabildiği ve hazine sandıklarını açabileceği bir modül kodu oluşturun.

Proje Yapılandırması

Bu proje, anahtar ve hazine sandıkları için lider tablosu ve kodlanmış alışveriş nesneleri içeren başlangıç ​​ haritasını içerir.

Başlangıç ​​Projesini Yükle

  1. Başlangıç ​​projesini indirin.

  2. In Roblox Studio, indirilen dosyayı açın: Modül Kodlarına Giriş - Başlangıç Projesi.rbxl .

Bir Modül Kısmı Oluştur

Oyuncular sandıklardan hazine alabilir, HazineManager adında bir modül scripti oluşturabilir. Bir modül scriptini kullanarak toplama ve lider tablolarını birbiriyle bağlayabilirsiniz.

  1. In ServerStorage , yeni bir ModuleScript oluştur ve onu Hazine Yöneticisi olarak yeniden adlandır.

  2. In TreasureManager , varsayılan modül tablosunu module ile değiştirerek iki yerdeki TreasureManager ile değiştirin.


    local TreasureManager = {}
    return TreasureManager

Modül Kodlarında Fonksiyonları Kullanma

Modül kodlarındaki işlevlerin nasıl çalıştığını test etmek için, şu adımları izleyin: getKey() . getKey() işlevi başka bir koddan çağrıldığında, 1'i oyuncunun envanterindeki anahtar sayısına eklemek için bir anahtar parçası alacak.

Anahtarlar için Modül Fonksiyonu Oluştur

  1. Bu modül kodu, modül ve yerel işlevlerin bir kombinasyonunu kullanır, iki satırını yazın, böylece onları ayrı tutmanızı sağlayacaktır.


    local TreasureManager = {}
    --Local Functions
    --Modül Fonksiyonları
    return TreasureManager
  2. Modül Fonksiyonları yorumuna, TreasureManager adındaki yeni bir modül fonksiyonu ekleyin.

    İki parametre kullanın:

    • keyPart - yok etmek için kullanılan parçalar.
    • whichCharacter - anahtar parçasına dokunan oyuncu.

    local TreasureManager = {}
    --Local Functions
    --Modül Fonksiyonları
    function TreasureManager.getKey(keyPart, whichCharacter)
    end
    return TreasureManager
  3. In getKey() , destroy keyPart .


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

Modül Fonksiyonunu Kullan

Şimdi, modül fonksiyonu getKey() kullanılabilir başka yazılımlarda. Bu işlevi test etmek için önceden yazılmış bir yazılım açıp onu çağırırsınız.

  1. Anahtar kriptini Çalışma Alanı > Anahtarlar > AnahtarScript içinde açın.

  2. In keyScript, modül script'ini treasureManager adında bir değişkende saklayın ve eşit olarak ayarlayın: require(ServerStorage:WaitForChild("TreasureManager"))


    local ServerStorage = game:GetService("ServerStorage")
    -- Aşağıdaki modül kodunu gerektirir ⯆
    local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
    local keys = script.Parent
    local keysFolder = keys.Parts
    local keysArray = keysFolder:GetChildren()
  3. Zaten bir oyuncunun parçaya dokunduğunu test etmek için adlandırılmış bir işlev var. partTouched() içinde:

    • anahtaryok etmek için getKey() modülüne fonksiyonu çağırın.
    • Geçişi keyPart ve whichCharacter .

    local ServerStorage = game:GetService("ServerStorage")
    -- Aşağıdaki modül kodunu gerektirir ⯆
    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 kısmını yok et
    -- =====================================
    treasureManager.getKey(keyPart, whichCharacter)
    -- =====================================
    end
    end
  4. Projeyi çalıştır ve bir anahtarın dokunulmasının yok ettiğinden emin ol.

Hata ayıklama ipuçları

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

  • Bir modül script'inin yazımını bir senaryoda kontrol edin. Eğer bir modül script'i, Hazine Yöneticisi gibi, farklı yazılmışsa, bir hata olacaktır. Sorun: "attempt to index global" .

  • keyScript ile modül kripti için gerekeni içeren satırı kontrol edin. Eğer modül gerekeni içermiyorsa, bu modül kriptinden işlevleri ve değişkenleri kullanamaz. Sorun:: Komut dosyası çalışmaz veya anahtarları almaz.

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

  • Gerektiği ile aynı şekildeki iki ebeveyn olup olmadığını kontrol edin, WaitForChild("TreasureManager")) .

Yerel Bir Fonksiyon Oluştur

Şu anda, bir lider tablosu oyuncunun anahtarını ve hazineyi takip eder. Tabloyu değiştirmek için modül kriptindeki yerel bir işlevi kullanın. Yerel bir işlev kullanılır çünkü bir oyuncunun anahtarını veya hazine değerlerini değiştirmek sadece TreasureManager kriptinde gerekecektir, hiçbir yerde değil.

  1. In ServerStorage , Hazine Yöneticisi script'ini aç.

  2. takip edilenyapmak için yerel değişkenler oluşturun:

    • Yazılımın oyuncu tablosu istatistikleriyle çalışabilmesi için Oyuncular hizmetini alın.

    • Oyuncunun keyPart 'e dokunduktan sonra aldığı anahtar sayısını depolar.


    local TreasureManager = {}
    local Players = game:GetService("Players")
    local keyDrop = 1
    --Local Functions
    --Modül Fonksiyonları
    function TreasureManager.getKey(keyPart, whichCharacter)
    keyPart:Destroy()
    end
    return TreasureManager
  3. Bu iki yerel işlevi Yerel İşlevler bölümüne kopyalayıp yapıştırın.

    • getPlayerKeys() oyuncunun Lockpicks lider stat'ını döndürür.

    • getPlayerTreasure() döndürür oyuncunun Treasure lider stat'ının değerini iade eder.


    --Local Functions
    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. oyuncuanahtarlarına eklemek için, getKey() modülü işlevindeki modül fonksiyonu:

    • Bir local değişken oluşturarak getPlayerKeys(whichCharacter) çağırın.

    • Değerleri keyDrop ile playerKeys arasına ekleyin.


    --Modül Fonksiyonları
    function TreasureManager.getKey(keyPart, whichCharacter)
    local playerKeys = getPlayerKeys(whichCharacter)
    playerKeys.Value = playerKeys.Value + keyDrop
    keyPart:Destroy()
    end
  5. Projeyi başlatın. Bir anahtarın dokunulmasının yok ettiğini kontrol edin ve oyuncunun liderlik tablosu1 ekleyin.

Gerekirse, herhangi bir sorun için aşağıdaki skriptinizle ilgili bir sorun tespit ettiyseniz,

Current TreasureManager Script

local TreasureManager = {}
local Players = game:GetService("Players")
local keyDrop = 1
--Local Functions
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 Kodlarından Bilgi Almak

Hazine Yöneticisi modülü treasureManager kullanıcıları bir hazine sandığına dokunduğunda kontrol etmek için bir anahtarınız olup olmadığını kontrol etmek için kullanılacaktır ve onlara altın vermek için.

Sandıklar Açılabilir mi Kontrol Et

  1. ServerStorage > Hazine Yöneticisi > Açmak için kaç anahtar gerektiği ve her bir sandığın içinde ne kadar altın olduğunu belirleyen çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeşitli çeşit


    local TreasureManager = {}
    local Players = game:GetService("Players")
    local keyDrop = 1
    local chestPickCost = 1
    local chestReward = 100
    --Local Functions
    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 etmek için, Modül Fonksiyonları bölümünde, TreasureManager tablosuna, canOpenChest() parametre ile, 1>canOpenChest()1> adında yeni bir işlev ekleyin,


    --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 true içine kopyalayıp yapıştırın, oyuncunun yeterli anahtarları varsa tru


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

Oyunculara Hazine Ver

Böylece oyuncu bir sandığı açabilir, hazine veren bir işlev oluşturabilir Hazine Yöneticisi

  1. Açık Sandık* adındaki yeni bir modül işlevi ekle.

İki argüman ile geçer:

  • chestPart - silinecek kasanın kapağı.
  • whichCharacter - hazine veren oyuncu.

function TreasureManager.openChest(chestPart, whichCharacter)
end
  1. Bir oyuncunun anahtarlarını çıkarıp hazine ödülleri vermek için, aşağıdaki kodu openChest() içinde kopyalayıp yapıştırın. Bu kod, daha önce oluşturulan değişkenleri kullanır, örneğin chestReward ve sandık başına verilen hazine miktarı gibi.


    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

Sandık Fonksiyonlarını Çağır

Artık iki modül işlevi, canOpenChest() ve openChest(), oluşturulduğunda, kullanıcılar tarafından premade partTouched() işlevi kullanılarak herhangi bir Chest kısmına çağrılabilir.

  1. In Çalışma Alanında > Sandıklar > SandıkScript açın.

  2. Yeni bir değişken oluşturarak treasureManager ve Hazine Yöneticisi modülü scriptini ServerStorage içinde gerektirir.


    local ServerStorage = game:GetService("ServerStorage")
    -- Aşağıdaki modül kriptini gerektirir
    local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
    local chests = script.Parent
    local chestsFolder = chests.Parts
    local chestsArray = chestsFolder:GetChildren()
  3. In partTouched() , if humanoid deklarasyonunun altında, yeni bir değişken oluşturun ve eşit olarak 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çabileceğini kontrol edin, sonra hazine almasına izin verin
    -- =====================================
    local canOpen = treasureManager.canOpenChest(whichCharacter)
    -- =====================================
    end
    end
  4. Ardından, canOpen olup olmadığını kontrol etmek için bir if oluşturun.

    • Eğer öyleyse, openChest() TreasureManager'ını arayın.

    • Ardından, iki parametre verin: chestPart, kutuyu yok etmek için, ve whichCharacter, oyuncuya hazine ödülleri vermek için.


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

    • En az 1 anahtarınız varsa, bir sandığa dokunarak onu yok edersiniz ve hazine ödüllerini verirsiniz.
    • 0 anahtarın varsa, bir hazine sandığını açamazsın.

Hata ayıklama ipuçları

  • In ChestScript , modül script'i gibi canOpenChest() çağrılan işlevlerin doğru yazıldığından emin olun. Herhangi bir farklılık hata yaratacaktır.

  • Kopyalanan ve yapıştırılan işlevleri, treasureManager.openChest() gibi, dersinde gösterildiği gibi doğru olup olmadığını kontrol edin. Herhangi bir farklılık, kodda gizli hatalar oluşturabilir.

Bitirilmiş Kodlar

Hazine Yöneticisi Kısmı Tamamlandı

local TreasureManager = {}
local Players = game:GetService("Players")
local keyDrop = 1
local chestPickCost = 1
local chestReward = 100
--Local Functions
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: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
Bitirilmiş ChestScript

local ServerStorage = game:GetService("ServerStorage")
-- Aşağıdaki modül kodunu gerektirir ⯆
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çabileceğini kontrol edin, sonra hazine almasına izin verin
-- =====================================
local canOpen = treasureManager.canOpenChest(whichCharacter)
if canOpen == true then
treasureManager.openChest(chestPart, whichCharacter)
end
-- =====================================
end
end
-- Her kasanın dokunma işlevine bağlanır, böylece tüm kasalarda çalışır
for chestIndex = 1, #chestsArray do
local chestPart = chestsArray[chestIndex]
chestPart.Touched:Connect(function(otherPart)
partTouched(otherPart, chestPart)
end)
end
Bitmiş kodScript

local ServerStorage = game:GetService("ServerStorage")
-- Aşağıdaki modül kodunu gerektirir ⯆
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 kısmını yok et
-- =====================================
treasureManager.getKey(keyPart, whichCharacter)
-- =====================================
end
end
-- Her anahtar kısmını dokunma işlevine bağlayın, 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 kodlarını kullanmanın yaygın bir uygulaması, oyunculara puan vermek gibi yaygın görevleri işlemektir. Bu örnek için, oyun içi nesnelerle etkileşime girerken verilen oyunculara anahtarları veren bir modül kodu oluşturuldu TreasureManager .