데이터 테이블(Data Tables)
Game Framework의 Data Table 시스템은 게임 내의 표 형태 데이터를 로드, 파싱, 접근할 수 있도록 구조화된 방식을 제공합니다.
이 시스템은 아이템 속성, 캐릭터 능력치, 레벨 설정 등과 같이 테이블 형태로 관리하면 효율적인 게임 데이터를 다루는 데 적합합니다.
설정 데이터(Configuration)나 다국어(Localization) 시스템 등 다른 데이터 관리 기능은 별도의 문서를 참고하세요.
개요
Data Table 시스템을 사용하면 다음과 같은 작업이 가능합니다.
•
텍스트 파일, 바이너리 파일 등 다양한 소스에서 표 형태 데이터 로드 및 파싱
•
ID 또는 사용자 정의 조건으로 데이터 행(Row) 접근
•
데이터 행을 열거, 필터링, 정렬
•
런타임에 데이터 행 추가/제거
•
테이블 내 최소/최대 ID 값 빠르게 조회
핵심 구성 요소
1. Data Table Manager
•
모든 데이터 테이블을 관리하는 핵심 컴포넌트
•
GameFrameworkModule을 상속
•
데이터 테이블 생성, 가져오기, 파괴 담당
2. Data Table
•
DataTable<T> 인스턴스로 표현되며, T는 IDataRow 인터페이스 구현 타입
•
각 테이블은 고유 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와의 연동으로 프로젝트 전반에서 활용성이 높습니다.