使用模組指令創建

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

要應用您對模組指令碼的知識,請創建一個模組指令碼,讓玩家可以撿起鑰匙並使用它們來打開寶箱。

項目設定

此項目包括鍵和寶箱的領導者可選擇的指定物品,以及鍵和寶箱的領導者可選擇的指定物品。

載入新手項目

  1. 下載開始項目。

  2. 在 Roblox Studio 中,開啟已下載的檔案:介紹模組指令碼 - 新手專案.rbxl

創建模組指令碼

因此玩家可以從寶箱中取得寶藏,並且創建名為 TreasureManager 的模組脚本。使用模組脚本將會連接撿起和排行榜。

  1. ServerStorage 中,創建新 ModuleScript 並將其重命名為 TreasureManager

  2. 寶藏管理器 中,將預設模組表重命名為 module 並在兩個地方使用 TreasureManager 來重命名模組。


    local TreasureManager = {}
    return TreasureManager

使用模組指令碼中的函數

要測試模組腳本中的功能是否正常運行,請創建名為 getKey() 的新功能。當 getKey() 功能從另一個腳指令碼呼叫時,它會收到一個鑰匙部分來摧毀並添加 1 到玩家的道具欄中的鑰匙數。

創建鑰匙的模組功能

  1. 此模組腳本會使用模組和本地功能的組合,類型 two 個留言來幫助您將它們分開。


    local TreasureManager = {}
    ------------------ 本地函數
    ------------------ 模組功能
    return TreasureManager
  2. 模組功能 评留言中,將新模組功能添加到 TreasureManager 的名為 getKey() 的模組。

    使用兩個參數:

    • keyPart - 要摧毀的部分。
    • whichCharacter - 碰觸鑰匙部分的玩家。

    local TreasureManager = {}
    ------------------ 本地函數
    ------------------ 模組功能
    function TreasureManager.getKey(keyPart, whichCharacter)
    end
    return TreasureManager
  3. getKey() 中,摧毀 keyPart


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

使用模組功能

現在,模組功能 getKey() 可以在其他指令碼中使用。要測試此功能,您將開啟一個預製指令碼並將其調用。

  1. 工作區 中開啟鑰匙指令碼。 鑰匙 > 鑰匙Script

  2. 在 keyScript 中,將模組指令存儲在 treasureManager 變量中,並將其設為等值: require(ServerStorage:WaitForChild("TreasureManager"))


    local ServerStorage = game:GetService("ServerStorage")
    -- 需要下面的模組指令碼⯆
    local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
    local keys = script.Parent
    local keysFolder = keys.Parts
    local keysArray = keysFolder:GetChildren()
  3. 已有一個名為 partTouched() 的函數可以檢查玩家是否觸摸零件。在 partTouched() 內:

    • 呼叫 getKey() 模組功能來摧毀鑰鍵。
    • 通過 keyPartwhichCharacter

    local ServerStorage = game:GetService("ServerStorage")
    -- 需要下面的模組指令碼⯆
    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
    -- 提供玩家一把鑰匙,並摧毀鑰匙部分
    -- =============================================
    treasureManager.getKey(keyPart, whichCharacter)
    -- =============================================
    end
    end
  4. 執行項目並檢查一個觸摸鑰匙會摧毀它。

排障提示

發生了一個問題: 獲得包含: "Infinite yield possible" 的錯誤訊息。

  • 在指令碼中檢查模組腳本的拼寫。如果模組腳本,例如 TreasureManager 的拼寫不正確,將發生錯誤。 發生了一項問題: 獲取包含: "attempt to index global" 的錯誤訊息。

  • 檢查 keyScript 中包含模組指令碼的行。如果模組未包含要需要 必填,它就無法使用該模組的函數和變量。 問題: 指令碼不能執行或無法撿起鑰匙。

  • 在模組腳指令碼中,確保所有代碼位於 local TreasureManager = {}return TreasureManager 之間。 返回必須是模塊腳本中最後一條代碼。

  • 檢查行的結束有兩個括號,像在 WaitForChild("TreasureManager")) 中。

建立本地函數

