본문 바로가기

Network

네트워크 Json 첫날(인적사항, 오브젝트 불러오기)

목차


Json 사용하기!

오늘 한 내용

 

[기초]

1. json 으로 인적사항 데이터(한 사람)를 저장하고 다시 불러오기 해본 후 (직접 작성하기) (하나)

2. 한 사람이 아닌 여러면의 데이터를 저장 하고 다시 불어오기를 해본다. (List)

 

[심화]

3. 오브젝트를 랜덤생성(타입, 크기, 회전방향,  위치) 한 후, 저장 버튼을 눌렀을 때의 오브젝트를  json 으로 저장한 후, 다시 불러오기 해보기 (하나)

4. 저장버튼을 눌렀을 때, 나온 모든 오브젝트를 json 에 저장한 후 , 다시 다 불러오기 해보기 (List)

 


Json 을 사용하는 이유

 

유니티 생성!

위와같이 생성!

씬을 JsonScene 이라고 명명하고

 

빈게임오브젝트로 DataManager 로 만든다!

그리고  똑같은 이름의 스크립트를 만들어서 또 넣어준다!

 

DataManager.cs

이렇게 인적사항을 적어보자

 

변수 선언 해주고,

Start 에서 값을 넣어주고

1 번을 누르면 각각 출력 해주는거임!

 

 

우리가 이걸 파일로 저장한다면 어떻게 저장해?

PlayerPrefs 로!

근데 이런식으로 저장하면, 엄청 많아짐..

다른사람도 다 들어오면 키 값도 다 다르게 해줘야 하는데,,?

 

그래서 문자열로 만들어줘야함

그게 이제 Json 인거임

 

그러니까 이걸 이제 Json 으로 바꿔주는걸 해보자!


지금 까지 쓴 코드는 이런 상황

 

(참고) 지역변수와 전역변수의 Default 값 부여 차이

더보기
이건 쓰레기 값이라고 함

전역변수는 자동으로 초기값이 있는데 지역변수는 값이 들어가 줘야함!

0으로 자동으로 안됨!

 

3번 키를 누르면 불러오게 키 설정한 모습

복붙한건데, 이제 여기다가 Json 형식으로 넣을거임

 

 

Json 의 형식

이렇게 값이 들어갈 수 있는데 , 현재 배열 or 리스트는 아직 안해봄!

좌측에는 Key , 우측에는 그 Key 에 맞는 값이 들어간다.

 

Json 에 쓸 때는 이렇게 쓴다

다른사람들 것도 넣으려면 ( , ) 를 쓴다

 

(참고)Key 가 Numders 이고 그 안에 값이 많은 경우, 배열로 집어 넣는다

더보기
배열 추가는 이렇게! string 배열은 이렇게!
int 배열

 

class 를 하나 더 만들어 주고, 전역변수를 넣었던걸 여기로 넣자

class 를 하나 더 만들어 줌으로써, 데이터를 사용할 형식. 즉, 틀을 형성할 수 있음

전역변수를 다 뺐으니, 이걸 사용한 밑에는 다 오류 뜰 텐데?

 

위에 사용한 클래스를 new 생성자를 통해 info라는 이름으로 넣어준다!

 

이걸 써줘야 Json 으로 바꿀 수 있음!

중요! Json 형식을 사용할 틀 클래스는 Serializable 을 넣어줘야한다!

네임스페이스에 System 이 있으면, 여기서 System. 을 쓸필요는 없음

 

이렇게 만들면, 

JsonUtility 에 ToJson 이라는 메소드를 이용해서, Json 형식으로 값이 들어가지게 된다.

info 값을 저 값으로 던져준다는 얘기임!

이렇게 되면 한방에 PlayerPrefabs 에 넣을 수 있음!

근데 이렇게 한줄로 나오면 안이쁘니까

true 를 넣어주면 prettyPrint 로 이쁘게 나옴 ㅋㅋ

근데 통신 할때는 이거 안하는게 좋음! 최대한 용량적게 하기 위해서!

여튼, 이 jsonData 를 MyInfo 라는 키값으로 저장을 하면 저 위에 있는 데이터를 다 저장 할 수 있게 되는거임

불러온다면 이렇게!

저기 GetString("MyInfo")로 해야함(대문자M) 오타임

 

Json 을 UserInfo 형태로 바꿔주는거임 지금 모든정보가 한줄에 등록되어있는거니까,

하나하나 잘라서 써야하는 우리는 이걸 바꿔주는것 까지 해보는거임!

보통 네트워크에서 Json 형태로 받으면 우리가 이런식으로 바꿔서 써야하는 거임

 

그니까, info = JsonUtility.FromJson<UserInfo>(jsonData); 

는  1줄짜리 String 에 있는 키 값들이 지금 UserInfo 클래스에 있는 키값을 찾아서 

UserInfo 클래스에 있는 변수에 착착 들어가는거임

 


다수의 데이터다뤄보기

 

지금 까지는 한명이지만 다수의 데이터를 다루어본다면??

이제 10명의 데이터를 생성해보자

10명의 데이터 생성

friendList 라는 배열에 모든 데이터를 추가한다.

 

이 10명의 프렌드 배열을 제이슨으로 만들 거임!

이렇게 대괄호 안에, 저 형태가 10개가 들어 가 있는 상태인거임

이 배열 데이터를 아까처럼  jsonData 로 넣어준다.

한줄짜리 데이터로 만들기 느낌!

잘 들어갔는지 확인해보려고 print 를 해보니까

 

이렇게 괄호만 나옴?!

왜?? 정확한  Key Value 값이 있어야 해서 그렇다

이렇게 "data" 라는 벨류

이 배열들을 다 감싸는 키값이 있어야 함

