Company
교육 철학

데이터 테이블(Data Tables)

데이터 테이블(Data Tables)

Game Framework의 Data Table 시스템은 게임 내의 표 형태 데이터를 로드, 파싱, 접근할 수 있도록 구조화된 방식을 제공합니다.
이 시스템은 아이템 속성, 캐릭터 능력치, 레벨 설정 등과 같이 테이블 형태로 관리하면 효율적인 게임 데이터를 다루는 데 적합합니다.
설정 데이터(Configuration)나 다국어(Localization) 시스템 등 다른 데이터 관리 기능은 별도의 문서를 참고하세요.

개요

Data Table 시스템을 사용하면 다음과 같은 작업이 가능합니다.
텍스트 파일, 바이너리 파일 등 다양한 소스에서 표 형태 데이터 로드 및 파싱
ID 또는 사용자 정의 조건으로 데이터 행(Row) 접근
데이터 행을 열거, 필터링, 정렬
런타임에 데이터 행 추가/제거
테이블 내 최소/최대 ID 값 빠르게 조회

핵심 구성 요소

1. Data Table Manager

모든 데이터 테이블을 관리하는 핵심 컴포넌트
GameFrameworkModule을 상속
데이터 테이블 생성, 가져오기, 파괴 담당

2. Data Table

DataTable<T> 인스턴스로 표현되며, TIDataRow 인터페이스 구현 타입
각 테이블은 고유 ID로 인덱싱된 데이터 행 집합을 저장

3. Data Row

IDataRow를 구현한 커스텀 클래스
각 행은 고유 ID를 가진 단일 레코드
문자열 또는 바이너리 데이터를 구조화된 형태로 변환하는 ParseDataRow 메서드 구현

구현 세부사항

데이터 저장 방식

내부적으로 Dictionary<int, T> 사용
O(1) 속도로 ID 기반 조회 가능
최소 ID 행과 최대 ID 행을 캐싱하여 빠른 접근 지원
private readonly Dictionary<int, T> m_DataSet; private T m_MinIdDataRow; private T m_MaxIdDataRow;
C#
복사

데이터 로딩

DataProvider 시스템을 사용해 리소스 로드 및 파싱
동기/비동기 로딩 모두 지원
텍스트, 바이너리, 커스텀 포맷 가능

데이터 파싱

IDataRow 클래스는 다음 메서드 중 필요한 것을 구현
bool ParseDataRow(string dataRowString, object userData); bool ParseDataRow(byte[] dataRowBytes, int startIndex, int length, object userData);
C#
복사

사용 예시

데이터 행 클래스 정의

public class PlayerLevelData : IDataRow { public int Id { get; private set; } public string Name { get; private set; } public int ExpRequired { get; private set; } public float AttackBonus { get; private set; } public bool ParseDataRow(string dataRowString, object userData) { string[] columnTexts = dataRowString.Split('\t'); int index = 0; Id = int.Parse(columnTexts[index++]); Name = columnTexts[index++]; ExpRequired = int.Parse(columnTexts[index++]); AttackBonus = float.Parse(columnTexts[index++]); return true; } public bool ParseDataRow(byte[] dataRowBytes, int startIndex, int length, object userData) { // 바이너리 파싱 구현 return true; } }
C#
복사

데이터 테이블 로드 및 접근

// 매니저 가져오기 IDataTableManager dataTableManager = GameFrameworkEntry.GetModule<IDataTableManager>(); // 로드 dataTableManager.LoadDataTable<PlayerLevelData>("PlayerLevel"); // 가져오기 IDataTable<PlayerLevelData> playerLevelTable = dataTableManager.GetDataTable<PlayerLevelData>(); // ID로 행 조회 PlayerLevelData level5 = playerLevelTable.GetDataRow(5); // 조건으로 조회 PlayerLevelData[] highLevels = playerLevelTable.GetDataRows(row => row.ExpRequired > 1000); // 정렬 PlayerLevelData[] sortedLevels = playerLevelTable.GetDataRows((a, b) => a.ExpRequired - b.ExpRequired);
C#
복사

주요 기능

ID 조회
T GetDataRow(int id)
C#
복사
조건 검색
T[] GetDataRows(Predicate<T> condition)
C#
복사
정렬
T[] GetDataRows(Comparison<T> comparison)
C#
복사
조건 + 정렬
T[] GetDataRows(Predicate<T> condition, Comparison<T> comparison)
C#
복사

런타임 수정 기능

행 추가
bool AddDataRow(string dataRowString, object userData); bool AddDataRow(byte[] dataRowBytes, int startIndex, int length, object userData);
C#
복사
행 삭제
bool RemoveDataRow(int id);
C#
복사
전체 삭제
void RemoveAllDataRows();
C#
복사

리소스 시스템 연동

ResourceManager와 통합하여 다양한 소스에서 로드 가능
애셋 파일(텍스트, 바이너리, 커스텀)
디스크 바이너리 파일
가상 파일 시스템(VFS)
DataProvider가 실제 리소스 로드와 파싱 담당

메모리 효율성

Dictionary 기반 O(1) 조회
최소/최대 ID 캐싱
객체 풀(Object Pool) 연계로 GC 부하 최소화
결과 리스트 재사용 메서드 제공
void GetDataRows(Predicate<T> condition, List<T> results) void GetDataRows(Comparison<T> comparison, List<T> results) void GetAllDataRows(List<T> results)
C#
복사

결론

Game Framework의 Data Table 시스템은 구조화된 데이터를 효율적으로 관리하고, 다양한 소스에서 유연하게 로드할 수 있도록 설계되었습니다.
IDataRow 인터페이스를 구현하면, ID 기반 빠른 조회, 조건 검색, 정렬, 런타임 수정까지 가능하며, ResourceManager와의 연동으로 프로젝트 전반에서 활용성이 높습니다.