티스토리 뷰
기본적인 Json에 대한 정보는 다 제끼고
C#에서 실제로 구현할 때 사용한 코드
로드
로드에 필요한 플러그인 : LitJson.dll 하나
로드할 json 파일은 딕셔너리 형태로 저장둬야 한다.
자세한 문법은 값 변형시켜주는 사이트들 많으니 거기서 변형시켜 그대로 json 파일을 만들어도 된다.
또 뭐냐... 유니티 내에서 한글이 깨지는 경우 json파일을 저장할 때 인코딩을 유니코드로 해주자. 그러면 안깨진다.
1. 경로를 포함한 json 파일
2. JsonData에 1번의 json 파일 저장
3. JsonData의 값을 DeSerialize
이렇게 단순화 가능하다.
1.
나 같은 경우 특수 접근 경로를 이용하기 위해 StreamingAssets 폴더를 만들어 거기에 json 파일을 저장하였다.
string path = Application.streamingAssetsPath + "그 이후의 경로 ~~~ / jsonFileName.json";
이렇게 path 지정을 해준다.
단!! 여기서 안드로이드의 경우
WWW androidPath = new WWW(path.text);를 해주고 이 값을 이용해야 한다!
streaming asset path가 안드로이드는 오직 Read-Only이며 여기로의 접근은 WWW page 형식을 통해 가능하다고 한다.
그렇다고 하니 그렇게 해주자...
(아니 이렇게 알아두고 왜 쓰기를 streamingAssetPath로 하려고 했냐고...)
+persistantDataPath로 변경하였다!
NewLoad까지 적용하였음
Load() 메소드 수도 코드
if(persitantDataPath에 UserInventory.json Exist? || wantNewGame?)
TextAsset userItemFile = Resources.Load("originitem") as TextAsset;
string content = userItemFile.Tostring();
WriteAllText(persistantDataPath 경로, content);
else
string content = ReadAllText(persistanant UserInventory.json);
NewLoad() 메소드 수도 코드
bool wantNewGame = true;
itemLoad();
wantNewGame = false;
근데 걍 Load()에서 매개변수 bool 하나 받게 해서 진행하는 게 나을 듯
별 차이야 없지만
* Resources.Load의 경로는 Assets/Resources이다!! 그리고 다른 Path와 다르게 확장자를 써선 안된다!!!!(중요매우중요)
* as TextAsset 말고 Resources.Load에서 2번째 인자로 typeof 써줘도 된다.
* persistantDataPath는 WWW를 쓸 필요 없다. 읽기/쓰기 모두 가능한 경로이다. (절대적 그 자체...god...)
2.
JsonData data = JsonMapper.ToObject(path.text);
data를 받아들인다. data에 오브젝트 리스트 형태로 저장되어있다고 이해하면 편하다.
JsonData를 클래스에서 선언해두면 초기화 문제로 재활용을 못하게 한다. 메소드 내에서 선언해주자...
3.
값을 분리해 받아야 하는데, 참고로 newtonsoft.Json.dll을 이용하면 한 줄로 이 과정을 끝낼 수 있다.
값을 받는 리스트는 값만을 저장하는 형태여야 한다!! MonoBehavior 상속 빼고 진짜 데이터만 저장하는 클래스여야 오류가 안난다. ㅡㅡ
자세한건 구글링 고고...
저걸 안쓰고 구현할거면
for(int i = 0; i<data.Count; i++)
{
Item loadItem = new Item();
loadItem.id = (int)data[i]["id"];
loadItem.name = data[i]["name"].ToString();
loadItem.description = data[i]["description"].ToString();
loadItem.activated = (int)data[i]["activated"];
inventoryItems.Add(loadItem);
text += (inventoryItems[i].activated == 1 ? "true" : "false") + " ";
}
귀찮은데 이러면 이해가 되겠지
저장
저장은 로드의 과정을 반대로 하면 된다.
stramingAssetsPath는 안드로이드에서 !!!읽기!!!만 가능하다!!! 쓰기 !!!불가능!!!
쓰기를 하려면 결국 persistantDataPath를 써야 한다!!!!!!!!!!!!!!!!(삽질의 주 원인)
1. List의 값을 Serialize
2. string으로 딕셔너리 만들고 File 저장
하지만 직접 딕셔너리 형태를 짜고 앉아있자니 가능은 하겠다만 내 머리를 믿기도 힘들다(ㅠㅠ) 백퍼 구멍이 나겠다 싶은..
그러니까 똑돆한 사람이 만든 걸 사용하자
아까 말한 newtonsoft.Json.dll 을 사용한다.
1.
string dataJason = JsonConvert.SerializeObject(inventoryItems);
2.
이제 저 값을 File로 저장해야 한다.
File.WriteAllText(Application.platform == RuntimePlatform.Android ? itemPath.text : Application.streamingAssetsPath + "/Inventory/UserInventory.json", dataJason);
그냥 여기서 WriteAllText로 받는 값을 persistant 경로로 지정해주면 된다. 플랫폼 확인할 필요도 없음.
저게 저렇게 되어있는 이유는 안드로이드와 PC 테스트 모두 사용하기 위해서이다...
응 힘들어... 저렇게 쓰면 된다....
정말 열심히 삽질했다. 그래도 끝을 봐서 다행이야...
+추가)
뒤늦게 본 사이트인데 구현에 큰 도움이 될 듯. 물론 streamingAssets로 하셨긴 한데 다른 글들이 괜ㅊ낳음 설명도 조코
https://www.raywenderlich.com/479-using-streaming-assets-in-unity
'■ 기타 공부들 > ◻ Unity' 카테고리의 다른 글
webgl2 1장. 기초 (0) | 2021.11.24 |
---|---|
씬 간의 이동과 플레이어 로드 (0) | 2018.09.13 |
스크립트의 유기적 관계 (0) | 2018.08.02 |
[Unity2D]2D 애니메이션 적용 과정과 스크립트 (0) | 2018.07.27 |
[Unity2D]정해진 거리만큼을 매끄럽게 이동하기 (0) | 2018.07.27 |