모듈 스크립트로 생성

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

모듈 스크립트의 지식을 적용하려면 플레이어가 열쇠를 잡고 사용하여 보물 상자를 열 수 있는 모듈 스크립트를 만듭니다.

프로젝트 설정

이 프로젝트에는 열쇠와 보물 상자를 위해 리더보드 및 스크립트 픽업 개체가 있는 시작 지도가 포함되어 있습니다.

시작 프로젝트 불러오기

  1. 시작 프로젝트를 다운로드하십시오.

  2. In Roblox Studio, 모듈 스크립트 소개 - 스타터 프로젝트 .

모듈 스크립트 생성

플레이어는 상자에서 보물을 얻을 수 있으며, TreasureManager라는 이름의 모듈 스크립트를 만듭니다. 모듈 스크립트를 사용하면 픽업과 순위표를 함께 연결할 수 있습니다.

  1. In ServerStorage , 새로운 ModuleScript 를 생성하고 이름을 TreasureManager로 변경합니다.

  2. In TreasureManager , 기존 모듈 테이블을 모두 교체하여 moduleTreasureManager 로 대체합니다.


    local TreasureManager = {}
    return TreasureManager

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

모듈 스크립트에서 함수가 작동하는지 테스트하려면 새로운 함수를 만듭니다. getKey() 이라는 이름의 함수입니다. 다른 스크립트에서 함수가 getKey() 를 호출하면 키 부분을 파괴하고 플레이어의 인벤토리에 1을 추가합니다.

열에 대한 모듈 함수 생성

  1. 이 모듈 스크립트는 모듈과 로컬 함수의 조합을 사용하여 두 가지 컴멘트를 두 개 사용하여 별도로 유지하도록 도와줍니다.


    local TreasureManager = {}
    --Local Functions
    --모듈 함수
    return TreasureManager
  2. Under the 모듈 함수 코멘트를 달다/남기다, 의견을 내다, add a new module function to TreasureManager named getKey() .

    다음 두 매개 변수를 사용합니다.

    • keyPart - 파괴할 부품.
    • whichCharacter - 키 부분을 터치한 플레이어.

    local TreasureManager = {}
    --Local Functions
    --모듈 함수
    function TreasureManager.getKey(keyPart, whichCharacter)
    end
    return TreasureManager
  3. In getKey() , destroy keyPart .


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

모듈 함수 사용

이제 모듈 함수 getKey()를 다른 스크립트에서 사용할 수 있습니다. 이 함수를 테스트하려면 미리 만든 스크립트를 열고 호출합니다.

  1. Open the key script in 작업 공간 > > 키스크립트 .

  2. In keyScript, store the module script in a variable named treasureManager and set it equal to: 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".

  • 키스크립트에서 모듈 스크립트를 위한 요구 사항을 포함하는 줄을 확인하십시오. 모듈이 요구 필요포함하지 않으면 해당 모듈 스크립트의 함수 및 변수를 사용할 수 없습니다. 문제: 스크립트가 실행되지 않거나 열쇠를 픽업하지 못합니다.

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

  • 필요사항에 대해 부모 두 개가 있는지 확인하십시오, 같이 WaitForChild("TreasureManager")) .

로컬 함수 생성

현재 순위표는 플레이어의 열쇠와 보물을 추적합니다. 순위표 숫자를 변경하려면 모듈 스크립트의 로컬 함수를 사용하십시오. 로컬 함수는 플레이어의 열쇠 또는 보물 값을 변경하는 경우에만 필요하므로 사용하지 마십시오.

  1. In ServerStorage , TreasureManager 스크립트를 엽니다.

  2. 팔로잉수행하려면 로컬 변수를 생성하세요:

    • 스크립트가 플레이어의 순위표 통계와 함께 작동할 수 있도록 플레이어 서비스를 가져옵니다.

    • 키 파트를 터치한 후 플레이어가 받는 키 수를 저장합니다. keyPart .


    local TreasureManager = {}
    local Players = game:GetService("Players")
    local keyDrop = 1
    --Local Functions
    --모듈 함수
    function TreasureManager.getKey(keyPart, whichCharacter)
    keyPart:Destroy()
    end
    return TreasureManager
  3. 이 두 로컬 함수를 로컬 함수 섹션에 복사하고 붙여넣습니다.

    • getPlayerKeys() 는 플레이어의 Lockpicks 리더 스탯의 값을 반환합니다.

    • getPlayerTreasure()는 플레이어의 Treasure 리더 스탯의 값을 반환합니다.


    --Local Functions
    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 Functions
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

모듈 스크립트에서 정보 가져오기

플레이어가 보물 상자를 만질 때 보물Manager 모듈 스크립트를 사용하여 열기 전에 적어도 하나의 열쇠가 있는지 확인하고 금을 제공합니다.

상자를 열 수 있는지 확인

  1. 서버 스토리지 내에서 보물 관리자 스크립트를 먼저 설정하고, 상자를 열 때마다 필요한 키 수 및 각 상자에 얼마나 많은 골드가 포함되는지 변수를 설정하십시오.


    local TreasureManager = {}
    local Players = game:GetService("Players")
    local keyDrop = 1
    local chestPickCost = 1
    local chestReward = 100
    --Local Functions
    local function getPlayerKeys(whichCharacter)
    local player = Players:GetPlayerFromCharacter(whichCharacter)
    local leaderstats = player:FindFirstChild("leaderstats")
    return leaderstats:WaitForChild("Lockpicks")
    end
  2. 모듈 함수 섹션에서 플레이어가 상자를 열 수 있는지 확인하는 함수를 생성하려면 새 함수를 TreasureManager 매개 변수 canOpenChest() 와 함께 하세요.


    --모듈 함수
    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. In 작업 공간 > 상자 열기 ChestScript .

  2. 새로운 변수 이름 treasureManager 을 생성하고 서버 스토리지의 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. In partTouched() , under the if humanoid statement, create a new variable named canOpen and set it equal to:

    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이 참이라는 점을 확인합니다.

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

문제 해결 팁

  • In 상자 스크립트 , 모듈 스크립트에서 호출된 함수가 canOpenChest() 과 같이 정확하게 스펠링되어 있는지 확인하십시오. 어떤 차이도 보물 관리자 스크립트에서 찾을 수 없는 오류를 발생시킬 수 있습니다.

  • 함수를 복사하여 붙여넣는 함수, 예를 들어 treasureManager.openChest() ,가 레슨에 표시된 것과 정확히 일치하는지 확인하십시오. 모든 차이는 스크립트에서 미묘한 오류를 일으킬 수 있습니다.

완료된 스크립트

TreasureManager 스크립트 완료

local TreasureManager = {}
local Players = game:GetService("Players")
local keyDrop = 1
local chestPickCost = 1
local chestReward = 100
--Local Functions
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
키 스크립트 완료

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라는 모듈 스크립트는 플레이어가 게임 개체와 상호 작용할 때마다 키를 부여하고 보물을 부여하도록 만들어졌습니다.