이제 플레이어가 코인을 수집했을 때를 감지할 수 있으므로 이 자습서의 이 섹션은 플레이어가 수집한 코인 수를 계산하고 리더보드에 표시하는 방법을 가르쳐줍니다.
코인 수집을 기록하기 위한 모듈 스크립트 컬렉션
각 플레이어의 코인 컬렉션 데이터를 처리하고 관리하려면 모든 플레이어에 대한 코인 컬렉션 데이터에 액세스하는 데이터 구조와 함수를 포함하는 ModuleScript 개체를 만들어야 합니다.모듈 스크립트는 다른 스크립트에서 필요수 있는 재사용 가능한 코드입니다.이 경우, CoinService 는 플레이어가 코인을 터치할 때 코인 컬렉션 데이터를 업데이트할 수 있도록 이 모듈 스크립트를 요구합니다.
모듈 스크립트를 생성하려면:
탐색기 창에서 서버 저장소를 가리키고 ⊕ 버튼을 클릭하십시오. 컨텍스트 메뉴가 표시됩니다.
컨텍스트 메뉴에서 ModuleScript 를 선택합니다.새 모듈 스크립트가 ServerStorage 아래에 표시됩니다.서버에서 코인 컬렉션 로직을 관리하려는 경우 ServerStorage 에 모듈 스크립트를 배치하고 있습니다.
모듈 스크립트를 PlayerData 로 이름 바꾸기.
기본 코드를 다음 코드로 바꿉니다: replace the default code with the following code:
local PlayerData = {}PlayerData.COIN_KEY_NAME = "Coins"local playerData = {--[[[userId: string] = {["Coins"] = coinAmount: number}]]}local DEFAULT_PLAYER_DATA = {[PlayerData.COIN_KEY_NAME] = 0}local function getData(player)local data = playerData[tostring(player.UserId)] or DEFAULT_PLAYER_DATAplayerData[tostring(player.UserId)] = datareturn dataendfunction PlayerData.getValue(player, key)return getData(player)[key]endfunction PlayerData.updateValue(player, key, updateFunction)local data = getData(player)local oldValue = data[key]local newValue = updateFunction(oldValue)data[key] = newValuereturn newValueendreturn PlayerData코드 설명모듈 스크립트는 플레이어를 위한 코인 수집 데이터를 나타내는 0개 또는 많은 표를 포함하는 테이블을 정의합니다.이 모듈 스크립트가 필요한 모든 스크립트는 동일한 PlayerData 테이블 복사본을 받아 여러 스크립트가 코인 컬렉션 데이터를 수정하고 공유할 수 있습니다.
데이터 구조 선언
모듈 스크립트는 스크립트 끝에 반환되는 빈 테이블의 선언으로 시작합니다, PlayerData, 이는 스크립트 끝에 반환됩니다.또한 테이블에서 값을 가져오고 설정하는 액세서리 메서드도 포함합니다.
표에는 코드를 더 쉽게 이해할 수 있도록 테이블의 구조를 설명하는 주석이 포함되어 있습니다.The table contains comments that describe the structure of the table, which makes the code easier to understand.이 경우, playerData 테이블에는 userId 및 해당 플레이어에 대한 수집된 코인 수를 나타내는 필드 이름 Coins 이 포함되어 있습니다.
local PlayerData = {}PlayerData.COIN_KEY_NAME = "Coins"local playerData = {--[[[userId: string] = {["Coins"] = coinAmount: number}]]}...return PlayerData로컬 데이터 액세서 정의
getData() 는 특정 playerData 테이블에 대한 데이터를 검색하는 로컬 함수입니다.플레이어가 코인을 수집하지 않았다면, 모든 플레이어에게 연결된 데이터가 있는지 확인하기 위해 DEFAULT_PLAYER_DATA 테이블을 반환합니다.일반적인 규칙은 간단한 공용 함수를 만들어 논리를 로컬 범위의 함수로 오프로드하여 중량 들기를 수행하는 것입니다.
local DEFAULT_PLAYER_DATA = {[PlayerData.COIN_KEY_NAME] = 0}local function getData(player)local data = playerData[tostring(player.UserId)] or DEFAULT_PLAYER_DATAplayerData[tostring(player.UserId)] = datareturn dataend공용 데이터 액세서 정의
getValue() 및 updateValue()는 이 모듈 스크립트를 요구하는 다른 스크립트가 호출할 수 있는 공용 함수입니다.우리의 경우, 코인 서비스 는 플레이어가 코인을 만질 때마다 이러한 함수를 사용하여 플레이어의 코인 컬렉션 데이터를 업데이트합니다.
function PlayerData.getValue(player, key)return getData(player)[key]endfunction PlayerData.updateValue(player, key, updateFunction)local data = getData(player)local oldValue = data[key]local newValue = updateFunction(oldValue)data[key] = newValuereturn newValueend
리더보드 구현
화면에 표시되는 리더보드로 코인 컬렉션 데이터를 시각적으로 나타낼 수 있습니다.Roblox에는 기본 UI를 사용하여 리더보드를 자동으로 생성하는 내장 시스템이 포함되어 있습니다.
리더보드를 생성하려면:
탐색기 창에서 서버 저장소에 모듈 스크립트를 생성한 다음 리더보드로 모듈 스크립트 이름을 변경합니다.
기본 코드를 다음 코드로 바꿉니다: replace the default code with the following code:
local Leaderboard = {}-- 새로운 리더보드 생성local function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- 리더스탯은 Roblox가 리더보드를 생성하기 위해 인식하는 예약된 이름입니다leaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- 새로운 리더보드 통계 값 생성local function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statend-- 플레이어의 상태 값 업데이트function Leaderboard.setStat(player, statName, value)local leaderstats = player:FindFirstChild("leaderstats")if not leaderstats thenleaderstats = setupLeaderboard(player)endlocal stat = leaderstats:FindFirstChild(statName)if not stat thenstat = setupStat(leaderstats, statName)endstat.Value = valueendreturn Leaderboard코드 설명다음 섹션에서는 리더보드가 더 자세하게 작동하는 방법을 설명합니다.
리더보드 생성
setupLeaderboard() 함수는 새로운 폴더 인스턴스 leaderstats 를 생성하고 지정된 플레이어의 자식으로 설정합니다.Roblox는 leaderstats라는 폴더를 통계 컨테이너로 자동으로 인식하고 통계를 표시하기 위한 UI 요소를 생성합니다.leaderstats 에 있는 값이 "값" 개체로 저장되어야 하며(예: StringValue , IntValue 또는 NumberValue ),
-- 새로운 리더보드 생성local function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- 리더스탯은 Roblox가 리더보드를 생성하기 위해 인식하는 예약된 이름입니다leaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- 새로운 리더보드 통계 값 생성local function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statend플레이어 통계 업데이트
setStat()는 리더보드 모듈에서 유일한 공용 함수이다.이미 존재하지 않는 경우 지정된 플레이어 또는 리더보드 자체에 대한 상태 값을 생성합니다.
FindFirstChild()는 개체의 이름을 가져와 존재하는 경우 개체를 반환하거나 nil는 존재하지 않는 경우 반환하지 않습니다.사용하기 전에 개체가 존재하는지 확인하는 일반적이고 안전한 방법입니다.
-- 플레이어의 상태 값 업데이트function Leaderboard.setStat(player, statName, value)local leaderstats = player:FindFirstChild("leaderstats")if not leaderstats thenleaderstats = setupLeaderboard(player)endlocal stat = leaderstats:FindFirstChild(statName)if not stat thenstat = setupStat(leaderstats, statName)endstat.Value = valueend
모듈 스크립트 통합
플레이어 데이터와 리더보드 모듈 스크립트 둘 다 완료되면 코인 서비스 스크립트에서 플레이어 코인 데이터를 관리하고 표시하기 위해 필요합니다.업데이트 하려면 코인 서비스 :
탐색기 창에서 코인 서비스 스크립트를 엽니다.
다음 코드로 기존 코드를 대체합니다:
-- 서비스 및 변수 초기화local Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local ServerStorage = game:GetService("ServerStorage")-- 모듈local Leaderboard = require(ServerStorage.Leaderboard)local PlayerData = require(ServerStorage.PlayerData)local coinsFolder = Workspace.World.Coinslocal coins = coinsFolder:GetChildren()local COIN_KEY_NAME = PlayerData.COIN_KEY_NAMElocal COOLDOWN = 10local COIN_AMOUNT_TO_ADD = 1local function updatePlayerCoins(player, updateFunction)-- 코인 테이블 업데이트local newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, updateFunction)-- 코인 리더보드 업데이트Leaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)end-- 이벤트 처리기 정의local function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- 플레이어가 코인을 터치했습니다coin.Transparency = 1coin:SetAttribute("Enabled", false)updatePlayerCoins(player, function(oldCoinAmount)oldCoinAmount = oldCoinAmount or 0return oldCoinAmount + COIN_AMOUNT_TO_ADDend)task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend-- 이벤트 수신기 설정for _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)end코드 설명원래 코인 서비스 스크립트의 변경 사항에는 다음이 포함됩니다:
- 플레이어가 코인을 수집할 때 추가할 코인 수로 COIN_AMOUNT_TO_ADD를 선언하고, COIN_KEY_NAME는 플레이어 데이터 에서 정의된 키 이름입니다.
- 플레이어의 코인 수와 관련된 리더보드 상태를 업데이트하기 위한 도우미 함수 생성 updatePlayerCoins() 플레이어의 코인 수와 관련된 리더보드 상태를 업데이트하기 위한 도우미 함수 생성
- 대체자리 표시 print() 문을 onCoinTouched() 에서 updatePlayerCoins() 로 호출하여 바꾸는 중
플레이테스트
코인 컬렉션이 의도한 대로 작동하는지 확인할 시간입니다.게임에서 코인을 터치하고 수집하면 리더보드 UI에서 수집한 코인 수를 볼 수 있어야 합니다.경험을 플레이테스트하려면:
도구 모음에서 플레이 버튼을 클릭하십시오. Studio가 플레이테스트 모드로 들어갑니다.
캐릭터를 이동하여 코인을 터치하십시오.스크립트가 올바르게 작동하면 리더보드 UI가 표시되고 코인을 더 많이 수집할 때 코인 수가 증가합니다.