SaveUserData

유저 데이터를 서버에 저장하고 불러오는 방법이에요

유저 데이터 타입

서버에 저장&로드할 수 있는 유저 데이터의 타입은 number, string, bool, vector, color, table 이에요. 🚫 단, 한번 정해진 타입은 바꿀 수 없어요. 🚫 vector, color, dataTime, object 타입이 포함된 table 은 저장할 수 없어요.


사용 예제

유저 데이터 불러오기

저장한 플레이어의 데이터를 서버에서 불러와요.

  • GetSavedUserGameData(플레이어 ID, "Key 값")

💡 클라의 OnEnterPlayer 나 OnSpawnCharacter 이벤트에서 서버의 LoadData 함수를 호출하는 구조로 작성하는 것을 권장해요.

--ClientScript에서

local function EnterPlayer(player)    
    if not player:IsMyPlayer() then
        return
    end

    --서버의 LoadData 함수를 호출해줘요.
    Game:SendEventToServer("LoadData")
end
Game.OnEnterPlayer:Connect(EnterPlayer)
--ServerScript에서

local function LoadData(player)
    if player == nil then
        return
    end

    local playerID = player:GetPlayerID()
   
    --데이터를 불러와 gold 변수에 넣어요.
    local gold = Game:GetSavedUserGameData(playerID, "PlayerGold")
    
    --데이터를 불러와 userName 변수에 넣어요.
    local userName = Game:GetSavedUserGameData(playerID, "PlayerUserName")
    
    --데이터를 불러와 questClear 변수에 넣어요.
    local questClear = Game:GetSavedUserGameData(playerID, "PlayerQuestClear")    
    

    --데이터가 없을 경우, 초기화 처리해요.   
    if gold == nil       then gold = 0 end               --number 타입
    if userName == nil   then userName = "None" end      --string 타입
    if questClear == nil then questClear = false end     --bool 타입

    --서버에서 불러온 데이터를 player에게 할당해요.
    player.Gold = gold
    player.UserName = userName
    player.QuestClear = questClear 
end
Game:ConnectEventFunction("LoadData", LoadData)

유저 데이터 저장

플레이어의 데이터를 서버에 저장해요.

  • SaveUserGameData(플레이어 ID, "Key 값", 저장할 value 값)

--ServerScript에서

------------------------------------------------------------
--number 타입
function UpdatePlayerGold(player, gold)
    if player == nil then
        return
    end

    player.Gold = player.Gold + gold
    local playerID = player:GetPlayerID()
    
    --데이터를 서버에 저장해요.
    Game:SaveUserGameData(playerID, "PlayerGold", player.Gold) 
end
Game:ConnectEventFunction("UpdatePlayerGold", UpdatePlayerGold)

------------------------------------------------------------
--string 타입
function UpdatePlayerUserName(player, userName)
    if player == nil then
        return
    end

    player.UserName = userName
    local playerID = player:GetPlayerID()
    
    --데이터를 서버에 저장해요.
    Game:SaveUserGameData(playerID, "PlayerUserName", player.UserName)
end
Game:ConnectEventFunction("UpdatePlayerUserName", UpdatePlayerUserName)

------------------------------------------------------------
--bool 타입
function UpdatePlayerQuestClear(player, questClear)
    if player == nil then
        return
    end

    player.QuestClear = questClear
    local playerID = player:GetPlayerID()
    
    --데이터를 서버에 저장해요.
    Game:SaveUserGameData(playerID, "PlayerQuestClear", player.QuestClear)
end
Game:ConnectEventFunction("UpdatePlayerQuestClear", UpdatePlayerQuestClear)

랜드 텔레포트 시, 유저 데이터

연결되어 있는 랜드는 유저 데이터를 서로 공유해요.

-- Start Land에서 

-- "PlayerGold" 라는 Key 값에 데이터를 저장해요.
Game:SaveUserGameData(playerID, "PlayerGold", player.Gold) 
-- Connect Land에서 

-- Start Land에서 저장했던 데이터를 Connect Land에서도 로드할 수 있어요.
local gold = Game:GetSavedUserGameData(playerID, "PlayerGold")
player.Gold = gold

다른 랜드로 텔레포트할 때 휘발성 데이터를 저장하고 싶다면, 아래 내용을 참고해주세요. AddLandTransferData로 저장한 데이터는 월드를 떠나면 사라져요.

  • AddLandTransferData(”Key 값”, 저장할 value 값)

-- 텔레포트로 이동을 시작하는 랜드에서 작성해요.

local LandOrder = 1

local function TeleportStart(player)
    --해당 랜드에 이동해서 사용할 데이터를 저장해요.
    player:AddLandTransferData("PlayerGold", 1300)
    player:AddLandTransferData("PlayerNickName", "Dito1234")

    print("Teleport Start!")
end

--플레이어가 특정 랜드로 텔레포트 이동을 시작할때 호출되는 함수를 연결해요. 
Game:AddTeleportStartEvent(LandOrder, TeleportStart)
-- 텔레포트해서 도착하는 랜드에서 작성해요.

local function TeleportFinish(player, TransferData)
    -- AddLandTransferData 로 설정한 데이터의 개수를 가져오는 방법이에요. 
    print("Teleport Data Count : ", TransferData:DataCount())

    for i, key, value in pairs(TransferData:DataArray()) do
        -- AddLandTransferData 로 설정한 데이터의 Key 값과 Value 값을 가져오는 방법이에요. 
        if key == "PlayerGold"     then player.Gold = value     end
        if key == "PlayerNickName" then player.NickName = value end
    end
end

--텔레포트가 끝났을 때 이전 랜드에서 설정한 데이터를 받을 함수를 연결해요.
Game.OnTeleportFinishEvent:Connect(TeleportFinish) 

유의 사항

테이블의 경우

table 타입은 BroadcastEvent / SendEventToServer / SendEventToClient 같은 SendEvent에서 전달 인자로 table을 바로 사용할 수 없어요. 따라서 table의 요소를 하나씩 전달해줘야 해요.

예시

local SomeTable = { 10, 52, 31 }

local function Test()
    for i = 1, #SomeTable do
        Game:SendEventToClient(playerID, "SendSomeTableValue", SomeTable[i])
    end
end

Last updated