모듈 스크립트로 만들기

*이 콘텐츠는 AI(베타)를 사용해 번역되었으며, 오류가 있을 수 있습니다. 이 페이지를 영어로 보려면 여기를 클릭하세요.

모듈 스크립트에 대한 지식을 적용하기 위해, 플레이어가 열쇠를 주워 보물 상자를 여는 모듈 스크립트를 만듭니다.

프로젝트 설정

이 프로젝트에는 리더보드와 열쇠 및 보물 상자를 위한 스크립트 픽업 객체가 포함된 시작 맵이 있습니다.

시작 프로젝트 로드

  1. 시작 프로젝트를 다운로드합니다.

  2. Roblox Studio에서 다운로드한 파일을 엽니다: Intro to Module Scripts - Starter Project.rbxl.

모듈 스크립트 만들기

플레이어가 상자에서 보물을 얻을 수 있도록, TreasureManager라는 이름의 모듈 스크립트를 만듭니다. 모듈 스크립트를 사용하면 픽업과 리더보드를 연결할 수 있습니다.

  1. ServerStorage에서 새 ModuleScript를 만들고 이름을 TreasureManager로 변경합니다.

  2. TreasureManager에서 기본 모듈 테이블의 이름을 module에서 TreasureManager로 두 곳 모두 변경합니다.

    local TreasureManager = {}
    return TreasureManager

모듈 스크립트에서 함수 사용하기

모듈 스크립트에서 함수가 어떻게 작동하는지 테스트하기 위해, getKey()라는 새 함수를 만듭니다. getKey() 함수가 다른 스크립트에서 호출되면, 파괴할 키 부분을 받고 플레이어의 인벤토리에 있는 키 수를 1 증가시킵니다.

키를 위한 모듈 함수 만들기

  1. 이 모듈 스크립트는 모듈 함수와 로컬 함수의 조합을 사용할 것이므로, 두 개의 주석을 입력하여 구분합니다.

    local TreasureManager = {}
    ------------------ 로컬 함수
    ------------------ 모듈 함수
    return TreasureManager
  2. 모듈 함수 주석 아래에 TreasureManagergetKey()라는 새 모듈 함수를 추가합니다.

    두 개의 매개변수를 사용합니다:

    • 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. WorkspaceKeysKeyScript에서 키 스크립트를 엽니다.

  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")).

로컬 함수 만들기

현재 리더보드는 플레이어의 키와 보물을 추적합니다. 리더보드 숫자를 변경하려면 모듈 스크립트에서 로컬 함수를 사용하세요. 로컬 함수는 플레이어의 키 또는 보물 값을 변경하는 것이 TreasureManager 스크립트에서만 필요하기 때문에 사용됩니다.

  1. ServerStorage에서 TreasureManager 스크립트를 엽니다.

  2. 다음을 수행하기 위해 로컬 변수를 만듭니다:

    • 플레이어의 리더보드 통계를 작업할 수 있도록 Players 서비스를 가져옵니다.

    • 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
    ------------------ 모듈 함수
  4. 플레이어의 키를 추가하기 위해 getKey() 모듈 함수에서:

    • getPlayerKeys(whichCharacter)를 호출하는 local 변수를 만듭니다.

    • keyDrop의 값을 playerKeys에 추가합니다.

    ------------------ 모듈 함수
    function TreasureManager.getKey(keyPart, whichCharacter)
    local playerKeys = getPlayerKeys(whichCharacter)
    playerKeys.Value = playerKeys.Value + keyDrop
    keyPart:Destroy()
    end
  5. 프로젝트를 실행합니다. 키에 닿으면 파괴되고 리더보드에서 플레이어의 키 수가 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 모듈 스크립트는 플레이어가 보물 상자에 닿을 때 최소한 하나의 키가 있는지 확인하여 열 수 있는지 확인하는 데 사용됩니다.

상자를 열 수 있는지 확인하기

  1. 먼저 ServerStorageTreasureManager 스크립트에서 상자를 여는 데 필요한 키 수와 각 상자가 포함하는 금의 양을 설정하는 변수를 만듭니다.

    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()라는 새 함수를 추가하고 매개변수로 whichCharacter를 사용합니다.

    ------------------ 모듈 함수
    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

플레이어에게 보물 주기

플레이어가 상자를 열 수 있도록, TreasureManager에 보물을 주는 함수를 만듭니다.

  1. TreasureManageropenChest()라는 새 모듈 함수를 추가합니다.

    두 개의 인수를 전달합니다:

    • 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.Parent:Destroy()
    end

상자 함수 호출하기

이제 두 개의 모듈 함수인 canOpenChest()openChest()가 생성되었으므로, 플레이어가 상자에 닿을 때마다 미리 만들어진 partTouched() 함수를 사용하여 호출할 수 있습니다.

  1. WorkspaceChests에서 ChestScript를 엽니다.

  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이라는 새 변수를 만들고 다음과 같이 설정합니다:

    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. 다음으로, canOpen이 true인지 확인하는 if 문을 만듭니다.

    • 그렇다면 TreasureManager의 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개의 키가 있으면 보물 상자를 열 수 없습니다.

문제 해결 팁

  • 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라는 모듈 스크립트를 만들었습니다.

©2026 Roblox Corporation. Roblox 및 Roblox 로고, 'Powering Imagination'은 미국 및 기타 국가 내 당사의 등록 및 미등록 상표입니다.