개요

처음에는 ScriptableObject를 활용해 적 능력치를 관리했지만,
점점 게임 데이터가 많아지고 관리가 어려워지면서,
JSON 파일을 통한 데이터 관리로 리팩토링을 진행했다.

이번 포스팅에서는 기존 방식과 새 방식의 차이점, 그리고 수정된 적 자동 생성 시스템을 소개하겠습니다.


기존 방식: ScriptableObject를 이용한 능력치 관리

초기에는 적마다 별도로 ScriptableObject를 만들어서 능력치를 세팅했다.

[SerializeField] private List<EnemySO> enemySOList;
  • EnemySO 안에 체력, 공격력 등의 데이터가 들어있고
  • 적 오브젝트는 이 EnemySO를 참조해서 능력치를 가져왔다.

장점: 직관적이고 에디터에서 쉽게 수정할 수 있음
단점: 적 개수가 많아지면 관리가 복잡하고, 빌드에 모든 데이터가 포함되어 최적화에 불리함

 


변경된 방식: JSON 파일을 이용한 능력치 관리

이제는 DataManager를 통해 JSON 파일에서 적 데이터를 읽어오고,
딕셔너리로 관리하는 방식으로 바꿨다.

EnemyDataDict = GameManager.Instance.DataManager.EnemyDataLoader.EnemyDict;
  • EnemyDataLoader가 JSON 파일을 읽고 EnemyDict에 데이터를 저장
  • EnemyDict는 key(id)를 기준으로 적 데이터(EnemyData)를 빠르게 찾을 수 있다.

구조 예시

{
  "1000": { "hp": 100, "attack": 10, "speed": 5 },
  "2000": { "hp": 300, "attack": 20, "speed": 3 }
}

주요 수정 사항

1. 적 오브젝트에 데이터 부여

적 프리팹 리스트(enemyModlePrefabs)를 돌면서,
EnemyDataDict에서 읽어온 데이터로 능력치를 설정한다.

public void GetEnemyData(List<int> key)
{
    for (int i = 0; i < key.Count; i++)
    {
        for (int j = 0; j < enemyModlePrefabs.Count; j++)
        {
            if (enemyModlePrefabs[j].gameObject.name == EnemyDataDict[key[i]].key.ToString())
            {
                enemyModlePrefabs[j].GetComponent<EnemyState>().SetStatus(EnemyDataDict[key[i]]);
                enemyPrefabs.Add(enemyModlePrefabs[j]);
            }
        }
    }
}
  • 프리팹 이름과 데이터 키를 비교해서 연결
  • 연결된 프리팹을 enemyPrefabs 리스트에 저장

정리

비교 ScriptableObject 방식 JSON + Dictionary 방식
장점 에디터 친화적 대규모 데이터 관리에 강함
단점 데이터 증가 시 관리 부담 초기 설정 코드 필요
추천 상황 소규모 프로젝트 데이터가 많거나 서버 연동 예정일 때

마치며

이번 리팩토링으로 적 데이터 관리가 훨씬 유연해졌고,

앞으로 다양한 적 추가 및 밸런스 조정이 훨씬 편해질 것으로 기대된다.

앞으로 남은 작업이나 개선 사항도 계속 정리해서 올릴 예정입니다.

+ Recent posts