{
"enemyStats" : [
{
"ID": 1001,
"hp": 20,
"damage": 35,
"moveSpeed": 3,
"skillGuage": 20,
"objectDropPer": 35
},
{
"ID": 1002,
"hp": 25,
"damage": 30,
"moveSpeed": 2,
"skillGuage": 15,
"objectDropPer": 30
},
{
"ID": 1003,
"hp": 20,
"damage": 30,
"moveSpeed": 4,
"skillGuage": 25,
"objectDropPer": 40
}
]
}
json 데이터를 준비해 준다
* json은 반드시 단일 오브젝트 형태로 존재해야 하기 때문에 배열을 감싸는 오브젝트를 하나 만들어주어야 한다(위 코드에서는 enemyStats이 그 역할을 함)
[Serializable]
public class EnemyStat
{
public int ID;
public int hp;
public int damage;
public float moveSpeed;
public int skillGauge;
public int objectDropPer;
}
[Serializable]
public class EnemyStatLoader
{
public List<EnemyStat> enemyStats = new List<EnemyStat>();
public Dictionary<int, EnemyStat> MakeDict()
{
Dictionary<int, EnemyStat> dict = new Dictionary<int, EnemyStat>();
foreach (EnemyStat enemyStat in enemyStats)
dict.Add(enemyStat.ID, enemyStat);
return dict;
}
}
위쪽 클래스는 json 배열 내 각 오브젝트들을 저장할 틀이고,
아래쪽 클래스는 json 오브젝트(배열)을 저장하기 위한 변수를 만들고, dictionary 형태로 저장하기 위한 메서드를 갖고 있다
둘 다 데이터를 파싱해야 하기 때문에 직렬화(Serializable)를 해주어야 한다
MakeDict은 파싱된 enemyStats 리스트를 가지고 dictionary 형태로 만들어주기 위한 메서드인데,
Linq를 이용해도 되고 위 코드처럼 foreach문을 돌며 Key값을 직접 지정해 주어도 된다
* Key 값은 각 오브젝트를 식별하는 역할을 하기에 각 오브젝트의 고유번호(id)나 문자열 등... 식별 가능한 값을 사용하면 된다
public class DataManager
{
public Dictionary<int, EnemyStat> EnemyDict { get; private set; }
public void Init()
{
EnemyDict = LoadJson<EnemyStatLoader, int, EnemyStat>("EnemyStatData").MakeDict();
}
Loader LoadJson<Loader, Key, Value>(string path)
{
TextAsset textAsset = Managers.Resource.Load<TextAsset>($"Data/{path}");
return JsonUtility.FromJson<Loader>(textAsset.text);
}
}
Data Manager에서 LoadJson을 통해 List 형태로 json 데이터를 파싱한 뒤, 이를 아까 본 아래쪽 클래스(Loader) 내의 MakeDict 메서드를 이용하여 dictionary 형태로 바꿔준다
Data Manager 내 EnemyDict에 접근하여 데이터를 활용하면 된다
'Programing > Unity(C#)' 카테고리의 다른 글
[C#] 다른 클래스의 코루틴 함수 호출하기 (0) | 2024.04.16 |
---|---|
[Unity] 8방향으로 탄환을 발사하는 개체 (0) | 2024.04.12 |
[C#] json 데이터 파싱하기 (0) | 2024.04.09 |
[Unity] 특정 방향으로 2D 오브젝트 회전시키기 (0) | 2024.04.06 |
[C#] Press 입력 받기 (0) | 2024.04.02 |