# SaveUserData

## 유저 데이터 타입

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

***

## 사용 예제

### 유저 데이터 불러오기

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

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

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

```lua
--ClientScript에서

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

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

```lua
--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 값)

```lua
--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)
```

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

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

![](/files/K9hFejIPSGhhZ8VC2rau)

```lua
-- Start Land에서 

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

```lua
-- Connect Land에서 

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

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

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

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

local LandOrder = 1

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

    print("Teleport Start!")
end

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

```lua
-- 텔레포트해서 도착하는 랜드에서 작성해요.

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) 
```

## 유의 사항&#x20;

### 테이블의 경우&#x20;

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

예시

{% tabs %}
{% tab title="ServerScript" %}

```lua
local SomeTable = { 10, 52, 31 }

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

{% endtab %}

{% tab title="ClientScript" %}

```lua
local SomeTable_Client = {}

local function SendSomeTableValue(tableValue)
    table.insert(SomeTable_Client, tableValue)
end
Game:ConnectEventFunction("SendSomeTableValue", SendSomeTableValue)
```

{% endtab %}
{% endtabs %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://ditoland-utplus.gitbook.io/ditoland/manual/saveuserdata.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
