데이터 기반 게임플레이(Data Driven Gameplay) 는 수명이 긴 게임에 관련된 작업량과 복잡도를 완화하는 데 도움이 됩니다. 예를 들어, 일부 게임은 온라인 서비스 모델을 통해 사용자에게 업데이트를 제공할 수 있습니다. 이런 모델은 사용자 피드백에 따라 게임 내의 특정 데이터 파라미터를 조정하여 밸런스를 맞추거나 콘텐츠를 추가할 것입니다.
데이터 기반 게임플레이는 데이터 생성 및 진행 상황을 시각화하고 파라미터화할 수 있는 인터페이스를 제공합니다. 데이터를 Microsoft Excel 또는 기타 스프레드시트 문서로 익스포트하여 유지 관리한 다음 임포트하여 게임에 자동으로 적용할 수 있습니다.
Excel 문서를 통해 데이터 테이블(DataTables) 및 커브 테이블(CurveTables) 을 언리얼 엔진 에 임포트할 수 있습니다. 이러한 Excel 문서는 매크로 지원 Excel 문서인 xlsm
으로, 매크로 기반 익스포트 버튼이 있어 쉼표로 구분되는 중간 데이터 형식인 .csv
문서로 쉽게 익스포트할 수 있습니다.
이러한 문서는 모두 한곳에 모여 있어 데이터를 찾고 수정하기가 쉽습니다. 다음 링크를 우클릭 하고 다른 이름으로 링크 저장(Save as) 을 선택하여 샘플 .xlsm
파일을 다운로드할 수 있습니다.
데이터 테이블
데이터 테이블은 기타 데이터이지만 의미 있고 유용한 방식으로 그룹화된 관련 데이터 테이블로, 이 테이블의 데이터 필드는 에셋 레퍼런스를 포함한 유효한 UObject
프로퍼티일 수 있습니다. 디자이너가 CSV 파일을 데이터 테이블에 임포트하려면 먼저 프로그래머가 행 컨테이너를 생성하여 엔진에 데이터 해석 방식을 알려줘야 합니다.
이러한 테이블은 임포터에 인식되기 위해 FTableRowBase
에서 상속되어야 하는 주어진 코드 기반 UStruct
와 그 변수에 1:1 매핑되는 열 이름으로 구성됩니다.
첫 번째 열의 이름은 Name이 되어야 하며, 이 열에는 게임에서 사용하기 위해 각 행에 액세스할 때 사용되는 이름이 포함됩니다. 다음 열에는 제목에 대한 변수 이름이 있고 같은 열의 아래에는 해당 행/열 교차 부분의 데이터가 있습니다. 이 포맷에서는 단일 행이 FTableRowBase
에서 상속된 구조체에 바로 1:1 매핑됩니다.
다음은 캐릭터가 '레벨업'을 위해 경험치를 획득할 수 있는 게임플레이 데이터 예시를 보여주기 위해 만든 CSV 문서입니다.
/** 레벨업 테이블 항목을 정의하는 구조체입니다. */
USTRUCT(BlueprintType)
struct FLevelUpData : public FTableRowBase
{
GENERATED_USTRUCT_BODY()
public:
FLevelUpData()
: XPtoLvl(0)
, AdditionalHP(0)
{}
/** 'Name' 열은 경험치 레벨과 같습니다. */
/** 이전 레벨에서 해당 레벨로 가기 위해 필요한 경험치입니다. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=LevelUp)
int32 XPtoLvl;
/** 이 레벨에서 얻은 추가 히트포인트입니다. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=LevelUp)
int32 AdditionalHP;
/** 업적에 사용할 아이콘입니다. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=LevelUp)
TSoftObjectPtr<UTexture> AchievementIcon;
};
CSV 문서
Name,XPtoLvl,AdditionalHP,AchievementIcon
1,0,0,"Texture2d'/Game/Textures/AchievementIcon1'"
2,1000,9,"Texture2d'/Game/Textures/AchievementIcon2'"
3,1000,10,"Texture2D'/Game/Textures/AchievementIcon3'"
4,1500,12,"Texture2D'/Game/Textures/AchievementIcon4'"
5,2000,14,"Texture2D'/Game/Textures/AchievementIcon5'"
에셋 타입을 둘러싼 따옴표는 프로퍼티 임포트 파이프라인에 중요합니다. 이 따옴표가 없으면 텍스트는 Texture2d
로 임포트됩니다.
데이터 테이블 임포트 프로세스
CSV 파일을 임포트하려면 다음 단계를 따릅니다.
-
Excel이나 다른 스프레드시트 소프트웨어에서
.csv
확장자로 파일을 저장합니다. -
언리얼 에디터를 열고 콘텐츠 브라우저(Content Browser) 에서 임포트(Import) 를 클릭합니다.
- 데이터 테이블로 임포트하려는 CSV 파일을 찾아 선택합니다. 선택할 수 있는 다음으로 임포트(Import As) 옵션은 다음과 같습니다.
- 데이터 테이블(DataTable)
- 커브 테이블(CurveTable)
- 플로트 커브(Float Curve)
- 벡터 커브(Vector Curve)
- 선형 컬러 커브(Linear Color Curve)
-
드롭다운 목록에서 데이터 테이블 행 타입(DataTable Row Type) 을 선택할 수 있습니다.
-
추가 임포트 옵션(Import Options) 을 사용할 수 있습니다.
임포트 옵션 설명 추가 필드 무시(Ignore Extra fields) true로 설정하면 임포트 데이터의 추가 필드를 무시하고, false로 설정하면 관련 경고를 표시합니다. 누락 필드 무시(Ignore Missing Fields) true로 설정하면 있어야 하지만 없는 필드를 무시하고, false로 설정하면 관련 경고를 표시합니다. 키 필드 임포트(Import Key Field) 임포트 데이터에서 키로 사용할 명시적 필드입니다. 이 필드가 비어있으면 .JSON
의 경우 Name을,.CSV
의 경우 첫 필드를 사용합니다. -
그러면 콘텐츠 브라우저 의 현재 디렉터리에 데이터 테이블 오브젝트가 생성됩니다.
-
오브젝트를 더블클릭 하여 에디터에서 데이터 테이블의 콘텐츠를 확인할 수 있습니다. 오브젝트를 우클릭 하고 메뉴에서 리임포트(Reimport) 를 선택하여 오브젝트를 업데이트할 수 있습니다.
오브젝트를 리임포트할 때 원본 파일 경로가 사용됩니다.
데이터 커브
데이터 커브(Data Curves) 는 데이터 테이블과 비슷한 방식으로 작동하지만, 부동 소수점 타입만 지원합니다. 데이터 테이블과 마찬가지로, 첫 번째 열의 이름은 'Name'이 되어야 하며, 이 열에는 게임에서 사용하기 위해 각 행에 액세스할 때 사용되는 이름이 포함됩니다.
첫 번째 열 제목 다음의 각 열 제목에는 플롯될 커브의 X축 변수가 저장됩니다. 이 제목 아래의 데이터는 주어진 행에 대한 Y축 값입니다. 이 포맷에서 단일 행은 코드가 액세스하고 그에 따라 데이터를 보간할 수 있는 커브에 해당합니다.
아래는 대미지 진행률에 대한 예시 테이블입니다.
0 | 1 | 2 | 3 | |
---|---|---|---|---|
Melee_Damage | 15 | 20 | 25 | 30 |
Melee_KnockBack | 1 | 2 | 4 | 8 |
Melee_KnockBackAngle | 10 | 45 | 60 | 65 |
Melee_StunTime | 0 | 1 | 5 | 7 |
커브 테이블
커브 테이블(Curve Tables) 은 2차원 숫자 데이터를 정의하는 데 유용합니다. 커브 데이터 테이블 에디터(Curve Data Table Editor)에서 단순 커브(Simple Curves)와 리치 커브(Rich Curves)를 편집할 수 있습니다.
커브 테이블 생성 시, 테이블을 생성한 외부 프로그램으로 돌아가지 않고도 에디터를 열어 테이블 또는 커브 뷰에서 커브를 편집할 수 있습니다.
콘텐츠 브라우저의 기타(Miscellaneous) 섹션에서 커브 테이블을 생성할 수 있습니다.
커브 테이블 임포트 프로세스
CSV 파일을 임포트하려면 다음 단계를 따릅니다.
-
Excel이나 다른 스프레드시트 소프트웨어에서
.csv
확장자로 파일을 저장합니다. -
언리얼 에디터를 열고 콘텐츠 브라우저(Content Browser) 에서 임포트(Import) 를 클릭합니다.
-
커브 테이블로 임포트하려는 CSV 파일을 찾아 선택합니다. 선택할 수 있는 다음으로 임포트(Import As) 옵션은 다음과 같습니다.
- 데이터 테이블(DataTable)
- 커브 테이블(CurveTable)
- 플로트 커브(Float Curve)
- 벡터 커브(Vector Curve)
- 선형 컬러 커브(Linear Color Curve)
-
드롭다운 목록에서 커브 테이블 타입(Curve Table Type) 을 선택합니다. 커브 테이블 타입을 선택하면 상수(Constant), Linear(선형) 또는 큐빅(Cubic) 중에서 보간 타입을 선택하라는 메시지가 표시됩니다.
보간 타입 설명 상수(Constant) Y 값이 X의 데이터 포인트 간에 보간되지 않고 이전에 알려진 X 값으로 범위제한됩니다. Linear(선형) Y 값이 X의 데이터 포인트 간에 선형으로 보간됩니다. 큐빅(Cubic) Y 값이 X의 데이터 포인트 간에 큐빅 보간됩니다. -
그러면 콘텐츠 브라우저 의 현재 디렉터리에 커브 테이블 오브젝트가 생성됩니다.
-
커브 테이블을 더블클릭하여 커브 테이블 에디터를 열 수 있습니다.
-
그래프 형태로 커브 테이블 데이터를 보려면 그래프 버튼을 클릭합니다.
-
커브 테이블 뷰(Curve Table View) 를 사용하면 여러 커브를 표시할 수 있습니다.
-
커브를 우클릭하여 커브의 이름을 변경(Rename) 하고 삭제(Delete) 할 수 있습니다.
데이터 연결
이러한 테이블의 데이터를 사용하려면 테이블이 데이터 테이블인지 커브 테이블인지에 따라 블루프린트 노출 변수 FDataTableRowHandle 또는 FCurveTableRowHandle 을 배치해야 합니다.
콘텐츠 제공자 관점에서 보면 다음과 같은 두 개의 서브필드가 있는 데이터 필드가 노출됩니다.
서브필드 | 설명 |
---|---|
데이터 테이블/커브 테이블(DataTable/CurveTable) | 데이터를 보유하고 있는 테이블에 대한 콘텐츠 레퍼런스입니다. |
행 이름(RowName) | 데이터를 가져오려는 행의 첫 번째 열에 있는 이름입니다. |
데이터 사용(C++)
데이터를 연결하고 나면 핸들 구조체가 데이터로 채워진 구조체 또는 커브를 검색할 수 있는 방법을 제공하는 헬퍼 함수 FindRow()
및 GetCurve()
를 제공합니다.
FCurveTableRowHandle
의 경우, FRichCurve
포인터가 반환됩니다. 하지만 FDataTableRowHandle
을 사용하면
템플릿 함수 호출에서 구조체를 지정할 수 있습니다. 이 구조체는 최종 구조체가 될 수도 있고
상속 계층구조에서의 부모 중 하나가 될 수도 있습니다.
반환된 모든 구조체와 커브는 함수의 로컬 범위를 초과하여 캐싱되어서는 안 됩니다. 그래야만 테이블을 리임포트해서 새로 고칠 경우 데이터 변경 사항이 즉시 적용되고 잘못된 포인터에 액세스하지 않게 됩니다.
위의 데이터 테이블 예시에서 참조되는 에셋은 지연 로드되는 에셋이며, TSoftObjectPtr
이 이를 처리합니다.
에셋 필드 타입이 UTexture
로 설정된 경우, 데이터 테이블이 로드될 때마다 모든 에셋이 로드됩니다.