본문 바로가기
Unity Boot Camp

Udemy STARTERS (유데미 스타터스) Unity 취업 부트캠프 18주차 - JSON 처리, Photon 이용한 동기화

by 개발하는 디토 2022. 10. 23.

이번주는 간단하게 JSON 데이터 파싱에 대해 배우고, 모두가 기다렸던 Photon 사용법을 정리해봤다.

 

JSON

JSON은 서버와 클라이언트 사이에 통신을 할 때 주로 사용되는 데이터 전달 방식인데, 이러한 데이터 전달 방식이 필요한 이유는 서버와 클라이언트, 혹은 클라이언트와 클라이언트 사이에 사용하는 컴퓨터 언어 등이 다를 수 있기 때문이다.

Class → Json File Save

  1. JsonUtility.ToJson() 을 활용해 클래스를 string으로 변환
  2. Encoding.UTF8.GetBytes() 활용해 string을 byte[] 로 변환
  3. FileStream.Write() 활용해 byte[]를 json 파일로 저장

Json File → Class Load

  1. FileStream.Read() 활용해 json 파일에서 byte[] 읽어옴
  2. Encoding.UTF8.GetString() 활용해 byte[]를 string으로 변환
  3. JsonUtility.FromJson<클래스>() 활용해 string을 클래스로 변환

 

간단히 정리하면 이렇고 예제는 아래와 같다.

JSON 데이터로 저장할 특정 클래스를 만들고 그것을 다른 클래스에서 접근해 JSON (문자열) 데이터로 만들어 저장하고 다시 읽어오는 예제이다.

 

JsonDataClass.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class JsonDataClass
{
    public class TestClass
    {
        public int i;
        public float f;
        public Vector3 vec3;

        public TestClass()
        {
            i = 10;
            f = 0.8f;
            vec3 = new Vector3(1f, 2f, 3f);
        }

        public void Print()
        {
            Debug.Log("i = " + i);
            Debug.Log("f = " + f);
            Debug.Log($"Vector = {vec3.x}, {vec3.y}, {vec3.z}");

        }
    }
}

 

JsonUtilityTest.cs

using UnityEngine;
using static JsonDataClass; // JsonDataClass에 있는 Method를 직접 가져다 사용할 수 있음.

public class JsonUtilityTest : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        TestClass JsonTest = new TestClass();
        JsonTest.f = 99.9f; // change value

        // Unity 내장 JsonUtility 사용해 JsonTest를 string으로 직렬화.
        string jsonData = JsonUtility.ToJson(JsonTest);
        // string을 다시 JsonTest로 복구
        TestClass JsonTest2 = JsonUtility.FromJson<TestClass>(jsonData);
        JsonTest2.Print();
    }

 

JsonSaveLoader.cs

Json 파일을 저장하고 로드한다.

using UnityEngine;
using System.IO;
using System.Text;
using static JsonDataClass;

public class JsonSaveLoader : MonoBehaviour
{
    public int i = 10;
    public float f = 50f;
    public Vector3 v3 = new Vector3(6f, 7f, 8f);

    public void SaveJson()
    {
        // Asset folder에 test.json 파일 open 또는 create
        FileStream stream = new FileStream(Application.dataPath + "/test.json", FileMode.OpenOrCreate);
        TestClass jsonTest1 = new TestClass();
        jsonTest1.i = i;
        jsonTest1.f = f;
        jsonTest1.vec3 = v3;

        string jsonData = JsonUtility.ToJson(jsonTest1);
        // string 데이터를 Byte로 읽어들여 UTF8 형식으로 인코딩 해 저장
        byte[] data = Encoding.UTF8.GetBytes(jsonData);
        //stream.Write(write할 내용, write 시작할 지점, write할 길이);
        //stream.Write(data); // 처음부터 끝까지 읽기
        stream.Write(data, 0, data.Length); // 범위 지정 쓰기
        stream.Close();
    }

    public void LoadJson()
    {
        FileStream stream = new FileStream(Application.dataPath + "/test.json", FileMode.Open);
        byte[] data = new byte[stream.Length];
        stream.Read(data, 0, data.Length);
        stream.Close();
        // json 파일로부터 byte string 읽은 뒤 Get String 사용해 string 받아옴
        string jsonData = Encoding.UTF8.GetString(data);
        
				// FromJson<> 방식
				TestClass jsonData2 = JsonUtility.FromJson<TestClass>(jsonData);
        jsonData2.Print();
				
				// FromJsonOverwrite 방식
				JsonUtility.FromJsonOverwrite(jsonData, userData);
    }
}

 

