개요
처음에는 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 방식 |
장점 | 에디터 친화적 | 대규모 데이터 관리에 강함 |
단점 | 데이터 증가 시 관리 부담 | 초기 설정 코드 필요 |
추천 상황 | 소규모 프로젝트 | 데이터가 많거나 서버 연동 예정일 때 |
마치며
이번 리팩토링으로 적 데이터 관리가 훨씬 유연해졌고,
앞으로 다양한 적 추가 및 밸런스 조정이 훨씬 편해질 것으로 기대된다.
앞으로 남은 작업이나 개선 사항도 계속 정리해서 올릴 예정입니다.
'내일배움캠프 > Unity Final Projcet' 카테고리의 다른 글
[Unity] 카드 뽑기 시스템 리팩터링 (0) | 2025.04.14 |
---|---|
[Unity] 랜덤 카드 뽑기 기능 구현 (0) | 2025.04.11 |
[Unity] Scene 이동 후 작업이 바로 실행되지 않는 문제 (트러블슈팅) (0) | 2025.04.10 |
[Unity] GameManager 만들기 - 매니저 총괄 시스템 (0) | 2025.04.09 |
[Unity] 웨이브 기반 적 스폰 시스템 구현기 (0) | 2025.04.07 |