
게임에서 선택한 항목의 이름을 다음 실행에도 쓰려면 메모리에 있는 목록을 파일로 남기는 과정이 필요합니다. 목록을 문자열로 바꾸는 일과 그 문자열을 저장소에 쓰는 일은 구분해서 다루는 편이 읽기 쉽습니다. Unity의 JsonUtility는 직렬화 규칙을 따르는 객체를 JSON 문자열로 바꾸고, JSON에서 객체를 만들 수 있습니다. 이번에는 문자열 목록을 가진 작은 저장용 클래스를 만들고 그 객체를 변환하겠습니다. MonoBehaviour 자체를 복원 대상으로 삼지 않고 데이터만 담는 일반 클래스를 쓰는 구성입니다. 저장할 위치는 Application.persistentDataPath에서 얻고, 파일 입출력에는 System.IO를 사용합니다. 이번 예시에서는 항목 두 개가 들어 있는 목록을 저장한 뒤 같은 파일에서 다시 읽는 한 가지 흐름만 다룹니다. 자동 저장 시점이나 앱 종료 처리는 추가하지 않습니다.
<h2 style="text-align: left;" data-ke-size="size26"><span style="color: #000000; background-color: #ff9600;"><b>C# </b><b>(UNITY 3D)</b></span></h2>

Save List로 목록을 파일에 쓰고 Load List로 읽어 현재 목록을 바꾸는 예제입니다.
빈 GameObject에 JsonListFile.cs를 붙입니다. 플레이 모드에서 스크립트 컴포넌트의 컨텍스트 메뉴에 있는 Save List를 선택한 뒤 Items를 바꾸고 Load List를 선택해 복원 내용을 살펴보는 구성입니다. 콘솔에는 저장 경로를 출력하도록 작성했습니다.
System.Collections.Generic은 List를, System.IO는 파일 입출력을 위해 사용합니다. 저장용 SaveData는 같은 파일 안에 중첩된 일반 클래스이며 MonoBehaviour는 JsonListFile 하나입니다. 파일이 없을 때는 현재 목록을 유지합니다.
<pre class="cs" data-ke-language="cs" data-ke-type="codeblock"><code>using System.Collections.Generic;
using System.IO;
using UnityEngine;
//CodeFinder 코드파인더
//From https://codefinder.janndk.com/
public class JsonListFile : MonoBehaviour
{
[System.Serializable]
public class SaveData
{
public List<string> items;
}
public List<string> items = new List<string> { "항목 A", "항목 B" };
string Get_Path()
{
string folder = Application.persistentDataPath;
return string.IsNullOrEmpty(folder) ? null : Path.Combine(folder, "list.json");
}
[ContextMenu("Save List")]
public void Save_List()
{
string path = Get_Path();
if (path == null)
return;
try
{
// 목록 자체 대신 목록 필드가 있는 객체를 변환합니다.
SaveData data = new SaveData { items = items };
File.WriteAllText(path, JsonUtility.ToJson(data, true));
Debug.Log(path);
}
catch (System.Exception error)
{
Debug.LogWarning("목록 저장 실패: " + error.Message);
}
}
[ContextMenu("Load List")]
public void Load_List()
{
string path = Get_Path();
if (path == null || !File.Exists(path))
return;
try
{
SaveData data = JsonUtility.FromJson<SaveData>(File.ReadAllText(path));
if (data != null && data.items != null)
items = data.items;
}
catch (System.Exception error)
{
Debug.LogWarning("목록 읽기 실패: " + error.Message);
}
}
}
</code></pre>
<b>변수(variable)</b><br>
items(List<string>) : 현재 항목 목록입니다.<br>
SaveData.items(List<string>) : JSON에 담을 목록 필드입니다.
<b>함수(function)</b><br>
Get_Path : 저장 폴더와 list.json을 합칩니다.<br>
Save_List : 객체를 JSON으로 변환해 파일에 씁니다.<br>
Load_List : 파일을 읽고 SaveData를 만들어 목록을 교체합니다.
<b>주의</b>
이 코드는 Unity 6000.6.3f1에서 컴파일 오류가 없는 것까지 확인했습니다. 이 예제는 직접 저장한 파일을 읽는 최소 구성입니다. 경로는 플랫폼마다 다르며 tvOS에서는 persistentDataPath가 지원되지 않습니다. 웹 저장의 영속화와 기기별 파일 접근은 별도 확인 대상입니다. 손상 파일의 완전한 판별, 백업, 암호화는 구현하지 않았습니다. catch는 예외를 알리는 처리이며 정상 저장이나 데이터 보존을 보장하는 장치가 아닙니다.
<p>참고: <a href="https://docs.unity3d.com/6000.0/Documentation/ScriptReference/JsonUtility.ToJson.html">JsonUtility.ToJson</a> · <a href="https://docs.unity3d.com/6000.0/Documentation/ScriptReference/JsonUtility.FromJson.html">JsonUtility.FromJson</a> · <a href="https://docs.unity3d.com/6000.0/Documentation/ScriptReference/Application-persistentDataPath.html">Application-persistentDataPath</a> · <a href="https://docs.unity3d.com/2022.3/Documentation/Manual/JSONSerialization.html">JSONSerialization</a> · <a href="https://docs.unity3d.com/2022.3/Documentation/Manual/script-Serialization.html">script-Serialization</a> · <a href="https://docs.unity3d.com/6000.0/Documentation/ScriptReference/ContextMenu.html">ContextMenu</a></p>
'Unity3D > C#' 카테고리의 다른 글
| 유니티 효과음 한 번 재생하기 (AudioSource.PlayOneShot) (0) | 2026.11.11 |
|---|---|
| 유니티 화면 회전 고정 · 가로 세로 (Screen.orientation, autorotateTo) (0) | 2026.11.07 |
| 유니티 DontDestroyOnLoad 씬 바뀌어도 유지 · 싱글톤 관리자 (GameManager.instance) (0) | 2026.11.06 |
| 유니티 Canvas Scaler 해상도 대응 · Match 값 고르기 (Scale With Screen Size) (0) | 2026.11.05 |
| 유니티 Scroll View 맨 아래로 자동 스크롤 (ScrollRect verticalNormalizedPosition) (0) | 2026.11.04 |