이걸 우리는 data 라는 이름으로 만들어보자

이렇게 되려면 클래스가 하나 더 있어야 함!

클래스로 배열을 담을 변수 만들기.

UserInfo 를 담는 List 를 만들면 됨,

이름은 data (Key값)

다시 돌아와서, arrayData 를 생성하고,

여기 data 에 friendList 를 넣는다.

그 후, Json 으로 변형시켜보자!

Json Print 해서 test

Json 형식으로 변형 완료,

 

5번 누르면 Json 안에 들어있는 값들을 가져오게 함.

print(friendList 의 이름) 로 했으니,

그 배열들의 하나하나 이름들이 뜰거임


Json 으로 오브젝트 저장 및 생성하기

1. 일단 하나만 생성하고, 저장해서 나오게 하는거랑

2. 다량으로 생성해서 저장 -> 한꺼번에 다 나오게 해볼거임

 

 

버튼 생성하고, 이걸로 오브젝트 생성을 해보자

UIMananger 스크립트 생성

 

이런 메소드가 있음.

GameObject 에 CreatePrimitive.

타입의 숫자가 도형을 나타냄

 

버튼을 누르면, 랜덤한 위치에 랜덤한 방향, 랜덤한 크기의 랜덤한 도형이 나오게 함

오브젝트 생성 버튼에 이렇게 함수 추가.
랜덤으로 만들 수 있음

저장 버튼도 복붙 해서 만들자

 

 

저장버튼 만들기

저장을 담당하는 함수

위에서 했던것 처럼 이것들을 모을 수 있는 클래스를 만들어야함!!

 

 

(참고) 구조체 sturcture

더보기

구조체를 써도 됨

 

클래스와 구조체는 거의 비슷함

 

클래스는 ref 타입

구조체를 Value 타입임

 

타입, 위치 크기 각도를 담는 클래스 틀을 만든다.

Json 으로 저장!

오브젝트 생성 (스피어 하나 나옴)-> 저장버튼 -> 저 값들이 저장됨 


이제 생성을 많이 해보고, 마지막꺼만 저장하는게 아니라

그 모든 정보들을 한꺼번에 다 저장한 후, 나오게 해볼거임

다량의 정보들을 한꺼번에 저장!


이제 OnClickSave() 에 파일 형태로 저장시켜보자

OnClickSave() 에 파일 등록하기 위해 작성

 File 이라는걸 써야 하는데, 그럴려면 using System.IO 가 필요하다. 

그렇기 때문에 Alt+Enter 누르면 NameSpace 선택해서 바로 등록가능!


이제 파일에 저장할건데 저장하려면 경로가 있어야함

경로를 먼저 설정해보자

 

 

Asset폴더 바로 밑에다가 저장 할거임

그럴려면 저장 할 path 가 있어야함

어플 경로를 가져오는것임

(참고) 모바일의 경우는 같은 path 지만 쓰는 형식이 다르다.

더보기

pc로 할 때 Asset 폴더 바로 하위 path 는 저렇게 쓰면 되는데,

모바일 할 때는 Application.persistentDataPath 를 사용해야함

 

저장경로, 파일로 저장함

이제 path 에 어떤 이름으로 저장하겠다는건지도 저장해야함


생성 하고 저장 하면 

이렇게 뜨고 다른데 갔다오면

첫 번째 보면, Json 형식이 저장된다.

두 번째는 asset 바로 하위 까지 path 이고

세 번째는 어딘가 모를 모바일이 써야할 path 이다.

이렇게 나옴!

근데 만약에 바로 data 파일 생성하는거 말고, Data 라는 폴더를 만들어서, data 를 넣고싶다면 어떻게 할까?

Directory.Exits -> 이 경로가 존재 하는지 확인 하는거임!

존재하지 않으면, 생성하겠다는것

 

Load 함수를 따로 생성

이제 Load 함수를 생성해서, 데이터를 출력해보자

 

오케이 만들었던거 나옴

이제 이걸 토대로, 우리는 오브젝트를 만드는것 까지 할 거임!

이제 CreateObj 함수에 있던거를 좀 빼서 따로 함수로 만들자.

 

Load 에 넣어서 쓰게.

ObjectInfo 를 받아서 생성하게 하는 함수 틀 제작

OnCreateObject 에 있던걸 가져와서, info 에 들어있는 값으로 치환 함


그 결과

생성하는 함수
클릭하면 생성하게 해주는 함수

이것도 정보를 위와같이 바꿔줌

불러와주는 함수

File 에 json 형식으로  되어있는 데이터를 불러왔고,

그 데이터를 다시 Class 안에 있는 틀로 바꿔준거임

그 틀에 맞는 값으로 Create 를 한거고

 

지금까지, 랜덤으로 생성해주고, 저장해주면

불러오기를 눌렀을 때 똑같이 불러오게 해주는거임!

딱 하나만


이제는 다량으로 해볼거임

 

 

근데 이제, 생성 했을 때마다 정보를 저장하게 하고싶으면?

List 로 해보자

밖에서 보게 Serializable 해줌
리스트 생성

생성할 때마다, List 에 저장하게 만들자!

objInfoList.Add(objInfo);

Json 에 리스트 저장

OnClickSave 에 저렇게 바꿈

 

Json 을 쓰려면 그 틀을 Class 로 만들어줘야 겠지?

Class 로 List 의 틀을 만들어줌

리스트를 틀로 만들기!

이렇게 저장해줄 때 arrayData 에 objInfoList 를 넣는다.

 

 

이제 Load 하는것도,

for 문을 통해서, 한번에 다 생성하게 해줘야 함.

 

그리고 여기에 objInfoList.Add 해주면 불러왔던 데이터를 추가해주는것임!

다시 실행하면, 다 사라지니까.