티스토리 뷰

기본적인 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") + "   ";

        }

귀찮은데 이러면 이해가 되겠지

참고로 bool형의 경우, C#은 bool의 형변환이 금지되어있다! 그냥 숫자 1, 0 저장해두고 쓰는게 편하다...
굳이 true, false로 저장을 해야겠다면 값 == 1 ? true : false; 로 해주면 된다.


저장

저장은 로드의 과정을 반대로 하면 된다.


stramingAssetsPath는 안드로이드에서 !!!읽기!!!만 가능하다!!! 쓰기 !!!불가능!!!

쓰기를 하려면 결국 persistantDataPath를 써야 한다!!!!!!!!!!!!!!!!(삽질의 주 원인)



1. List의 값을 Serialize

2. string으로 딕셔너리 만들고 File 저장


하지만 직접 딕셔너리 형태를 짜고 앉아있자니 가능은 하겠다만 내 머리를 믿기도 힘들다(ㅠㅠ) 백퍼 구멍이 나겠다 싶은..

그러니까 똑돆한 사람이 만든 걸 사용하자

아까 말한 newtonsoft.Json.dll 을 사용한다.


1.

        string dataJason = JsonConvert.SerializeObject(inventoryItems);

진짜 이게 끝이다(ㅎㅎ;) 직접 Serialize할 생각 말고 쓰자...


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

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
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 29 30 31
글 보관함