서버에 저장&로드할 수 있는 유저 데이터의 타입은 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
local SomeTable_Client = {}
local function SendSomeTableValue(tableValue)
table.insert(SomeTable_Client, tableValue)
end
Game:ConnectEventFunction("SendSomeTableValue", SendSomeTableValue)