그럼 이번에는 유니티 Json을 이용해 데이터를 저장하고 불러오는 방식을 알아보겠습니다. 지난 포스팅에서 유니티의 Scriptable Object를 활용하여 데이터를 저장하는 방법에 대해 알아보았습니다. 물론 Scriptable Object또한 사용하기 편리하지만 게임 제작시 데이터를 저장하는데에만 사용 가능하고 플레이어의 데이터 저장과 같은 곳에는 사용하기 힘든 면이 있었죠.
때문에 보통 게임에서 데이터를 저장할 때는 Json 방식을 사용합니다. 변환이 쉽고 간편해서 많은 사람들에게 사랑 받는 데이터 저장 방식이죠. 이외에도 네트워크 통신에 활용하기도 합니다.
Json 파일 형식이란?
{
"PlayerName" : "Player",
"Inventory" :
[
{"Id":1,"Value":10,"Boolean":false},
{"Id":2,"Value":20,"Boolean":true},
{"Id":3,"Value":30,"Boolean":false}
]
}
위와 같은 구조로 작성되는 것이 바로 Json 파일입니다. 어떠한 데이터의 “Key”에 대응되는 “Value”의 집합으로 작성되게 되죠. 때문에 사람이 읽기 편하고 수정하기 또한 편리합니다. 또 배열도 저장 가능하기 때문에 플레이어의 인벤토리 정보나 각종 데이터를 저장하기 굉장히 용이하죠.
유니티에서 Json파일을 사용하는 방법은 다양하지만 저는 그 중 Newtonsoft.json 이라는 라이브러리를 활용하는 방법에 대해 알아보려고 합니다. 사용법도 간단하고 편하게 사용할 수 있어서 다른 C# 프로그램을 제작할 때도 자주 사용하고 있는 라이브러리죠. 그럼 어떤 방식으로 사용할 수 있는지 알아보도록 합시다.
[작성 기준 2021.3.0f1 버전을 사용하였습니다.]
유니티 Json 파일 저장하거나 불러오는 방법
유니티 패키지 매니저를 이용해 Newtonsoft.Json 설치하기
먼저 유니티 패키지 매니저로 Json 라이브러리를 설치하도록 합시다. 유니티 상단의 “Window => Package Manager” 에 들어가면 현재 프로젝트에 설치되어 있는 도구들을 관리할 수 있습니다. 또 새로 설치하는 것 또한 가능하죠.
패키지 매니저를 실행하면 위처럼 창이 하나 나타나게 됩니다. 좌측 상단의 “+” 버튼을 누르고 “Add package by name”을 눌러 신규 패키지를 설치하도록 합시다. 저희들은 Newtonsoft.Json 라이브러리를 설치할 것이기 때문에 아래 코드 블럭에 적힌 이름으로 추가해 보겠습니다.
com.unity.nuget.newtonsoft-json
라이브러리를 추가히면 위처럼 설치된 패키지 목록에 Newtonsoft json 항목이 추가됩니다.
유니티 Json 직렬화하는 방법
먼저 새로운 클래스를 만들고 아래와 같은 코드를 작성해 주었습니다.
using Newtonsoft.Json;
using UnityEngine;
public class JsonTest : MonoBehaviour
{
public int[] TestVariable;
private void Start()
{
var result = JsonConvert.SerializeObject(TestVariable);//Convert to json
Debug.Log(result);
}
}
Newtonsoft.Json 라이브러리에서 Json파일로 데이터를 변환하기 위해서는 “JsonConvert” 클래스의 “SerializeObject()” 함수를 사용하게 됩니다. 해당 함수는 입력된 데이터를 문자열로 변환하여 반환하게 되죠. 단순한 자료형 뿐만 아니라 입력된 클래스의 직렬화 가능한 부분(public 변수)을 모두 변환하게 됩니다.
이후 코드를 빈 오브젝트에 할당하고 숫자를 입력한 뒤 게임을 실행해보면 아래와 같은 내용이 콘솔에 출력됩니다.
콘솔에 “[1,3,2,4,5]” 출력 되었습니다. 정수 배열이 제대로 변환된 모습입니다. 이번에는 클래스를 하나 생성해보도록 하겠습니다.
using System;
[Serializable]
public class TestClass002
{
public int Id;
public int Value;
public bool Boolean;
}
간단히 데이터를 저장하는 클래스입니다. 인스펙터에서 수정이 가능하도록 [Serializable] 문구를 추가해주었습니다. 이제 코드를 조금 수정하여 TestVariable이 TestClass002 배열을 저장하도록 해봅시다.
using Newtonsoft.Json;
using UnityEngine;
public class JsonTest : MonoBehaviour
{
public TestClass002[] TestVariable;
private void Start()
{
var result = JsonConvert.SerializeObject(TestVariable);//Convert to json
Debug.Log(result);
}
}
이후 마찬가지로 데이터를 추가해준 뒤 출력하면 아래와 같은 내용이 콘솔에 출력됩니다.
[
{"Id":1,"Value":10,"Boolean":false},
{"Id":2,"Value":20,"Boolean":true},
{"Id":3,"Value":30,"Boolean":false}
]
이렇게 변환된 데이터를 파일 입출력을 통해 외부 파일에 저장해주면 향후 게임을 시작했을 때 불러오도록 하여 저장소처럼 활용할 수 있겠죠.
유니티 Json 역직렬화하는 방법
그럼 이번에는 저장된 데이터를 다시 변환하여 불러오는 방법에 대해 알아보도록 합시다. 지금까지 사용했던 JsonTest 클래스를 조금 수정해보겠습니다.
using Newtonsoft.Json;
using UnityEngine;
public class JsonTest : MonoBehaviour
{
public TextAsset JsonFile;//Variable that contains json data
private void Start()
{
var result = JsonConvert.DeserializeObject<TestClass002[]>(JsonFile.text);//convert to usable data
foreach (var i in result)
{
Debug.Log($"Id : {i.Id}, Value : {i.Value}, Bool : {i.Boolean}");//Print data;
}
}
}
이 코드는 TextAsset에 저장되어 있는 데이터를 불러와서 역직렬화시켜 다시 사용할 수 있는 데이터로 변환해주는 코드입니다. 변환된 데이터를 하나하나 불러와 출력하도록 만들었죠.
코드를 수정한 뒤 Json파일을 생성하여 위의 TestClass002를 변환한 내용을 붙여 넣어 주었습니다. 이후 생성한 Json파일을 인스펙터에서 넣어준 뒤 게임을 실행하면 아래와 같은 내용이 콘솔에 출력됩니다.
이처럼 아주 손쉽고 간단하게 변환하여 사용할 수 있습니다.
오늘은 유니티 Json 사용 방법에 대해 알아보았습니다. 함수를 이용하면 간단히 사용할 수 있어 아주 좋은 방식이죠. 다음 포스팅에서는 본격적으로 데이터를 파일로 출력하여 방법에 대해 알아보도록 합시다. 그럼 이번 포스팅은 여기에서 마치도록 하죠.
Newtonsoft.json에 대한 더 많은 정보는 아래 문서에서 찾아보면 좋을 것 같습니다.