나 개발자 진짜 되냐?

싸우자 JSON 1.5일차 같은 2일차 본문

유니티를 공부해봐요!/고급이에요!

싸우자 JSON 1.5일차 같은 2일차

Snow Rabbit 2024. 12. 5. 22:30

 

뭐라구요? 왜 1일차가 없냐구요?

 

시작한 1일차에는 강의만 들었기 때문이지요.

베이직 특강..

스탠다드 특강 등등..

 

하지만 나

완벽히 이해하지못하다가.

 

API로 서버통신 하는 과정이 담긴 특강 발견..

 

바로 만지작 하기위해 코드를 짠다.

 

코드를 쓰며 느낀건데

 

나도 키보드 새로 사고싶다.

아니다 지금꺼도 좋은데

음..

키보드.....

 

호호

 

 


 

일단 먼저 준비물

 

PlayerData.cs

DataManager.cs

 

리펙토링 전 코드를 같이 작성해보자.

 

우리는 맨 처음에

JSON으로 가져올 예정이다!

 

 

그냥 Player를 만들려했는데....

이미 주인이 있는 이름

 

그래서 진짜 거짓말안하고 5분 고민해서 적었다.

 

음음 그래도 직관적인 클래스이름?

칭찬해

 

만들어주고

 

데이터를 담을 클래스도 이렇게 적어는 주었다.

 

잊지 말아야할 건

꼭 System.Serializable을 써줘야

김밥풀기 = 직렬화가 가능하다.

 

이쯤하고

 

DataManager로 가자

 

 

 

바로 싱글톤

 

 

정보 가져오기

 

 

이게 이제 데이터 가져오는 과정인데

 

두개는 인벤토리

두개는 플레이어라 사실 둘중에 하나만 봐도 무방하다

 

그래서 위에꺼로 설명해보겠다!

 

먼저 함수 두개를 만들어준다.

 

정보저장 Save

정보 가져오는 Load

 

save에서는 

file을 싹 적어서 둘거고

어디둘거냐?

 

Application.persistentDataPath 에 둘 것이다.

 

이 persistentDataPath는

피시면 피시에 맞게

모바일이면 모바일에 맞게 어딘가에다가

json 파일 경로를 찾아서 잘 보관해주는 친구이다.

 

이 경로 에다가

한칸더 밑으로 들어가서

json파일을 만들어준다.

 

불러올때는

fileRead 해줘서 아까경로에서 그대로 가져와

변수에 넣어주고

그 변수를 jsonUtility에 역직렬화 해준 정보를 return 해주게 된다.

 

그럼 그 정보가 어디로 가냐?!

 

이 리턴값은

PlayerData.cs에

 

 

두번째줄에 가서 data에 들어가게 된다.

 

참 쉽죠?

 

아뇨?

제 설명이 조금 부족해서

제대로 이해 못하셨을겁니다.

괜찮습니다.

 

왜냐면 리펙토링 할 거기 때문이지요.

 

지금까지 과정에서 기억해야하는건

 

JsonUtility.ToJson(data)

 

JsonUtility.To로 이친구를 Json 즉 동족으로 만들어버리겠다.

 

JsonUtility.FromJson<JSONPlayerData>(loadJson)

 

JsonUtility.From 으로  아까 만든 동족을 풀어주겠다. 

그 친구는 어디소속이더라? 하며

제너릭에 써주고

괄호안에 동족으로 만들어두었던 변수를 넣어준다.

 

흠흠 이거만 기억하면 된다.


오잉? 왜 리펙토링 해야하나요?

 

만약에 여기서 인벤토리말고

친구

뭐 의류 등등등을

다 가져올라면

코드가 계속 계속 늘어날 것이다.

 

그러면 오우 나중에 막 몇백줄 나오는거 아녀?!

 

그래서 우리는 코드는 한개로

정보는 이것저것을 넣어주기 위해

 

리펙토링을 진행할 것이다.


야, 진행시켜

 

 

 

다른점이 뭘까?

 

 

이름이 달라요!!

 

눼 맞아요 이름이 다릅니다

하나는 플레이어고 하나는 인벤토리죠

 

이 당연한걸 왜 말하냐구요?

 

경로 또한 그런 방식이기 때문이지요.

 

하나로 합칠 수 있겠네..!!

 

 

하나의 함수로 다 처리할 수있는 방법!

 

수많은 방법중에

가장 간단한 방법이라고 소문이 자자한

줴너릭

 

< >

생긴것도 쉽게생겼고

방법도 간단하다고 하지만

굉장히 어려운 녀석..

싫지만 기능은 참 좋다.

 

아까 기능을 다시보자

 

경로와 클래스 이름이 같다..!

 

그렇다면

클래스 이름을 활용한

줴너릭 <T>를 사용해보자

 

 

이름도 뭐 사실 함수는 이제 하나니까

SaveData해도되고

 

<T> 로 받으며

경로를 저렇게 써주면

클래스 이름에 맞게

그 클래스이름 자체로!

스트링으로 변환되어진다!!

 

그리고

 

이제 함수 이름도 바꼈고

T에도 넣어주면 좋다!

 

음? 이 빨간줄은 뭐지?!

 

불편하니 지워보자

다시 돌아가서..!

 

 

 

저 녀석을 string으로 선언해주고

 

 

다시 돌아가서!

SaveData(data)만 해주면 끝난다!

 

이렇게 해주면

매개변수를 다른거 넣어도

그에 맞춰서 알아서

들어가 진다.

 

LoadData에도 해보자!

 

 

아까는 클래스 이름들이 있었지만 이제

통칭 T로 해준다.

 

이렇게 해주면 끝!

 

아까보다 훨 간결해졌다!