bdfgdfg

데이터 관리(Json) 본문

게임프로그래밍/Unity

데이터 관리(Json)

marmelo12 2021. 8. 8. 16:23
반응형

게임에서는 스탯과 같은 수치와 관련된 데이터를 따로 관리하게 된다.

 

여기서 따로 관리하는 방식은 보통 Json,XML을 사용하게 된다.

public class DataManager 
{
    public void Init()
    {

    }
}

데이터를 관리하는 매니저 클래스를 만들어주고, 전체 매니저를 관리하는 클래스에서 생성한뒤. Init함수를 호출해준다.

 

우선 Json과 XML이 데이터를 관리하는 방식을 보면

위와 같은 방식으로 관리를 하고 있다.

 

Json을 만드는 방법은 간단하다.

위와같이 처음에는 txt로 만들고나서. 확장자명을 json으로 바꾼다.

바꾸고 난후 유니티로 돌아가 json파일을 더블클릭해 열어보면 비쥬얼 스튜디오창에서 열리게 된다.

간단하게 데이터를 표현해보면

{
  "stats": [
    {
      "level": "1",
      "hp": "100",
      "attack": "10"
    },
    {
      "level": "2",
      "hp": "150",
      "attack": "15"
    },
    {
      "level": "3",
      "hp": "200",
      "attack": "20"
    }
  ]
}

과 같이 표현한다.

 

이제 이것을 유니티에서 데이터를 읽어오면

public class DataManager 
{
    public void Init()
    {
        //TextAsset은 텍스트파일을 의미.
        TextAsset textAsset = Managers.Resource.Load<TextAsset>($"Data/StatData");
        Debug.Log(textAsset.text);
    }
}

이렇게 Json데이터를 쌩으로 가져올 수 있고. 당연히 유니티에서도 Json과 관련된 기능을 제공한다.

 

우선 Json에 저장된 데이터 목록을. 코드상에서 저장하기 위해

[Serializable]
public class Stat
{
    public int level;
    public int hp;
    public int attack;
}
[Serializable]
public class StatData
{
    public List<Stat> stats = new List<Stat>();
}

위와 같이 정의해주고. (참고로 필드의 멤버를 public으로 열어두지 않으면 읽어내질 못함. 아니면 SerializeField를 한다)

Init함수안에서 JsonUtility라는 클래스내의 Json으로 부터 데이터를 읽어와 위에서 정의한 StatData클래스의 멤버에 저장하게 되면

이렇게 데이터가 저장이 된다.

 

그리고 멤버의 이름을 Json의 데이터 이름과 똑같이 해줘야한다.

그리고 Json은 1이라는 값을 문자열로 해줬지만 우리는 int level, int hp, int attack등. int형으로 해놓아서

자동으로 int형으로 저장이 된다.

 

그리고 보통. 이러한 Json데이터에서 예로들어 오크와 같은 몬스터의 정보를 담는다고하면

그 몬스터의 고유번호가 존재한다고 하는데. 그 고유번호를 통해 몬스터정보에 접근을 하기위해서

보통 List와 같이 전체 데이터를 순회하는 비효율적인 방식이 아닌, Id정보를 Key값으로 두어 관리를 할 수있는 Dictionary를 많이 사용한다고 한다.

 

public class DataManager 
{
    public Dictionary<int, Stat> StatDict = new Dictionary<int, Stat>();
    public void Init()
    {
        //TextAsset은 텍스트파일을 의미.
        TextAsset textAsset = Managers.Resource.Load<TextAsset>($"Data/StatData");
        StatData data = JsonUtility.FromJson<StatData>(textAsset.text);

        // 리스트로 들고있던 StatData를 Dictionary에 담는과정.
        foreach(Stat stat in data.stats)
        {
            StatDict.Add(stat.level, stat);
        }
    }
}

(id가 아닌 level 키값을 넣어줌. 만약 id라는 고유번호같은 식별번호가 있다면 그것으로 넣어두면 된다.)

 

 

 

반응형

'게임프로그래밍 > Unity' 카테고리의 다른 글

Coroutine(코루틴)  (0) 2021.08.08
Animation State패턴  (0) 2021.08.06
투영  (0) 2021.08.05
Raycasting / LayerMask  (0) 2021.08.05
Input Manager / Resource Manager  (0) 2021.08.05
Comments