Photon

좀 길어져서 따로 정리했다. 나중에 추가로 정리할 일도 있을 것 같고.

 

[Unity] Photon, Photon View 이용한 멀티 게임 만들기 (간단 예제)

나도 공부 중이지만 일단 정리. 설치 Photon 종류 PUN 설정 후 이름 짓고 어플리케이션 작성. Unity Asset Store - Pun 2 Free 다운로드 프로젝트 Window - Package Manager - My Asssets에서 다운로드 후 Import..

psych-dobby.tistory.com

 

Photon은 신기하게도 오브젝트를 Instantiate하면서 동기화하는 건 있는데 UI에 대해서는 없다...

UI를 동기화하려면 매번 RPC를 통해 변경사항이 있을 때 모든 개체의 UI를 바꿔주어야 한다. 여간 번거로운 게 아니다.

UI 동적 생성하면서 동기화하려고 했는데 절대 안 된다. 결국 미리 만들어 놓고 동기화하는 법 밖에는 없다.

 

아래는 이 문제를 해결하려고 찾아본 자료

 

Synchronize UI gamebject over the network

Hi, I have a photon voice chat demo and I want to synchronize a gameobject that is not a player (for example a Text element with variable string text).

forum.photonengine.com

 

그리고 채팅 예제를 통해 UI 동기화를 실습해봤다.

 

 

추가 공부

2022.10.21 - [Unity 공부] - [Unity] Text Mesh Pro Text (TMP text) Script 동적 생성 / 제어하기

 

[Unity] Text Mesh Pro Text (TMP text) Script 동적 생성 / 제어하기

TMP Text를 동적으로 생성해야 하는 일이 있었는데 Component 접근과 Font 변경에서 헤맸다. 그래서 정리해보는 TMP text Script로 동적 생성 및 제어하기! 요약 동적 생성 gameObject.AddComponent (); 폰트 변경..

psych-dobby.tistory.com

 

후기

이번주 목요일 알고리즘 스터디에서 3문제를 풀었는데 시간 내에 다 풀었다! 그런데 한 문제가 분명 테스트 케이스에 대해 정답으로 나오는데 자꾸 100%에서 오류가 나는 거다. 뭐지...했는데 디버그용 Console.WriteLine(어쩌구) 써놓은 것 때문에 코드를 잘 만들어 놓고도 틀리게 나온 것이었다.... 멍청이... 진짜 조심해야지. 또 다른 문제는 재귀로 구현한 것과 while로 구현한 것 둘 중 재귀로 구현한 것만 정답 처리가 안 돼서 스터디원들이 어디가 잘못됐는지 알려줬다. 따봉 스터디원들.

중간 평가 때의 문제를 다시 풀어보는 스터디도 해봤다. 확실히 그때는 어리버리하게 느릿느릿 문제를 풀었던 것 같은데 이번에는 훨씬 빨리 풀었다. 정답을 따로 외운 것도 아니고 정말 문제 보고 이렇게 풀면 되겠다 해서 풀어보고, 안 되면 구글링! 하면서 풀었는데! 몇 가지 빼고 거의 다 구현했다. 중간 평가 때 못 풀었던 문제인데 그땐 왜 못 풀었지... 싶은 문제도 있었다. (아마도 긴장해서...?) 확실히 다들 실력이 늘고 있다. 각자 구현 방식이 다른 부분이 있으면 공유하면서 나와 다른 풀이도 구경하고 배울 수 있어 좋은 시간이었다.

Photon은 어렵다... 금요일까지 예전에 했던 러너 게임에 채팅 기능과 멀티 플레이 기능을 추가해서 완성본으로 발표하고 싶다.

 

유데미코리아 바로가기 : https://bit.ly/3b8JGeD

본 포스팅은 유데미-웅진씽크빅 취업 부트캠프 유니티 1기 과정 후기로 작성되었습니다.

 

새로운 가능성의 시작, 유데미 x 웅진씽크빅

글로벌 최신 IT 기술과 실무 교육을 입문부터 심화까지! 프로그래밍, 인공지능, 데이터, 마케팅, 디자인 등 세계 최고의 강의를 경험하세요.

www.udemykorea.com

 

댓글