要應用您對模組指令碼的知識,請創建一個模組指令碼,讓玩家可以撿起鑰匙並使用它們來打開寶箱。
項目設定
此項目包括鍵和寶箱的領導者可選擇的指定物品,以及鍵和寶箱的領導者可選擇的指定物品。
載入新手項目
在 Roblox Studio 中,開啟已下載的檔案:介紹模組指令碼 - 新手專案.rbxl。
創建模組指令碼
因此玩家可以從寶箱中取得寶藏,並且創建名為 TreasureManager 的模組脚本。使用模組脚本將會連接撿起和排行榜。
在 ServerStorage 中,創建新 ModuleScript 並將其重命名為 TreasureManager。
在 寶藏管理器 中,將預設模組表重命名為 module 並在兩個地方使用 TreasureManager 來重命名模組。
local TreasureManager = {}return TreasureManager
使用模組指令碼中的函數
要測試模組腳本中的功能是否正常運行,請創建名為 getKey() 的新功能。當 getKey() 功能從另一個腳指令碼呼叫時,它會收到一個鑰匙部分來摧毀並添加 1 到玩家的道具欄中的鑰匙數。
創建鑰匙的模組功能
此模組腳本會使用模組和本地功能的組合,類型 two 個留言來幫助您將它們分開。
local TreasureManager = {}------------------ 本地函數------------------ 模組功能return TreasureManager在 模組功能 评留言中,將新模組功能添加到 TreasureManager 的名為 getKey() 的模組。
使用兩個參數:
- keyPart - 要摧毀的部分。
- whichCharacter - 碰觸鑰匙部分的玩家。
local TreasureManager = {}------------------ 本地函數------------------ 模組功能function TreasureManager.getKey(keyPart, whichCharacter)endreturn TreasureManager在 getKey() 中,摧毀 keyPart 。
function TreasureManager.getKey(keyPart, whichCharacter)keyPart:Destroy()end
使用模組功能
現在,模組功能 getKey() 可以在其他指令碼中使用。要測試此功能,您將開啟一個預製指令碼並將其調用。
在 工作區 中開啟鑰匙指令碼。 鑰匙 > 鑰匙Script。
在 keyScript 中,將模組指令存儲在 treasureManager 變量中,並將其設為等值: require(ServerStorage:WaitForChild("TreasureManager"))
local ServerStorage = game:GetService("ServerStorage")-- 需要下面的模組指令碼⯆local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))local keys = script.Parentlocal keysFolder = keys.Partslocal keysArray = keysFolder:GetChildren()已有一個名為 partTouched() 的函數可以檢查玩家是否觸摸零件。在 partTouched() 內:
- 呼叫 getKey() 模組功能來摧毀鑰鍵。
- 通過 keyPart 和 whichCharacter 。
local ServerStorage = game:GetService("ServerStorage")-- 需要下面的模組指令碼⯆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-- 提供玩家一把鑰匙,並摧毀鑰匙部分-- =============================================treasureManager.getKey(keyPart, whichCharacter)-- =============================================endend執行項目並檢查一個觸摸鑰匙會摧毀它。
排障提示
發生了一個問題: 獲得包含: "Infinite yield possible" 的錯誤訊息。
在指令碼中檢查模組腳本的拼寫。如果模組腳本,例如 TreasureManager 的拼寫不正確,將發生錯誤。 發生了一項問題: 獲取包含: "attempt to index global" 的錯誤訊息。
檢查 keyScript 中包含模組指令碼的行。如果模組未包含要需要 必填,它就無法使用該模組的函數和變量。 問題: 指令碼不能執行或無法撿起鑰匙。
在模組腳指令碼中,確保所有代碼位於 local TreasureManager = {} 和 return TreasureManager 之間。 返回必須是模塊腳本中最後一條代碼。
檢查行的結束有兩個括號,像在 WaitForChild("TreasureManager")) 中。
建立本地函數
現在,排行榜會記錄玩家的鑰匙和寶藏。若要變更排行榜數字,請使用模組指令碼中的本地函數。 使用本地函數會僅在尋寶管理器指令碼中變更玩家的鑰匙或寶藏值,因此在任何地方都不會需要。
在 ServerStorage 中,開啟 TreasureManager 指令碼。
建立本地變數來執行以追蹤中操作:
取得玩家服務,讓指令碼能與玩家的排行榜統計資料工作。
儲存玩家在 keyPart 後所收到的鑰匙數。
local TreasureManager = {}local Players = game:GetService("Players")local keyDrop = 1------------------ 本地函數------------------ 模組功能function TreasureManager.getKey(keyPart, whichCharacter)keyPart:Destroy()endreturn TreasureManager將這兩個本地函數複製並粘貼到 本地函數 區。
getPlayerKeys() 返回玩家的 Lockpicks 排行榜值。
getPlayerTreasure() 返回玩家的 Treasure 排行榜值。
------------------ 本地函數local 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------------------ Module Functions要在玩家的鑰匙上添加到 getKey() 模組的功能:
建立 local 變數來呼叫 getPlayerKeys(whichCharacter)。
將 keyDrop 的值添加到 playerKeys 。
------------------ 模組功能function TreasureManager.getKey(keyPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)playerKeys.Value = playerKeys.Value + keyDropkeyPart:Destroy()end執行項目。檢查觸摸鍵會導致其毀滅並在玩家的鍵排行榜上增加 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 模組指令,檢查是否至少有一個鑰匙,再將它打開並給予金幣。
檢查箱子可以打開
首先在 ServerStorage > TreasureManager 指令碼中設定鑰匙開啟寶箱所需的費用和寶箱內的金幣數量。
local TreasureManager = {}local Players = game:GetService("Players")local keyDrop = 1local chestPickCost = 1local chestReward = 100------------------ 本地函數local function getPlayerKeys(whichCharacter)local player = Players:GetPlayerFromCharacter(whichCharacter)local leaderstats = player:FindFirstChild("leaderstats")return leaderstats:WaitForChild("Lockpicks")end要創建檢查玩家是否能夠打開寶箱的功能,在 模組功能 區域,添加新功能到 TreasureManager 表名為 canOpenChest() 與參數 1> whichCharacter1> 。
------------------ 模組功能function TreasureManager.canOpenChest(whichCharacter)endfunction TreasureManager.getKey(keyPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)playerKeys.Value = playerKeys.Value + keyDropkeyPart:Destroy()end將下列代碼複製到 canOpenChest() 以返回 true 如果玩家有足夠的鑰匙,和 false 如果他們沒有。
function TreasureManager.canOpenChest(whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)if playerKeys.Value >= chestPickCost thenreturn trueelsereturn falseendend
給玩家寶藏
因此玩家可以開啟寶箱,在 寶藏管理器 中創建一個功能,給他們寶藏。
將新模組功能添加到 TreasureManager 名為 openChest() 。
分為兩個參數:
- chestPart - 是否要摧毀的寶箱部分。
- whichCharacter - 玩家發放寶藏。
function TreasureManager.openChest(chestPart, whichCharacter)end要從玩家手中減去鑰匙並給予寶藏,請在 openChest() 中複製並粘貼下列代碼。這個代碼使用以前創建的變數,例如 chestReward ,每個寶箱的寶藏數量。
function TreasureManager.openChest(chestPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)local playerTreasure = getPlayerTreasure(whichCharacter)playerKeys.Value = playerKeys.Value - chestPickCostplayerTreasure.Value = playerTreasure.Value + chestRewardchestPart:Destroy()end
呼叫寶箱功能
兩個模組功能,canOpenChest() 和 openChest() ,已建立後,可以使用預製 partTouched() 函數呼叫寶箱零件。
在 工作區 > 寶箱 開啟 寶箱Script。
創建名為 treasureManager 的新變數,並且在 ServerStorage 中需要 TreasureManager 模組脚本。
local ServerStorage = game:GetService("ServerStorage")-- 需要下面的模組指令碼local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))local chests = script.Parentlocal chestsFolder = chests.Partslocal chestsArray = chestsFolder:GetChildren()在 partTouched() ,在 if humanoid 的聲明下,創建一個名為 canOpen 的新變量,並將其設為等值:
treasureManager.canOpenChest(whichCharacter)
local function partTouched(otherPart, chestPart)local whichCharacter = otherPart.Parentlocal humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")if humanoid then-- 檢查玩家是否能開啟寶箱,然後讓他們取得寶藏-- =============================================local canOpen = treasureManager.canOpenChest(whichCharacter)-- =============================================endend接下來,創建 if 語句來檢查 canOpen 是否為真。
如果是,請呼叫寶藏管理器的 openChest() 函數。
然後,傳入兩個參數: chestPart,用來摧毀寶箱,和 whichCharacter,用來獎勵寶藏。
local function partTouched(otherPart, chestPart)local whichCharacter = otherPart.Parentlocal humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")if humanoid then-- 檢查玩家是否能開啟寶箱,然後讓他們取得寶藏-- =============================================local canOpen = treasureManager.canOpenChest(whichCharacter)if canOpen == true thentreasureManager.openChest(chestPart, whichCharacter)end-- =============================================endend執行項目。檢查該項目:
- 如果您至少有 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 模組腳本已創建,用於處理給玩家鑰匙和寶藏,每次與遊戲對象互動時。