엑셀로 작성한 데이터 표를 Unity에 로드하는 과정을 도와줄 Manager 클래스를 만든다.

이러한 리소스를 로드하는 객체가 프로그램에 여러 개일 필요가 없다.
객체가 하나만 있으면 되고, 또 전역에서 해당 데이터 테이블의 자료에 접근할 수 있어야 한다.
이 조건을 만족시키는 싱글톤 객체로 생성한다.

Key-Value 형태로 IDataTableInfo 인터페이스를 상속받은 객체만을 저장하는 멤버를 가진다.
굳이 IDataTableInfo 라는 인터페이스를 정의한 이유는
1. foreach문에서 모든 데이터 테이블을 한 번에 로드하기 위함
2. C#의 리플렉션을 통해 IDataTableInfo를 상속받은 객체만 자동으로 추려서 저장하기 위함
에디터에서 일일이 IDataTableInfo를 상속한 스크립트를 매니저클래스에 등록하는 것이 아니라, 게임 실행하면 알아서 등록되게 처리한다.
인터페이스가 가지는 함수는 Load 함수 하나뿐이다.

에디터 하이어라키에 매니저 클래스가 존재하면, 유니티 함수에 의해 Init 함수가 호출될 것이고,
base.Init() 에서는 씬이 전환되어도 파괴되지 않도록 DontDestroyOnLoad 처리가 되어있다.
그 다음 데이터 테이블을 로드한다.
데이터 테이블은 내 프로젝트의 전체 클래스 타입을 추출해서 추려내는 방식을 사용할 것이고,
해당 타입은 인터페이스인 IDataTableInfo이다. 그러면, IDataTableInfo를 상속받은 클래스만 생성하면 앞으로는 게임 실행 시 해당 클래스가 파싱한 csv 데이터가 자동으로 등록된다.

예시로 ChapterDataTable 클래스를 만든다.
이 클래스는 하나의 csv 파일을 담당한다.

스테이지에 관한 내용이며, 4개의 열 데이터가 있다.
열 이름을 묶은 하나의 class를 만들어준다.
그리고 이 csv 파일에 데이터를 저장하고 관리할 ChapterDataTable 클래스는 IDataTableInfo를 상속받는다.
그러면 매니저 클래스에 의해 자동으로 로딩 대상에 포함된다.

파일이 저장된 경로를 명시한 const string 변수와 파싱한 데이터를 저장할 멤버를 만든다.
인터페이스를 상속받으므로 반드시 Load 함수를 정의해야 한다.
Load 함수는 csv 파일을 파싱하는 CSV Reader 클래스의 Read 함수를 호출하는데, 내용은 아래와 같다.
파일 경로를 전달해주면 Resources.Load() 함수를 사용해 TextAsset으로 가져오고 여기서 텍스트를 추출하면 csv 파일의 데이터가 행 한 줄씩 쭈욱 이어 붙인 길다한 한 줄의 텍스트가 된다. 이걸 규칙에 맞게 열 단위로 구분하고 행 단위로 잘라내는 방식이다.
그래서 list 지역 변수에는 한 줄의 행 데이터가 string이란 열 기준을 key로 하여 value가 저장된다.


이 Load 함수를 사용하면 각 예쁘게 csv 파일 데이터가 원소마다 한 행씩 예쁘게 들어가 있으므로,
foreach문을 사용하면 열 이름을 key로 넣어주면 value를 뱉어준다.
그 데이터를 DataTable 클래스는 저장만 할 뿐이다.

이렇게 Load 함수를 정의하고 추가 작업 없이 빌드하고 게임 실행하면 csv 파일 데이터가 잘 저장되는 것을 확인할 수 있다.
앞으로 나는 아이템이나 몬스터 스텟 정보 등을 csv 파일로 작성하고 에디터에 넣고 IDataTableInfo를 상속받은 클래스를 만들어서 Load 함수만 정의하면 게임 실행과 동시에 저장된 데이터를 사용할 수 있는 환경이 준비되는 것이다.

그럼 이 데이터를 사용하기 위해서는 IDataTableInfo가 아니라 실제 데이터 타입을 알아야하는 문제가 있다.
그래야 "GetChaterData(1) : 1스테이지 정보 주세요!" 가 되니까.
이를 위해 매니저 클래스에 Get 함수를 만들어준다. IDataTableInfo를 상속받은 클래스라면, T 타입으로 변환할 수 있으면 변환해서 넘겨준다.

그러면 앞으로 DataTableManager.Instance.Get<ChapterDatTable>().GetChpaterData(10) : 10 스테이지 정보 주세요!
방식으로 사용할 수 있다.
'Unity > 프레임워크' 카테고리의 다른 글
| [Unity] Localization Remote load (0) | 2026.01.01 |
|---|---|
| [Unity] Localization : 다국어 지원 시스템 (0) | 2025.12.30 |
| [Unity] Google AdMob 연동 (0) | 2025.12.29 |
| [Unity] 관리자 클래스 : Singleton Pattern (0) | 2025.12.04 |
| [Unity] 싱글톤(Singleton)과 Title Scene의 관계 (0) | 2025.12.01 |
