Inflearn brand logo image

인프런 커뮤니티 질문&답변

moonfgg님의 프로필 이미지
moonfgg

작성한 질문수

유니티 시스템 프로그래밍 Pt.1 - 상용 게임 구현을 위한 핵심 시스템 올인원 패키지

유저 데이터 바이너리로 로드 및 저장

userDataList Json으로 저장

해결된 질문

작성

·

52

0

UserDataManager.cs에

모든 IUserData를 모아둔 userDataList가 존재하는데 해당 리스트를 Json으로 만들어서 파일로 저장하고 싶습니다.

 

이유는 모은 데이터를 한 개의 Json 파일로 관리하고 싶기 때문인데, 계속 시도 중인데 실패를 하네요...

 

아니면 userDataList를 Json화 시켜 저장하는 방법 말고 다른 방법이 있을까요?

 

답변 2

1

BurningCarrot님의 프로필 이미지
BurningCarrot
지식공유자

안녕하세요! BurningCarrot입니다. 문의해 주신 내용에 답변 드립니다.

IUserData는 클래스가 아니라 인터페이스이기 때문에 기존 JsonUtility를 사용해서는 json으로 변환할 수 없습니다. Newtonsoft.Json 어셋을 활용한 방법을 알려드리니 이를 활용하시길 바랍니다.

using Newtonsoft.Json; //Newtonsoft.Json 어셋을 설치하셔야 합니다.

var settings = new JsonSerializerSettings
{
    TypeNameHandling = TypeNameHandling.Auto,
    Formatting = Newtonsoft.Json.Formatting.Indented
};

//json으롭 변환
string json = JsonConvert.SerializeObject(UserDataList, settings);
Console.WriteLine(json);

//UserDataList로 역변환
List<IUserData> deserializedList = JsonConvert.DeserializeObject<List<IUserData>>(json, settings);

Newtonsoft.Json 어셋 설치는 이 링크를 참고하시길 바랍니다. 제가 캡쳐한 부분을 참고하시면 됩니다.

https://github.com/applejag/Newtonsoft.Json-for-Unity/wiki/Install-official-via-UPM

image.png

 

moonfgg님의 프로필 이미지
moonfgg
질문자

이런 것이 있었군요! 감사합니다.

그러면 혹시 강의 내용의 인터페이스들의 List가 아닌 그냥 각각의 다른 Manager들을 한 곳에서 모아서 Json으로 만들어서 관리할 수 있을 까요?

계속 시도를 하지만 아래 그림 처럼 이상하게 저장됩니다...

image.png

 

image.png

 

A, B 클래스가 다른 Data를 저장하는 Manager 역할을 합니다.

 

BurningCarrot님의 프로필 이미지
BurningCarrot
지식공유자

클래스 A와 B도 [Serializable]로 되어 있나요?

moonfgg님의 프로필 이미지
moonfgg
질문자

네 아래와 같습니다.

image.png

 

BurningCarrot님의 프로필 이미지
BurningCarrot
지식공유자

저는 아래 코드와 같이 하였을 때 정상적으로 AllDataManager에서 jsonData가 잘 만들어집니다. 그냥 AData, BData 클래스를 사용하시면 될 것 같은데, A와 B 클래스를 또 만들어서 그 안에 다시 AData와 BData를 각각 넣어주어야 할 특별한 이유가 있으신가요?

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

[Serializable]
public class AData
{
    public bool sound;
    public float bgmValue;
    public float sfxValue;

    public AData()
    {
        sound = true;
        bgmValue = 0.8f;
        sfxValue = 0.8f;
    }
}

[Serializable]
public class BData
{
    public bool testFlag;
    public float test1Value;
    public float test2Value;

    public BData()
    {
        testFlag = true;
        test1Value = 0.8f;
        test2Value = 0.8f;
    }
}

[Serializable]
public class AllData
{
    public AData aData;
    public BData bData;

    public AllData(AData aData, BData bData)
    {
        this.aData = aData;
        this.bData = bData;
    }
}

public class AllDataManager : MonoBehaviour
{
    public AllData allData = new AllData(new AData(), new BData());

    void Awake()
    {
        string jsonData = JsonUtility.ToJson(allData);
        Logger.Log(jsonData);
    }
}
moonfgg님의 프로필 이미지
moonfgg
질문자

감사합니다! 제가 너무 어렵게 생각한 것 같네요.

0

안녕하세요, 인프런 AI 인턴입니다. moonfgg님.

UserDataManager에서 모든 IUserData를 관리하는 userDataList를 JSON 형식으로 파일에 저장하려는 시도를 하고 계시는군요. 데이터를 JSON으로 저장하면 여러 장점이 있습니다. 특히, JSON은 사람이 읽기 쉽고, 다양한 프로그래밍 환경에서 지원하기 때문에 데이터 교환 및 저장에 유리합니다.

JSON 파일로 저장하는 방법

  1. JsonUtility 사용: 유니티의 JsonUtility 클래스는 객체를 JSON 문자열로 변환해주는데, 이때 객체 내부 클래스가 Serializable이어야 합니다.

    • userDataList를 JSON 문자열로 변환합니다:

      string json = JsonUtility.ToJson(userDataList);
      
    • 변환된 JSON 문자열을 파일로 저장합니다:

      System.IO.File.WriteAllText("path_to_save/file.json", json);
      
  2. 파일에 저장하기 전 준비:

    • 파일을 저장할 경로를 정확히 지정하고, 파일 이름에 json 확장자를 붙입니다.
    • 데이터가 크면, JsonUtility 외에도 Newtonsoft.Json 같은 라이브러리를 사용할 수 있는데, 이는 더 다양한 기능을 제공하고 있습니다.

JSON 외의 다른 저장 방법

  • 바이너리 저장: 데이터 크기를 줄이고 더 빠르게 읽고 쓸 수 있지만, 읽기 쉽지 않고 수정이 힘들다는 단점이 있습니다.
  • 데이터베이스 저장: 복잡한 데이터를 관리해야 한다면, 데이터베이스 솔루션이 도움이 될 수 있습니다. 유니티에서 SQLite를 사용하는 방법이 있습니다.

관련된 과거 질문에서도 더 많은 정보를 찾으실 수 있을 것 같습니다. 아래 내용을 확인해보세요:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

moonfgg님의 프로필 이미지
moonfgg

작성한 질문수

질문하기