플레이어 데이터 기록 및 표시

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


이제 플레이어가 코인을 수집했는지 감지할 수 있으면 이 튜토리얼의 이 섹션에서는 플레이어가 수집한 코인의 수를 계산하고 리더보드표시하는 방법을 설명합니다.

코인 컬렉션을 기록하기위한 모듈 스크립트 생성

각 플레이어의 코인 컬렉션 데이터를 처리하기 위해 ModuleScript 개체를 생성해야 합니다. 모듈 스크립트는 다른 스크립트가 요구할 수 있는 코인 컬렉션 데이터에 액세스하는 데 필요한 데이터 구조 및 함수를 포함합니

모듈 스크립트를 생성하려면:

  1. 탐색기 창에서 서버 스토리지를 마우스로 오버하고 ⊕ 버튼을 클릭하십시오. 컨텍스트 메뉴가 표시됩니다.

  2. 컨텍스트 메뉴에서 모듈 스크립트를 선택합니다. 새로운 모듈 스크립트가 ServerStorage 아래에 표시됩니다. 코인 컬렉션 로직을 서버에서 관리하려는 이유로 모듈 스크립트를 ServerStorage에 배치하고 있습니다.

    Studio's Explorer window with both the ServerScriptService's plus icon and ModuleScript object highlighted.
  3. 모듈 스크립트를 PlayerData 로 이름 변경합니다.

    Studio's Explorer window with the PlayerData script highlighted under ServerStorage.
  4. 다음 코드로 기본 코드를 대체합니다.


    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_DATA
    playerData[tostring(player.UserId)] = data
    return data
    end
    function PlayerData.getValue(player, key)
    return getData(player)[key]
    end
    function PlayerData.updateValue(player, key, updateFunction)
    local data = getData(player)
    local oldValue = data[key]
    local newValue = updateFunction(oldValue)
    data[key] = newValue
    return newValue
    end
    return 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_DATA
    playerData[tostring(player.UserId)] = data
    return data
    end

    공개 데이터 액세서 정의

    :`get:`] 및 updateValue() 는 이 모듈 스크립트를 호출하는 다른 스크립트에게 공개 얼굴 기능입니다. 우리의 경우, CoinService는 이 함수를 사용하여 플레이어가 코인을 터치할 때마다 플레이어의 코인 컬렉션 데이터를 업데이트합니다.


    function PlayerData.getValue(player, key)
    return getData(player)[key]
    end
    function PlayerData.updateValue(player, key, updateFunction)
    local data = getData(player)
    local oldValue = data[key]
    local newValue = updateFunction(oldValue)
    data[key] = newValue
    return newValue
    end

순위 표 구현

코인 컬렉션 데이터를 시각적으로 리더보드로 표시할 수 있습니다. Roblox에는 기본 UI를 사용하여 순위표를 자동으로 생성하는 내장 시스템이 있습니다.

리더보드생성하려면:

  1. 탐색기 창에서 ModuleScript를 ServerStorage에 만들고 모듈 스크립트를 순위표로 이름을 변경한 다음 2>Leaderboard2>로 이동합니다.

    Studio's Explorer window with the Leaderboard script highlighted under ServerStorage.
  2. 다음 코드로 기본 코드를 대체합니다.


    local Leaderboard = {}
    -- 새로운 리더보드생성
    local function setupLeaderboard(player)
    local leaderstats = Instance.new("Folder")
    -- 리더보드를 만드는데 Roblox에서 인정한 'leaderstats'라는 이름입니다
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player
    return leaderstats
    end
    -- 새로운 순위표 통계 값 생성
    local function setupStat(leaderstats, statName)
    local stat = Instance.new("IntValue")
    stat.Name = statName
    stat.Value = 0
    stat.Parent = leaderstats
    return stat
    end
    -- 플레이어의 통계 값 업데이트
    function Leaderboard.setStat(player, statName, value)
    local leaderstats = player:FindFirstChild("leaderstats")
    if not leaderstats then
    leaderstats = setupLeaderboard(player)
    end
    local stat = leaderstats:FindFirstChild(statName)
    if not stat then
    stat = setupStat(leaderstats, statName)
    end
    stat.Value = value
    end
    return Leaderboard

    다음 섹션에서는 순위표가 어떻게 작동하는지 자세히 설명합니다.

    순위표 생성

    setupLeaderboard() 함수는 새로운 폴더 인스턴스를 만들고 해당 폴더를 지정된 플레이어의 자식으로 설정합니다. Rob


    -- 새로운 리더보드생성
    local function setupLeaderboard(player)
    local leaderstats = Instance.new("Folder")
    -- 리더보드를 만드는데 Roblox에서 인정한 'leaderstats'라는 이름입니다
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player
    return leaderstats
    end
    -- 새로운 순위표 통계 값 생성
    local function setupStat(leaderstats, statName)
    local stat = Instance.new("IntValue")
    stat.Name = statName
    stat.Value = 0
    stat.Parent = leaderstats
    return stat
    end

    Player 통계 업데이트

    setStat() 모듈의 setStat() 은 현재 존재하지 않는 경우 지정된 플레이어 또는 순위표 자체에 대한 통계 값을 생성합니다.

    FindFirstChild() 개체의 이름을 가져오고 해당 개체가 있는 경우 개체를 반환하거나, nil 개체가 없는 경우 Class.Instance:FindFirstChild() 의 메서드를 사용하여 개체를 찾습니다. 이것은 일반적이고 안전한 메서드입니다.


    -- 플레이어의 통계 값 업데이트
    function Leaderboard.setStat(player, statName, value)
    local leaderstats = player:FindFirstChild("leaderstats")
    if not leaderstats then
    leaderstats = setupLeaderboard(player)
    end
    local stat = leaderstats:FindFirstChild(statName)
    if not stat then
    stat = setupStat(leaderstats, statName)
    end
    stat.Value = value
    end

모듈 스크립트 통합

플레이어 데이터 및 순위표 모듈 스크립트가 모두 완료되면 CoinService 스크립트에서 플레이어 코인 데이터를 관리하고 표시하려면 필요합니다. 업데이트하려면 CoinService :

  1. In the 탐색기 창, open the CoinService script.

  2. 다음 코드로 기존 코드를 대체합니다.


    -- 서비스 및 변수 초기화
    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.Coins
    local coins = coinsFolder:GetChildren()
    local COIN_KEY_NAME = PlayerData.COIN_KEY_NAME
    local COOLDOWN = 10
    local COIN_AMOUNT_TO_ADD = 1
    local 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") then
    local character = otherPart.Parent
    local player = Players:GetPlayerFromCharacter(character)
    if player then
    -- 플레이어가 코인을 만졌습니다
    coin.Transparency = 1
    coin:SetAttribute("Enabled", false)
    updatePlayerCoins(player, function(oldCoinAmount)
    oldCoinAmount = oldCoinAmount or 0
    return oldCoinAmount + COIN_AMOUNT_TO_ADD
    end)
    task.wait(COOLDOWN)
    coin.Transparency = 0
    coin:SetAttribute("Enabled", true)
    end
    end
    end
    -- 이벤트 수신기 설정
    for _, coin in coins do
    coin: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에 표시되어야 합니다. 경험을 테스트하려면:

  1. 메뉴 바에서 플레이 버튼을 클릭합니다. Studio가 플레이테스트 모드로 들어갑니다.

    Studio's Home tab with the Play button highlighted in the menu bar.
  2. 캐릭터를 이동하여 코인을 터치하십시오. 스크립트가 올바르게 작동하는 경우 순위표 UI가 표시되고 코인 수를 증가하면서 코인을 수집합니다.