現在,排行榜會記錄玩家的鑰匙和寶藏。若要變更排行榜數字,請使用模組指令碼中的本地函數。 使用本地函數會僅在尋寶管理器指令碼中變更玩家的鑰匙或寶藏值,因此在任何地方都不會需要。

  1. ServerStorage 中,開啟 TreasureManager 指令碼。

  2. 建立本地變數來執行以追蹤中操作:

    • 取得玩家服務,讓指令碼能與玩家的排行榜統計資料工作。

    • 儲存玩家在 keyPart 後所收到的鑰匙數。


    local TreasureManager = {}
    local Players = game:GetService("Players")
    local keyDrop = 1
    ------------------ 本地函數
    ------------------ 模組功能
    function TreasureManager.getKey(keyPart, whichCharacter)
    keyPart:Destroy()
    end
    return TreasureManager
  3. 將這兩個本地函數複製並粘貼到 本地函數 區。

    • getPlayerKeys() 返回玩家的 Lockpicks 排行榜值。

    • getPlayerTreasure() 返回玩家的 Treasure 排行榜值。


    ------------------ 本地函數
    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. 要在玩家的鑰匙上添加到 getKey() 模組的功能:

    • 建立 local 變數來呼叫 getPlayerKeys(whichCharacter)

    • keyDrop 的值添加到 playerKeys


    ------------------ 模組功能
    function TreasureManager.getKey(keyPart, whichCharacter)
    local playerKeys = getPlayerKeys(whichCharacter)
    playerKeys.Value = playerKeys.Value + keyDrop
    keyPart:Destroy()
    end
  5. 執行項目。檢查觸摸鍵會導致其毀滅並在玩家的鍵排行榜上增加 1 個。

如有需要,請查看您的脚本對下面的任何問題進行診斷。

Current TreasureManager Script

local TreasureManager = {}
local Players = game:GetService("Players")
local keyDrop = 1
------------------ 本地函數
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
------------------ 模組功能
function TreasureManager.getKey(keyPart, whichCharacter)
local playerKeys = getPlayerKeys(whichCharacter)
playerKeys.Value = playerKeys.Value + keyDrop
keyPart:Destroy()
end
return TreasureManager

從模組指令碼中取得資訊

玩家觸摸寶箱時,會使用 TreasureManager 模組指令,檢查是否至少有一個鑰匙,再將它打開並給予金幣。

檢查箱子可以打開

  1. 首先在 ServerStorage > TreasureManager 指令碼中設定鑰匙開啟寶箱所需的費用和寶箱內的金幣數量。


    local TreasureManager = {}
    local Players = game:GetService("Players")
    local keyDrop = 1
    local chestPickCost = 1
    local chestReward = 100
    ------------------ 本地函數
    local function getPlayerKeys(whichCharacter)
    local player = Players:GetPlayerFromCharacter(whichCharacter)
    local leaderstats = player:FindFirstChild("leaderstats")
    return leaderstats:WaitForChild("Lockpicks")
    end
  2. 要創建檢查玩家是否能夠打開寶箱的功能,在 模組功能 區域,添加新功能到 TreasureManager 表名為 canOpenChest() 與參數 1> whichCharacter1> 。


    ------------------ 模組功能
    function TreasureManager.canOpenChest(whichCharacter)
    end
    function TreasureManager.getKey(keyPart, whichCharacter)
    local playerKeys = getPlayerKeys(whichCharacter)
    playerKeys.Value = playerKeys.Value + keyDrop
    keyPart:Destroy()
    end
  3. 將下列代碼複製到 canOpenChest() 以返回 true 如果玩家有足夠的鑰匙,和 false 如果他們沒有。


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

給玩家寶藏

因此玩家可以開啟寶箱,在 寶藏管理器 中創建一個功能,給他們寶藏。

  1. 將新模組功能添加到 TreasureManager 名為 openChest()

    分為兩個參數:

    • chestPart - 是否要摧毀的寶箱部分。
    • whichCharacter - 玩家發放寶藏。

    function TreasureManager.openChest(chestPart, whichCharacter)
    end
  2. 要從玩家手中減去鑰匙並給予寶藏,請在 openChest() 中複製並粘貼下列代碼。這個代碼使用以前創建的變數,例如 chestReward ,每個寶箱的寶藏數量。


    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

