[Unity] 데이터 관리

조경민·2026년 2월 19일

데이터 관리

데이터 관리를 이해하기 위해 알아야할 선수지식

  • 직렬화: 객체 → 파일로 바꾸는 것
    • 객체를 박스(JSON, 파일)에 정리해서 담는 것
    • 목적
      • HDD/SDD로 저장하기 위해
      • 네트워크로 전송하기 위해
      • 유니티 인스펙터 창에 데이터 노출하기 위해
  • 역직렬화: 파일 → 객체로 복원하는 것
    • 박스에서 꺼내서 다시 객체로 복원

PlayerPrefs

  • 빠르게 사용 가능
  • 저장 공간에 제약
  • 보안 취약

사용처

게임 설정 -> 인게임에 크게 영향을 받지 않는 곳에 활용됨

  • 설정창
  • 튜토리얼 완료 여부

중요한 정보 ❌-> 변동성이 심한 데이터는 적합하지 않음.

사용법

PlayerPrefs.SetInt("키", value);
PlayerPrefs.SetFloat("키", value);
PlayerPrefs.SetString("키", value);

PlayerPrefs.GetInt("키", value);
PlayerPrefs.GetFloat("키", value);
PlayerPrefs.GetString("키", value);

유니티 PlayerPrefs 저장 장소

플랫폼저장 위치 및 형식
Windows레지스트리에 저장됩니다. 레지스트리 편집기에서 아래 경로를 확인하세요.
HKEY_CURRENT_USER\Software\[CompanyName]\[ProductName]
macOSplist 파일로 저장됩니다. Apple 공식 가이드에 따라 라이브러리 폴더를 확인하세요.
~/Library/Preferences/unity.[CompanyName].[ProductName].plist
AndroidSharedPreferences 시스템을 사용하며 XML 파일로 저장됩니다. (루팅 필요)
/data/data/[PackageName]/shared_prefs/[PackageName].xml
iOS앱의 Library/Preferences 폴더 내 .plist 파일에 저장됩니다.
Linuxconfig 파일로 저장됩니다.
~/.config/unity3d/[CompanyName]/[ProductName]

CSV

Comma Separated Values

  • 협업 효율이 좋음 -> 엑셀로 편하게 수치를 기입하고 수정
  • 표로 구성되어 있어서 복잡한 구조(계층)에는 치명적
ID,HP,ATK
1,100,10
2,200,20
  • 엑셀 -> 텍스트로 저장
  • 사용하지 않을 때 문제
    • 기획자 접근(협업) 불가
    • 하드 코딩
    • 데이터 변경 용이X -> 자신만 알아봄

CSV 장점

  • 코드(게임 로직) ↔ 데이터 분리 -> 기획자가 데이터 값 수정 용이
  • 버전 관리 & 협업 용이

CSV 단점

  • 계층적 구조 -> 표현 불가능

    Weapon
    └─ Sword
        └─ RareSword
    Weapon,Sword,RareSword
    Monster
        └─ Skill
            ├─  Fire
            ├─  Ice
    ID,Skill1,Skill2 ...
    1,Fire,Ice
    2,

CSV 한계

  • 타입 정보 없음 (int, float, bool)
  • 구조적 표현이 불가
  • 런타임 수정 불편

사용처

  • 데이터 수치를 기획자가 만질 일이 많은 경우
  • 수치 테이블 (밸런스 기획)
    • 아이템 정보 스탯
    • 몬스터 정보
  • 퀘스트 리스트

Json

객체 -> 텍스트로 바꿔 외부와 교환하는 방법

  • 리스트, 딕셔너리 같은 복잡한 자료구조를 파일 하나로 묶을 수 있음

실무에서 가지던 문제들

  • 하드코딩된 필드 변수
    int level = 5;
  • 메모리 휘발
    • Unity 객체는 메모리
    • 게임 종료 시, 데이터 삭제
  • 서버 데이터
    {
        "gold": 500,
        "items": ["sword", "potion"]
    }
    • 문자열 -> 객체 복원해줘야함

👉🏻 이 문제들의 해결방법 중 하나가 Json


사용 예시

// Player.cs -> 게임 로직 담당
public class Player : MonoBehaviour
{
	public int _level;
	public int _gold;
	
	public string _path;
	
	public void Save()
	{
		string json = JsonUtility.ToJson(this);
		File.WriteAllText(_path, json);
	}
}
  • 위 코드의 문제점
    • Json = 데이터를 직접적으로 만짐

  • 역할 분리

    • Player.cs

      public class Player : MonoBehavior
      {
          public int _level;
          public int _gold;
      }

      -> 게임 플레이만 담당

    • JsonHandler.cs

      public static class JsonHandler
      {
          // 파일 변환
          public static string ToJson(Data data)
          {
              return JsonUtility.ToJson(data);
          }
          
          // 파일 저장
          public static void Save(string path, string json)
          {
              File.WriteAlltext(path, json);
          }
      }

사용처

  • 직렬화 포맷
    • 데이터를 저장, 통신

유니티에서 제공하는 JSON 2가지

JsonUtility

  • JsonUtility는 Unity 저장 규칙 따름 (Inspector에 뜨냐/안 뜨냐)

  • 특징

    • Unity 기본 제공
    • 빠르다
    • 제한 많음
  • 장점

    • 간단한 구조 적합
    • 세이브/설정에 충분히 활용 가능
  • 한계점

    • Dictionary 미지원
    • 프로퍼티(Property) 미지원
    • 상속 제한
  • 사용처

    • 설정창
    • 업적

Newtonsoft Json

설치: Package Manager - Install package from git URL
-> com.unity.nuget.newtonsoft-json

  • Newtonsoft Json은 Unity 규칙 무관 -> C# 객체를 직접 Json 바꿈

  • JsonUtility보다 기능이 훨씬 많고, 복잡한 Json 구조를 처리할 수 있다.

  • 사용처

    • NPC 대사
    • 유저 인벤토리

ScriptableObject

  • 유니티 에디터로 지원되는 기능
  • 정적 데이터 저장 시 유용
  • 프로젝트에 .asset 파일로 존재

사용처

  • 유니티에서 제공하는 초기 데이터 설정
    • 초기 데이터 타입
      • 몬스터 종류
      • 프리팹
      • HP/MP
      • 이동속도
      • 연출 애니메이션
      • SFX 등등
profile
안녕하세요

0개의 댓글