이제 플레이어가 코인을 수집했는지 감지할 수 있으면 이 튜토리얼의 이 섹션에서는 플레이어가 수집한 코인의 수를 계산하고 리더보드표시하는 방법을 설명합니다.
코인 컬렉션을 기록하기위한 모듈 스크립트 생성
각 플레이어의 코인 컬렉션 데이터를 처리하기 위해 ModuleScript 개체를 생성해야 합니다. 모듈 스크립트는 다른 스크립트가 요구할 수 있는 코인 컬렉션 데이터에 액세스하는 데 필요한 데이터 구조 및 함수를 포함합니
모듈 스크립트를 생성하려면:
탐색기 창에서 서버 스토리지를 마우스로 오버하고 ⊕ 버튼을 클릭하십시오. 컨텍스트 메뉴가 표시됩니다.
컨텍스트 메뉴에서 모듈 스크립트를 선택합니다. 새로운 모듈 스크립트가 ServerStorage 아래에 표시됩니다. 코인 컬렉션 로직을 서버에서 관리하려는 이유로 모듈 스크립트를 ServerStorage에 배치하고 있습니다.
모듈 스크립트를 PlayerData 로 이름 변경합니다.
다음 코드로 기본 코드를 대체합니다.
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코드 설명모듈 스크립트는 플레이어에게 코인 컬렉션 데이터를 나타내는 PlayerData 테이블을 정의하는 모듈 스크립트입니다. 모듈 스크립트는 플레이어에게 코인 컬렉션 데이터를 나타내는 playerData 테이블을 정의합니다. 이 모듈 스크립트는 여러
데이터 구조 선언
모듈 스크립트는 모듈이 끝에 반환하는 빈 테이블 선언으로 시작합니다. PlayerData, 이 모듈 스크립트의 끝에 반환됩니다. 또한 모듈에서 값을 가져오고 설정하는 액세서리 메서드도 포함됩니다.
playerData 테이블에는 코드를 쉽게 이해하도록 테이블 구조를 설명하는 코멘트가 포함되어 있습니다. 이 경우 playerData 테이블에는 userId 테이블에 있는 코멘트와 해당 플레이어에게 수집된 코인의 수를 나타내는 필드 1>
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공개 데이터 액세서 정의
:`get:`] 및 updateValue() 는 이 모듈 스크립트를 호출하는 다른 스크립트에게 공개 얼굴 기능입니다. 우리의 경우, CoinService는 이 함수를 사용하여 플레이어가 코인을 터치할 때마다 플레이어의 코인 컬렉션 데이터를 업데이트합니다.
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를 사용하여 순위표를 자동으로 생성하는 내장 시스템이 있습니다.
리더보드생성하려면:
탐색기 창에서 ModuleScript를 ServerStorage에 만들고 모듈 스크립트를 순위표로 이름을 변경한 다음 2>Leaderboard2>로 이동합니다.
다음 코드로 기본 코드를 대체합니다.
local Leaderboard = {}-- 새로운 리더보드생성local function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- 리더보드를 만드는데 Roblox에서 인정한 'leaderstats'라는 이름입니다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() 함수는 새로운 폴더 인스턴스를 만들고 해당 폴더를 지정된 플레이어의 자식으로 설정합니다. Rob
-- 새로운 리더보드생성local function setupLeaderboard(player)local leaderstats = Instance.new("Folder")-- 리더보드를 만드는데 Roblox에서 인정한 'leaderstats'라는 이름입니다leaderstats.Name = "leaderstats"leaderstats.Parent = playerreturn leaderstatsend-- 새로운 순위표 통계 값 생성local function setupStat(leaderstats, statName)local stat = Instance.new("IntValue")stat.Name = statNamestat.Value = 0stat.Parent = leaderstatsreturn statendPlayer 통계 업데이트
setStat() 모듈의 setStat() 은 현재 존재하지 않는 경우 지정된 플레이어 또는 순위표 자체에 대한 통계 값을 생성합니다.
FindFirstChild() 개체의 이름을 가져오고 해당 개체가 있는 경우 개체를 반환하거나, nil 개체가 없는 경우 Class.Instance:FindFirstChild() 의 메서드를 사용하여 개체를 찾습니다. 이것은 일반적이고 안전한 메서드입니다.
-- 플레이어의 통계 값 업데이트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
모듈 스크립트 통합
플레이어 데이터 및 순위표 모듈 스크립트가 모두 완료되면 CoinService 스크립트에서 플레이어 코인 데이터를 관리하고 표시하려면 필요합니다. 업데이트하려면 CoinService :
In the 탐색기 창, open the CoinService script.
다음 코드로 기존 코드를 대체합니다.
-- 서비스 및 변수 초기화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코드 설명원래 CoinService 스크립트의 변경 내용에는 다음이 포함됩니다.
- Global.LuaGlobals.필요() 함수로 플레이어 데이터 및 리더보드 모듈을 가져오는 중입니다.
- 플레이어가 코인을 수집할 때 추가할 코인 수를 선언하고, COIN_AMOUNT_TO_ADD 를 코인 수의 숫자로 정의하고, COIN_KEY_NAME 을 플레이어 데이터에 정의된 키 이름으로 정의합니다.
- 플레이어의 코인 수와 관련된 순위표 통계를 업데이트하기 위해 헬퍼 함수를 생성하십시오. updatePlayerCoins()
- 코인 터치 시 문자 串 print() 을 사용하여 대체자 onCoinTouched() 를 대체하는 코드.
플레이테스트
코인 컬렉션이 제대로 작동하는지 확인할 시간입니다. 게임에서 코인을 터치하고 수집하면 코인 획득 내역이 리더보드 UI에 표시되어야 합니다. 경험을 테스트하려면:
메뉴 바에서 플레이 버튼을 클릭합니다. Studio가 플레이테스트 모드로 들어갑니다.
캐릭터를 이동하여 코인을 터치하십시오. 스크립트가 올바르게 작동하는 경우 순위표 UI가 표시되고 코인 수를 증가하면서 코인을 수집합니다.