유니티 기초 강좌: 저장하기와 불러오기 기능, JSON 사용하기

1. 서론

게임 개발에서 플레이어의 진행 상황, 설정, 또는 기타 중요한 데이터를 저장하고 다시 불러오는 기능은 매우 중요합니다.
유니티(Unity)는 이러한 기능을 손쉽게 구현할 수 있도록 돕는 다양한 방법을 제공합니다.
본 강좌에서는 JSON(JavaScript Object Notation) 형식을 사용하여 유니티에서 데이터를 저장하고 불러오는 방법에 대해 자세히 살펴보겠습니다.

2. JSON이란?

JSON은 자바스크립트 객체 표기법으로, 데이터를 교환하기 위한 경량의 형식입니다.
데이터가 키-값 쌍의 형태로 구성되어 있어 사람에게 읽기 쉽고 기계도 쉽게 파싱할 수 있습니다.
유니티에서 JSON을 사용할 경우, 데이터 구조를 손쉽게 직렬화(serialization)하여 파일로 저장하고, 불러올 때 역직렬화(deserialization)하여 객체로 다시 변환할 수 있습니다.

3. JSON 객체 예제

JSON 형식의 기본 구조는 다음과 같습니다:

{
    "name": "Player1",
    "score": 100,
    "level": 2,
    "items": ["sword", "shield", "potion"]
}

위의 예시는 게임 캐릭터와 관련된 정보를 포함하는 JSON 객체입니다.
이러한 구조는 유니티 내에서 직렬화와 역직렬화를 통해 쉽게 처리할 수 있습니다.

4. 유니티에서 JSON 사용하기

유니티에서 JSON 기능을 사용하기 위해서는 JsonUtility 클래스를 활용할 수 있습니다.
이 클래스는 간단하게 JSON 데이터를 객체로 변환하고, 객체를 JSON 형식으로 변환할 수 있는 메서드를 제공합니다.
아래는 JSON 객체를 생성하고, 이를 직렬화하여 파일에 저장하는 방법입니다.

4.1 데이터 구조 정의하기

저장할 데이터에 대한 클래스 구조를 정의합니다.
예를 들어, 플레이어의 정보를 담을 클래스를 생성해보겠습니다.


[System.Serializable]
public class PlayerData {
    public string name;
    public int score;
    public int level;
    public List<string> items;
}

위의 클래스는 플레이어의 이름, 점수, 레벨, 아이템 목록을 포함합니다.
JSON으로 직렬화할 수 있도록 [System.Serializable] 특성을 추가했습니다.

4.2 JSON 직렬화 및 파일 저장하기

JSON으로 데이터를 직렬화하고 파일로 저장할 코드를 작성해보겠습니다.
System.IO 네임스페이스를 사용하면 파일 입출력이 쉽습니다.


using UnityEngine;
using System.Collections.Generic;
using System.IO;

public class GameManager : MonoBehaviour {
    private string savePath;

    void Start() {
        savePath = Path.Combine(Application.persistentDataPath, "playerData.json");
    }

    public void SavePlayerData(PlayerData playerData) {
        string jsonData = JsonUtility.ToJson(playerData);
        File.WriteAllText(savePath, jsonData);
    }
}

위 코드에서 SavePlayerData 메서드는 플레이어 데이터를 JSON 형식으로 변환한 후, 지정한 경로에 파일로 저장합니다.
Application.persistentDataPath를 사용하여 각 플랫폼에 맞는 파일 경로를 얻을 수 있습니다.

4.3 JSON 파일 불러오기

저장한 JSON 파일을 불러오는 방법도 간단합니다.
아래의 코드는 파일에서 JSON 데이터를 읽고, 이를 PlayerData 객체로 역직렬화하는 과정을 보여줍니다.


public PlayerData LoadPlayerData() {
    if (File.Exists(savePath)) {
        string jsonData = File.ReadAllText(savePath);
        PlayerData playerData = JsonUtility.FromJson<PlayerData>(jsonData);
        return playerData;
    }
    return null;
}

LoadPlayerData 메서드는 저장된 파일이 존재하는지 확인한 후, 파일을 읽어서 JSON 데이터를 PlayerData 객체로 변환합니다.

5. 예제 코드

아래 예제는 전체적인 저장과 불러오기 프로세스를 보여줍니다.
유니티에서 버튼 클릭을 통해 데이터 저장 및 불러오기를 구현하는 방식입니다.


using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;
using System.IO;

public class GameManager : MonoBehaviour {
    public InputField nameInput;
    public Slider scoreSlider;
    public Button saveButton;
    public Button loadButton;

    private string savePath;

    void Start() {
        savePath = Path.Combine(Application.persistentDataPath, "playerData.json");
        
        saveButton.onClick.AddListener(OnSaveButtonClick);
        loadButton.onClick.AddListener(OnLoadButtonClick);
    }

    public void OnSaveButtonClick() {
        PlayerData playerData = new PlayerData {
            name = nameInput.text,
            score = (int)scoreSlider.value,
            level = 1,
            items = new List<string> { "sword", "shield" }
        };
        SavePlayerData(playerData);
    }

    public void OnLoadButtonClick() {
        PlayerData loadedData = LoadPlayerData();
        if (loadedData != null) {
            nameInput.text = loadedData.name;
            scoreSlider.value = loadedData.score;
        }
    }

    public void SavePlayerData(PlayerData playerData) {
        string jsonData = JsonUtility.ToJson(playerData);
        File.WriteAllText(savePath, jsonData);
    }

    public PlayerData LoadPlayerData() {
        if (File.Exists(savePath)) {
            string jsonData = File.ReadAllText(savePath);
            PlayerData playerData = JsonUtility.FromJson<PlayerData>(jsonData);
            return playerData;
        }
        return null;
    }
}

위 코드는 사용자가 입력한 데이터(이름과 점수)를 저장하고, 저장된 데이터를 불러와서 UI에 표시하는 기능을 구현합니다.
버튼 클릭 이벤트를 통해 각각의 메서드가 호출됩니다.

6. 저장하기와 불러오기 기능의 중요성

저장하기와 불러오기 기능은 사용자 경험을 향상시키기 위해 필수적입니다.
이 기능이 없다면 플레이어는 게임을 종료할 때마다 모든 진행 상황을 잃어버리게 되며, 이는 게임의 재미를 감소시킬 수 있습니다.
따라서 적절한 데이터 저장 구조를 설계하고, 효과적으로 파일 I/O를 처리하는 것은 게임 개발자에게 매우 중요한 작업입니다.

7. 마무리

본 강좌에서는 유니티에서 JSON을 사용하여 데이터를 저장하고 불러오는 방법에 대해 알아보았습니다.
JSON은 간단하면서도 강력한 데이터 형식으로, 다양한 애플리케이션에서 활용될 수 있습니다.
이러한 기초 지식을 바탕으로 더 복잡한 데이터 저장 로직이나 저장소를 구축해 나갈 수 있을 것입니다.

앞으로도 더욱 발전된 유니티 강좌와 관련된 많은 정보들이 여러분에게 도움이 되기를 바랍니다.
감사합니다!

작성자: 조광형

작성일: 2024년 11월 26일