
모듈 스크립트에 대한 지식을 적용하기 위해 플레이어가 키를 픽업하고 보물 상자를 열 수 있는 모듈 스크립트를 만듭니다.
프로젝트 설정
이 프로젝트는 리더보드와 키 및 보물 상자를 위한 스크립트 픽업 오브젝트가 포함된 스타터 맵입니다.
스타터 프로젝트 로드
Roblox Studio에서 다운로드한 파일인 Intro to Module Scripts - Starter Project.rbxl을 엽니다.

모듈 스크립트 만들기
플레이어가 보물 상자에서 보물을 얻을 수 있도록 TreasureManager라는 이름의 모듈 스크립트를 만듭니다. 모듈 스크립트를 사용하면 픽업과 리더보드가 연결됩니다.
ServerStorage에서 새 ModuleScript를 만들고 이름을 TreasureManager로 바꿉니다.

TreasureManager에서 기본 모듈 테이블의 이름을 module에서 TreasureManager로 두 곳 모두 변경합니다.
local TreasureManager = {}return TreasureManager
모듈 스크립트에서 함수 사용하기
모듈 스크립트에서 함수가 어떻게 작동하는지 테스트하기 위해 getKey()라는 새 함수를 만듭니다. getKey() 함수가 다른 스크립트에서 호출되면, 파괴할 키 부분을 받고 플레이어의 인벤토리의 키 수를 1 증가시킵니다.
키에 대한 모듈 함수 만들기
이 모듈 스크립트는 모듈 함수와 로컬 함수의 조합을 사용할 것이므로, 두 개의 주석을 입력하여 이를 구분합니다.
local TreasureManager = {}------------------ 로컬 함수------------------ 모듈 함수return TreasureManager모듈 함수 주석 아래에 TreasureManager에 getKey()라는 이름의 새로운 모듈 함수를 추가합니다.
두 개의 매개변수를 사용합니다:
- keyPart - 파괴할 부분.
- whichCharacter - 키 부분에 닿은 플레이어.
local TreasureManager = {}------------------ 로컬 함수------------------ 모듈 함수function TreasureManager.getKey(keyPart, whichCharacter)endreturn TreasureManagergetKey()에서 keyPart를 파괴합니다.
function TreasureManager.getKey(keyPart, whichCharacter)keyPart:Destroy()end
모듈 함수 사용하기
이제 모듈 함수 getKey()를 다른 스크립트에서 사용할 수 있습니다. 그 함수를 테스트하기 위해 미리 만들어진 스크립트를 열고 호출합니다.
Workspace ⟩ Keys ⟩ KeyScript에서 키 스크립트를 엽니다.
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에서 모듈 스크립트에 대한 요구를 포함하는 줄을 확인하세요. 만약 모듈에 require가 포함되어 있지 않다면, 해당 모듈 스크립트의 함수와 변수를 사용할 수 없습니다.
문제: 스크립트가 실행되지 않거나 키를 픽업할 수 없습니다.
모듈 스크립트에서 코드가 모두 local TreasureManager = {}와 return TreasureManager 사이에 있는지 확인하세요. 반환은 모듈 스크립트의 마지막 코드 줄이어야 합니다.
require가 포함된 줄 끝에 두 개의 괄호가 있는지 확인하세요. 예: WaitForChild("TreasureManager")).
로컬 함수 만들기
현재 리더보드는 플레이어의 키와 보물을 추적합니다. 리더보드 숫자를 변경하기 위해 모듈 스크립트에서 로컬 함수를 사용하세요. 로컬 함수는 플레이어의 키나 보물 값 변경이 TreasureManager 스크립트에서만 필요하기 때문에 사용됩니다.
ServerStorage에서 TreasureManager 스크립트를 엽니다.
다음을 수행하는 로컬 변수를 만듭니다:
플레이어의 리더보드 통계를 작업할 수 있도록 Players 서비스를 가져옵니다.
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------------------ 모듈 함수플레이어의 키를 추가하기 위해 getKey() 모듈 함수 안에서:
getPlayerKeys(whichCharacter)를 호출하는 로컬 변수를 만듭니다.
keyDrop의 값을 playerKeys에 추가합니다.
------------------ 모듈 함수function TreasureManager.getKey(keyPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)playerKeys.Value = playerKeys.Value + keyDropkeyPart:Destroy()end프로젝트를 실행합니다. 키에 닿았을 때 그것을 파괴하고 플레이어의 리더보드에 1을 추가하는지 확인합니다.

필요한 경우, 문제 해결을 위해 아래의 스크립트를 자신의 스크립트와 비교하십시오.
현재 TreasureManager 스크립트
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()라는 새로운 함수와 매개변수 whichCharacter를 추가합니다.
------------------ 모듈 함수function TreasureManager.canOpenChest(whichCharacter)endfunction TreasureManager.getKey(keyPart, whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)playerKeys.Value = playerKeys.Value + keyDropkeyPart:Destroy()endcanOpenChest()에 아래 코드를 복사하여 붙여넣어 플레이어가 충분한 키를 가지고 있으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
function TreasureManager.canOpenChest(whichCharacter)local playerKeys = getPlayerKeys(whichCharacter)if playerKeys.Value >= chestPickCost thenreturn trueelsereturn falseendend
플레이어에게 보물 주기
플레이어가 상자를 열 수 있도록 TreasureManager에서 그들에게 보물을 주는 함수를 생성합니다.
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.Parent:Destroy()end
상자 함수 호출하기
이제 두 개의 모듈 함수, canOpenChest()와 openChest()가 생성되었으므로, 플레이어가 상자에 닿을 때마다 이들을 호출할 수 있습니다. 미리 만들어진 partTouched() 함수를 사용하여 호출합니다.
Workspace ⟩ Chests에서 ChestScript를 엽니다.
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다음으로, canOpen이 true인지 확인하는 if 문을 만듭니다.
그렇다면 TreasureManager의 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개의 키가 있으면 보물 상자를 열 수 없습니다.
문제 해결 팁
ChestScript에서 모듈 스크립트에서 호출된 함수인 canOpenChest()의 철자가 TreasureManager 스크립트에 있는 정확한 철자와 일치하는지 확인하세요. 약간의 차이라도 오류를 발생시킬 수 있습니다.
복사하여 붙여넣은 함수들이, treasureManager.openChest()와 같이 스크립트에서 표시된 것과 정확히 일치하는지 확인하세요. 다소 차이가 있으면 스크립트에서 미세한 오류가 발생할 수 있습니다.
완성된 스크립트
완성된 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
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.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
완성된 ChestScript
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]:WaitForChild("Collider")
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라는 모듈 스크립트가 생성되었습니다.