모듈 스크립트의 지식을 적용하려면 플레이어가 열쇠를 잡고 사용하여 보물 상자를 열 수 있는 모듈 스크립트를 만듭니다.
프로젝트 설정
이 프로젝트에는 열쇠와 보물 상자를 위해 리더보드 및 스크립트 픽업 개체가 있는 시작 지도가 포함되어 있습니다.
시작 프로젝트 불러오기
In Roblox Studio, 모듈 스크립트 소개 - 스타터 프로젝트 .
모듈 스크립트 생성
플레이어는 상자에서 보물을 얻을 수 있으며, TreasureManager라는 이름의 모듈 스크립트를 만듭니다. 모듈 스크립트를 사용하면 픽업과 순위표를 함께 연결할 수 있습니다.
In ServerStorage , 새로운 ModuleScript 를 생성하고 이름을 TreasureManager로 변경합니다.
In TreasureManager , 기존 모듈 테이블을 모두 교체하여 module 를 TreasureManager 로 대체합니다.
local TreasureManager = {}return TreasureManager
모듈 스크립트에서 함수 사용
모듈 스크립트에서 함수가 작동하는지 테스트하려면 새로운 함수를 만듭니다. getKey() 이라는 이름의 함수입니다. 다른 스크립트에서 함수가 getKey() 를 호출하면 키 부분을 파괴하고 플레이어의 인벤토리에 1을 추가합니다.
열에 대한 모듈 함수 생성
이 모듈 스크립트는 모듈과 로컬 함수의 조합을 사용하여 두 가지 컴멘트를 두 개 사용하여 별도로 유지하도록 도와줍니다.
local TreasureManager = {}--Local Functions--모듈 함수return TreasureManagerUnder the 모듈 함수 코멘트를 달다/남기다, 의견을 내다, add a new module function to TreasureManager named getKey() .
다음 두 매개 변수를 사용합니다.
- keyPart - 파괴할 부품.
- whichCharacter - 키 부분을 터치한 플레이어.
local TreasureManager = {}--Local Functions--모듈 함수function TreasureManager.getKey(keyPart, whichCharacter)endreturn TreasureManagerIn getKey() , destroy keyPart .
function TreasureManager.getKey(keyPart, whichCharacter)keyPart:Destroy()end
모듈 함수 사용
이제 모듈 함수 getKey()를 다른 스크립트에서 사용할 수 있습니다. 이 함수를 테스트하려면 미리 만든 스크립트를 열고 호출합니다.
Open the key script in 작업 공간 > 키 > 키스크립트 .
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.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".
키스크립트에서 모듈 스크립트를 위한 요구 사항을 포함하는 줄을 확인하십시오. 모듈이 요구 필요포함하지 않으면 해당 모듈 스크립트의 함수 및 변수를 사용할 수 없습니다. 문제: 스크립트가 실행되지 않거나 열쇠를 픽업하지 못합니다.
모듈 스크립트에서 모든 코드가 local TreasureManager = {} 및 return TreasureManager 사이에 있는지 확인하십시오. 반환은 모듈 스크립트의 마지막 줄의 코드여야 합니다.
필요사항에 대해 부모 두 개가 있는지 확인하십시오, 같이 WaitForChild("TreasureManager")) .
로컬 함수 생성
현재 순위표는 플레이어의 열쇠와 보물을 추적합니다. 순위표 숫자를 변경하려면 모듈 스크립트의 로컬 함수를 사용하십시오. 로컬 함수는 플레이어의 열쇠 또는 보물 값을 변경하는 경우에만 필요하므로 사용하지 마십시오.
In ServerStorage , TreasureManager 스크립트를 엽니다.
팔로잉수행하려면 로컬 변수를 생성하세요:
스크립트가 플레이어의 순위표 통계와 함께 작동할 수 있도록 플레이어 서비스를 가져옵니다.
키 파트를 터치한 후 플레이어가 받는 키 수를 저장합니다. keyPart .
local TreasureManager = {}local Players = game:GetService("Players")local keyDrop = 1--Local Functions--모듈 함수function TreasureManager.getKey(keyPart, whichCharacter)keyPart:Destroy()endreturn TreasureManager이 두 로컬 함수를 로컬 함수 섹션에 복사하고 붙여넣습니다.
getPlayerKeys() 는 플레이어의 Lockpicks 리더 스탯의 값을 반환합니다.
getPlayerTreasure()는 플레이어의 Treasure 리더 스탯의 값을 반환합니다.
--Local Functionslocal 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 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 모듈 스크립트를 사용하여 열기 전에 적어도 하나의 열쇠가 있는지 확인하고 금을 제공합니다.
상자를 열 수 있는지 확인
서버 스토리지 내에서 보물 관리자 스크립트를 먼저 설정하고, 상자를 열 때마다 필요한 키 수 및 각 상자에 얼마나 많은 골드가 포함되는지 변수를 설정하십시오.
local TreasureManager = {}local Players = game:GetService("Players")local keyDrop = 1local chestPickCost = 1local chestReward = 100--Local Functionslocal function getPlayerKeys(whichCharacter)local player = Players:GetPlayerFromCharacter(whichCharacter)local leaderstats = player:FindFirstChild("leaderstats")return leaderstats:WaitForChild("Lockpicks")end모듈 함수 섹션에서 플레이어가 상자를 열 수 있는지 확인하는 함수를 생성하려면 새 함수를 TreasureManager 매개 변수 canOpenChest() 와 함께 하세요.
--모듈 함수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() 함수를 사용하여 상자를 열 수 있습니다.
In 작업 공간 > 상자 열기 ChestScript .
새로운 변수 이름 treasureManager 을 생성하고 서버 스토리지의 TreasureManager 모듈 스크립트를 요구합니다.
local ServerStorage = game:GetService("ServerStorage")-- 아래의 모듈 스크립트 필요local treasureManager = require(ServerStorage:WaitForChild("TreasureManager"))local chests = script.Parentlocal chestsFolder = chests.Partslocal chestsArray = chestsFolder:GetChildren()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.Parentlocal humanoid = whichCharacter:FindFirstChildWhichIsA("Humanoid")if humanoid then-- 플레이어가 상자를 열 수 있는지 확인하고 보물을 얻을 수 있도록 허용하십시오-- =============================================local canOpen = treasureManager.canOpenChest(whichCharacter)-- =============================================endend다음으로, if 문을 만들어 canOpen이 참이라는 점을 확인합니다.
그렇다면 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개가 있으면 보물 상자를 열 수 없습니다.
문제 해결 팁
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라는 모듈 스크립트는 플레이어가 게임 개체와 상호 작용할 때마다 키를 부여하고 보물을 부여하도록 만들어졌습니다.