呼叫寶箱功能

兩個模組功能,canOpenChest()openChest() ,已建立後,可以使用預製 partTouched() 函數呼叫寶箱零件。

  1. 工作區 > 寶箱 開啟 寶箱Script

  2. 創建名為 treasureManager 的新變數,並且在 ServerStorage 中需要 TreasureManager 模組脚本。


    local ServerStorage = game:GetService("ServerStorage")
    -- 需要下面的模組指令碼
    local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))
    local chests = script.Parent
    local chestsFolder = chests.Parts
    local chestsArray = chestsFolder:GetChildren()
  3. partTouched() ,在 if humanoid 的聲明下,創建一個名為 canOpen 的新變量,並將其設為等值:

    treasureManager.canOpenChest(whichCharacter)


    local function partTouched(otherPart, chestPart)
    local whichCharacter = otherPart.Parent
    local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    -- 檢查玩家是否能開啟寶箱,然後讓他們取得寶藏
    -- =============================================
    local canOpen = treasureManager.canOpenChest(whichCharacter)
    -- =============================================
    end
    end
  4. 接下來,創建 if 語句來檢查 canOpen 是否為真。

    • 如果是,請呼叫寶藏管理器的 openChest() 函數。

    • 然後,傳入兩個參數: chestPart,用來摧毀寶箱,和 whichCharacter,用來獎勵寶藏。


    local function partTouched(otherPart, chestPart)
    local whichCharacter = otherPart.Parent
    local humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    -- 檢查玩家是否能開啟寶箱,然後讓他們取得寶藏
    -- =============================================
    local canOpen = treasureManager.canOpenChest(whichCharacter)
    if canOpen == true then
    treasureManager.openChest(chestPart, whichCharacter)
    end
    -- =============================================
    end
    end
  5. 執行項目。檢查該項目:

    • 如果您至少有 1 個鍵匙,碰觸寶箱會摧毀它並獲得寶藏。
    • 如果你沒有 0 個鑰匙,你無法開啟寶箱。

排障提示

  • 寶箱指令碼 裡,確認來自模組指令碼的函數名稱正確地寫作。任何不正確的寫法都會導致錯誤。

  • 檢查複製的 treasureManager.openChest() 和 number1 功能是否正確顯示。任何不同都可能會導致指令碼中的錯誤。

已完成的指令碼

已完成導賞管理器指令碼

local TreasureManager = {}
local Players = game:GetService("Players")
local keyDrop = 1
local chestPickCost = 1
local chestReward = 100
------------------ 本地函數
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
------------------ 模組功能
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
完成的寶箱指令碼

local ServerStorage = game:GetService("ServerStorage")
-- 需要下面的模組指令碼⯆
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
-- 檢查玩家是否能開啟寶箱,然後讓他們取得寶藏
-- =============================================
local canOpen = treasureManager.canOpenChest(whichCharacter)
if canOpen == true then
treasureManager.openChest(chestPart, whichCharacter)
end
-- =============================================
end
end
-- 將每個寶箱零件綁定到觸摸功能,以便在所有零件上運行
for chestIndex = 1, #chestsArray do
local chestPart = chestsArray[chestIndex]
chestPart.Touched:Connect(function(otherPart)
partTouched(otherPart, chestPart)
end)
end
已完成的 keyScript

local ServerStorage = game:GetService("ServerStorage")
-- 需要下面的模組指令碼⯆
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
-- 提供玩家一把鑰匙,並摧毀鑰匙部分
-- =============================================
treasureManager.getKey(keyPart, whichCharacter)
-- =============================================
end
end
-- 將每個鍵部分綁定到觸摸功能,以便在所有部分上運行
for keyIndex = 1, #keysArray do
local keyPart = keysArray[keyIndex]
keyPart.Touched:Connect(function(otherPart)
partTouched(otherPart, keyPart)
end)
end

摘要

使用模組腳本在 Roblox 遊戲中的常見應用是處理玩家使用的常見任務,例如授予他們點數。 為此範例,TreasureManager 模組腳本已創建,用於處理給玩家鑰匙和寶藏,每次與遊戲對象互動時。