[로블록스]#9 - 데이터 저장
게임을 껐다가 다시 켰다.
그런데 모든 것이 초기화된다면?
이번 글에서는 로블록스에서 데이터를 저장하고 불러오는 핵심 시스템, DataStore를 Unity 개발자 관점에서 정리해본다.
1. 왜 DataStore가 중요한가
로블록스 게임은 기본적으로 온라인 게임이다.
그래서 다음 데이터는 반드시 서버에서 저장되어야 한다.
- 재화(Gold)
- 레벨
- 아이템 보유 여부
- 스킨 / 업적
LocalScript에서 저장한 데이터는
게임을 나가면 전부 사라진다.
2. DataStoreService 기본 개념
로블록스의 저장 시스템은 DataStoreService가 담당한다.
local DataStoreService = game:GetService("DataStoreService")
local PlayerDataStore = DataStoreService:GetDataStore("PlayerData")
Unity로 치면, 백 엔드 서비스 PlayFab / Firebase의 아주 간단한 버전이라고 생각하면 된다.
3. 데이터 불러오기 (PlayerAdded)
플레이어가 게임에 접속하면 서버에서 데이터를 불러온다.
game.Players.PlayerAdded:Connect(function(player)
local data
local success, err = pcall(function()
data = PlayerDataStore:GetAsync(player.UserId)
end)
if success and data then
player.leaderstats.Gold.Value = data.Gold
else
player.leaderstats.Gold.Value = 0
end
end)
pcall을 반드시 사용하는 이유는 저장/불러오기가 실패할 수 있기 때문이다.
> Roblox 공식 문서에서도 DataStore는 무조건 pcall 사용 권장
> Unity에서 try-catch문법과 같다.
Unity 개발자 기준 정리
| 개념 | C# | Lua |
| 예외 처리 | try–catch | pcall |
| 에러 객체 | Exception | string |
| 다중 반환 | 불가 | 가능 |
| 성능 | 비교적 무거움 | 가벼움 |
4. 데이터 저장하기 (PlayerRemoving)
플레이어가 나갈 때 데이터를 저장한다.
game.Players.PlayerRemoving:Connect(function(player)
local data = {
Gold = player.leaderstats.Gold.Value
}
local success, err = pcall(function()
PlayerDataStore:SetAsync(player.UserId, data)
end)
end)
서버 종료 시(점검 등)를 대비해 BindToClose도 함께 사용해야 한다.
| Unity | Roblox |
| OnApplicationQuit() | BindToClose() |
| 에디터/빌드 종료 | 서버 종료 |
| 로컬 앱 기준 | 멀티플레이 서버 기준 |
5. 왜 SetAsync만 쓰면 위험한가
같은 계정이 여러 서버에서 동시에 저장이 발생하면 데이터가 덮어써질 수 있다.
>가장 마지막 저장만 살아남음
>중간 진행/보상 증발 가능성
실전에서는
UpdateAsync가 기본이다.
PlayerDataStore:UpdateAsync(player.UserId, function(oldData)
oldData = oldData or {}
oldData.Gold = player.leaderstats.Gold.Value
return oldData
end)
| 항목 | SetAsync | UpdateAsync |
| 덮어쓰기 | 무조건 | 불가 |
| 동시성 안전 | 불가 | 가능 |
| 부분 수정 | 불가 | 가능 |
| 재시도 | 불가 | 가능 |
| 실전 권장 | 권장 안함 | 매우 권장 |
6. DataStore 사용 시 반드시 지켜야 할 규칙
- 저장은 서버 Script에서만
- pcall로 실패 대비
- 빈번한 저장 금지
- 데이터 구조는 테이블로
- UpdateAsync 우선 사용
DataStore는 편하지만, 무제한이 아니다.
7. Unity 개발자가 가장 많이 하는 실수
- LocalScript에서 저장 시도
- pcall을 생략
- 접속 중 수시 저장
- 숫자만 단일로 저장
DataStore 호출은, “로그아웃 시 한 번”, “중요 이벤트 후” 정도가 적당하다.
8. 다음 글 예고
다음 글에서는 게임 구조 설계, 즉 로비 → 게임 → 보상 흐름을 다룰 예정이다.
이제 “만드는 법”이 아니라
“어떻게 굴릴 것인가”
'■ 로블록스 개발 노트 > 개발일지' 카테고리의 다른 글
| [로블록스]#11 - Toolbox & 에셋 (0) | 2025.12.31 |
|---|---|
| [로블록스]#10 - 게임 구조 설계(로비 -> 인게임) (0) | 2025.12.31 |
| [로블록스]#8 - RemoteEvent & 서버 통신 (0) | 2025.12.30 |
| [로블록스]#7 - ScreenGUI (0) | 2025.12.30 |
| [로블록스]#6 - 입력 처리 & 카메라 제어 (1) | 2025.12.30 |
댓글