모듈 스크립트를 사용하여 만들기

*이 콘텐츠는 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에서 모듈 스크립트에 대한 요구를 포함하는 줄을 확인하세요. 만약 모듈에 require가 포함되어 있지 않다면, 해당 모듈 스크립트의 함수와 변수를 사용할 수 없습니다.

문제: 스크립트가 실행되지 않거나 키를 픽업할 수 없습니다.

  • 모듈 스크립트에서 코드가 모두 local TreasureManager = {}return TreasureManager 사이에 있는지 확인하세요. 반환은 모듈 스크립트의 마지막 코드 줄이어야 합니다.

  • require가 포함된 줄 끝에 두 개의 괄호가 있는지 확인하세요. 예: 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)를 호출하는 로컬 변수를 만듭니다.

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

상자 함수 호출하기

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

  1. WorkspaceChests에서 ChestScript를 엽니다.

  2. treasureManager라는 새로운 변수를 만들고 ServerStorageTreasureManager 모듈 스크립트를 요구합니다.


    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. 다음으로, 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'은 미국 및 기타 국가 내 당사의 등록 및 미등록 상표입니다.