| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- raycast
- 크루스칼
- readonly
- 유니티 sparkmain(clone)
- dfs
- 너비탐색
- sparkmain(clone) 무한생성
- 최소신장트리 mst
- C#
- removeAll
- GetComponent
- 티스토리챌린지
- 깊이탐색
- unity sparkmain(clone)
- Simulation
- Unity
- articulation body
- 디지털트윈
- 습관형성 #직장인자기계발 #오공완
- dropdown
- 트리구조
- 최단거리 알고리즘
- 유니티
- 행동트리
- navisworks api
- 오블완
- unity korea
- sparkmain(clone)
- list clear
- 드롭다운
- Today
- Total
낑깡의 게임 프로그래밍 도전기
Unity C# : 다양한 세이브(Save) 기능 옵션 소개 본문
유니티 세이브 기능은 구현의 복잡성과 데이터의 양, 그리고 필요한 성능에 따라 다르게 선택될 수 있다.
주요 세이브 기능 옵션
1. PlayerPrefs
- 장점: 간단하고 빠르게 설정 가능.
- 단점: 주로 문자열, 정수, float 값만 저장 가능. 대량의 데이터나 복잡한 데이터 구조에는 부적합.
- 사용 예시: 설정 값이나 간단한 게임 상태 저장.
PlayerPrefs.SetString("modelPath", modelPath);
PlayerPrefs.Save();
2. 파일 시스템 (JSON, XML, 바이너리 파일)
- 장점: 복잡한 데이터 구조 저장 가능. 다양한 포맷 지원 (JSON, XML, 바이너리 등).
- 단점: 직접 파일 읽기/쓰기를 구현해야 함.
- 사용 예시: 게임 진행 상태, 인벤토리 데이터, 로드된 모델 정보 저장.
[System.Serializable]
public class SaveData
{
public List<string> modelPaths;
}
public void Save(string filePath, SaveData data)
{
string json = JsonUtility.ToJson(data);
File.WriteAllText(filePath, json);
}
public SaveData Load(string filePath)
{
if (File.Exists(filePath))
{
string json = File.ReadAllText(filePath);
return JsonUtility.FromJson<SaveData>(json);
}
return new SaveData();
}
3. SQLite와 같은 데이터베이스 사용
- 장점: 대량의 데이터를 체계적으로 관리 가능. 쿼리를 통해 데이터 조작 가능.
- 단점: 외부 라이브러리 사용 필요. 설정과 관리가 복잡할 수 있음.
- 사용 예시: 복잡한 관계형 데이터, 대규모 게임 데이터 관리.
4. ScriptableObject를 이용한 세이브 시스템
- 장점: 유니티 에디터와의 통합이 용이. 복잡한 데이터 구조를 에셋 형태로 저장 가능.
- 단점: 런타임에서 직접 조작하는 것이 다소 불편할 수 있음.
- 사용 예시: 에셋으로 저장 가능한 데이터, 설정 파일.
필자는 유니티 실행파일에서 fbx파일을 로드하는 기능을 만든 후, 로드 된 모델들을 실행파일을 끄고 다시 켜도 그대로 있게 하는 간단한 세이브 기능을 만들 계획이라 *파일 시스템을 사용하는 것이 적합하다 판단하였다.
JSON을 이용하면 데이터 구조를 쉽게 직렬화/역직렬화 할 수 있어 해당 기능을 사용하기로 하였다.
JSON 파일을 사용한 예시
JSON(자바스크립트 객체 표기법)은 데이터 구조를 직렬화하기 위한 형식. 유니티에서는 JsonUtility 클래스를 사용하여 데이터를 JSON 형식으로 변환하고 파일에 저장하거나, JSON 형식의 데이터를 읽어와 객체로 변환할 수 있음.
예제 샘플
using System.Collections.Generic;
using System.IO;
using UnityEngine;
public class ModelManager : MonoBehaviour
{
[System.Serializable]
public class SaveData
{
public List<string> modelPaths = new List<string>();
}
private string saveFilePath;
void Start()
{
saveFilePath = Path.Combine(Application.persistentDataPath, "saveData.json");
LoadModels();
}
public void SaveModels(List<string> modelPaths)
{
SaveData data = new SaveData { modelPaths = modelPaths };
string json = JsonUtility.ToJson(data);
File.WriteAllText(saveFilePath, json);
}
public void LoadModels()
{
if (File.Exists(saveFilePath))
{
string json = File.ReadAllText(saveFilePath);
SaveData data = JsonUtility.FromJson<SaveData>(json);
foreach (string path in data.modelPaths)
{
// 모델 로드 로직을 여기에 추가
LoadModel(path);
}
}
}
private void LoadModel(string path)
{
// FBX 모델 로드 로직 구현
// 예: GameObject model = Instantiate(Resources.Load<GameObject>(path));
}
}
주요 개념 설명
- Application.persistentDataPath: 유니티에서 제공하는 경로로, 애플리케이션이 종료되더라도 데이터가 유지되는 디렉토리입니다. 플랫폼에 따라 경로가 다를 수 있습니다.
- File.WriteAllText: 지정한 파일 경로에 문자열 데이터를 저장합니다.
- File.ReadAllText: 지정한 파일 경로에서 문자열 데이터를 읽어옵니다.
- JsonUtility.ToJson: 객체를 JSON 문자열로 변환합니다.
- JsonUtility.FromJson: JSON 문자열을 객체로 변환합니다.
이 방식은 간단하고 유니티 프로젝트에서 데이터를 저장하고 로드하는 데 적합합니다. 파일 시스템을 이용하면 게임 데이터를 영구적으로 저장할 수 있어 유니티 실행 파일을 종료하고 다시 시작해도 데이터가 유지됩니다.
*파일시스템
파일 시스템 : 데이터를 컴퓨터의 스토리지 장치(예: 하드 드라이브, SSD, USB 드라이브 등)에 체계적으로 저장하고 관리하는 방법. 파일 시스템을 사용하면 데이터를 파일로 저장하고, 파일을 디렉토리(폴더)로 조직하여 쉽게 접근하고 관리할 수 있음.
파일 시스템의 주요 기능
- 파일 생성, 읽기, 쓰기: 파일 시스템은 파일을 생성하고 데이터를 읽고 쓸 수 있게 해줌.
- 디렉토리 구조: 파일 시스템은 디렉토리(폴더)를 사용하여 파일을 체계적으로 조직할 수 있음.
- 파일 속성 관리: 파일의 이름, 크기, 생성 날짜, 수정 날짜 등의 속성을 관리함.
- 파일 접근 권한: 파일에 대한 읽기, 쓰기, 실행 권한을 설정하고 관리함.
파일 시스템을 사용한 데이터 저장 예시
유니티에서 파일 시스템을 사용하여 데이터를 저장하고 읽는 일반적인 방법은 파일을 텍스트 형식(JSON, XML 등)으로 저장하거나, 바이너리 형식으로 저장하는 것이다.
'Unity C#' 카테고리의 다른 글
| Unity C# : Json Save기능 구현하기 (외부에서 불러들인 Fbx 모델링 저장) (0) | 2024.06.11 |
|---|---|
| Unity C# : TriLibCore 사용 시 로드 파일 경로 반환 - 상편 -(StandaloneFileBrowser / UnityEditor) (0) | 2024.06.10 |
| Unity C# : Lock (잠금) 메커니즘 / 동기화 메커니즘 (0) | 2024.05.30 |
| Unity Bounds로 오브젝트의 경계와 중심 구하기 (0) | 2024.05.28 |
| 정적라이브러리와 동적라이브러리의 장단점 (0) | 2024.05.22 |