아무 프래그래머나 붙잡고 물어보시면 아실테지만, 게임 디자이너가 프로그래머의 손을 빌리지 않고도 게임플레이 트윅작업을 마음껏 할 수 있도록 하는 데는 데이터 주도형 접근법만한 것이 없습니다. 게임 디자이너들과 이야기를 나눠 보면, 트윅이나 밸런싱 작업이 많이 필요한 게임의 경우 엑셀(이나 기타 스프레드시트 툴)에 제공되는 유용한 툴세트로 직접 데이터 조작 작업을 하는 것이 최선이라 합니다.
그러면 게임 디자이너가 엑셀로 정의한 데이터를 UE4 에서 사용할 수 있는 포맷으로 변환할 수 있는 방법이 있을까요? 네, 희소식이 있습니다! 이미 UE4 에서 가능한 방식이거든요!
언리얼 엔진 4 는 엑셀에서 쉽게 임포트할 수 있는 포맷인 .csv (콤마로 구분되는 변수) 파일에서 데이터를 임포트하는 기능을 지원합니다. 액셀 문서 자체내에 버튼을 클릭하여 .csv 로 익스포트하도록 매크로를 만들 수도 있습니다. 그런 식으로 구성된 문서 예제는 이렇습니다:
- Example.xlsm (다운로드하려면 우클릭 후 다른 이름으로 저장...하세요.)
참고로 "enable content" (콘텐츠 허용) 버튼을 눌러야 매크로 실행이 가능할 수 있습니다. 이 부분은 컴퓨터에서 허락 없이 임의의 코드 실행을 막기 위한 액셀의 보안 기능입니다.
데이터 테이블 유형
다음의 두 가지 데이터 테이블 유형이 유용한 것으로 보입니다:
- DataTables (데이터 테이블)
- CurveTables (커브 테이블)
데이터 테이블은 임포트시 원하는 어떤 데이터 유형이든 자유롭게 정의할 수 있는 반면, 커브 테이블은 부동소수점 실수를 통해 정의된 커브상의 보간에 좀 더 특화되어 있습니다.
데이터 테이블
데이터 테이블을 통해 엑셀에서 커스텀 데이터 구조체 정의 및 그 값에 대한 편집과 유지보수가 가능합니다. FTableRowBase 를 상속하여 구조체를 만드는 것으로 데이터 포맷을 정의한 다음, 다양한 프로퍼티 및 기본값을 정의할 수 있습니다.
레벨 업 경험치 데이터에 대한 정의와 그 데이터를 게임에 제공해 주는 CSV 문서의 예제는 이렇습니다:
/** Structure that defines a level up table entry */
USTRUCT(BlueprintType)
struct FLevelUpData : public FTableRowBase
{
GENERATED_USTRUCT_BODY()
public:
FLevelUpData()
: XPtoLvl(0)
, AdditionalHP (0)
{}
/** XP to get to the given level from the previous level */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=LevelUp)
int32 XPtoLvl;
/** Extra HitPoints gained at this level */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=LevelUp)
int32 AdditionalHP;
/** Icon to use for Achivement */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=LevelUp)
TAssetPtr<UTexture> AchievementIcon;
};
그에 상응하는 CSV 문서는 다음과 같은데, 첫 열은 데이터 행의 식별을 위한 고유명입니다. 나중에 데이터를 받을 때, 원하는 데이터 행을 이름으로 레퍼런싱합니다.
Name,XPtoLvl,XP,Asset
1,0,0,"Texture2d'/Game/Textures/AchievementIcon1'"
2,1000,1000,"Texture2d'/Game/Textures/AchievementIcon2'"
3,1000,2000," Texture2D'/Game/Textures/AchievementIcon3'"
4,1500,3500," Texture2D'/Game/Textures/AchievementIcon4'"
5,2000,5500," Texture2D'/Game/Textures/AchievementIcon5'"
커브 테이블
커브 테이블은 그 용도가 조금 더 한정되어 있는데, 들어있는 데이터가 실수(float)뿐이기 때문입니다. 엑셀 안에서 다양한 공식이나 툴을 사용하여 경험치나 게임의 다른 요소에 대한 커브를 정의한 다음, UE4 에서 그 커브를 평가(evaluate)할 수 있습니다.
예를 들어 캐릭터 레벨이나 기타 요소에 따라 대미지를 상승시키는 커브를 다음과 같이 정의할 수 있습니다:
예제
대미지 상승 커브에 대한 예제 테이블입니다 (보시듯이 열 번호는 연속된 정수일 필요가 없으므로, 공백을 포함시킬 수 있습니다):
0 |
2 |
3 |
7 |
|
---|---|---|---|---|
Melee_Damage |
15 |
20 |
25 |
30 |
Melee_KnockBack |
1 |
2 |
4 |
8 |
Melee_KnockBackAngle |
10 |
45 |
60 |
65 |
Melee_StunTime |
0 |
1 |
5 |
7 |
커브는 밸런싱, 아이템 배분, 기술이나 능력에 대한 특성 조절에 특히나 유용합니다. 정의된 커브상의 임의 지점에 대한 값을 구할 수도 있습니다. 예를 들어 게임의 난이도 설정에 따라 생명력이 달라지는 몬스터가 있는 경우, 100 에서 10,000 범위의 생명력 커브를 선형이든 큐브형이든 어떤 방식으로든 정의합니다. 그리고서 "어려움" 난이도의 생명력 양은 그 커브 최소 최대 값의 75% 정도에서 따 오면 되는 것입니다.
임포트
임포트 프로세스는 매우 쉽습니다. 엑셀(이나 기타 소프트웨어의) 스프레드시트를 .csv 포맷으로 익스포트한 다음, 그 파일을 콘텐츠 브라우저에 끌어 놓으면 됩니다.
현재 .csv 파일을 엑셀에서 열어둔 상태로 UE4 에 임포트 시도하면 확실한 오류 메시지 없이 실패하므로, 임포트하기 전 반드시 엑셀에서 파일을 닫아주시기 바랍니다. 이 문제에 대해 조사중입니다.
대화상자가 떠 데이터 테이블( 및 C++ 에서 미리 정의된 열 유형)인지 커브 테이블인지 선택할 수 있습니다. 커브 테이블의 경우 커브 포인트 사이의 보간 유형을 선형, 큐브형 등등 중 하나에서 선택할 수 있습니다:
이제 콘텐츠 브라우저에서 그 데이터 테이블 또는 커브 테이블 애셋을 확인할 수 있으며, 더블클릭하여 열어보면 그 값을 확인할 수 있습니다.
데이터 사용
데이터 설정을 가급적 쉽게 하기 위해서는, FDataTableRowHandle 또는 FCurveTableRowHandle 유형의 블루프린트 노출 변수를 만들 것을 추천합니다. 그런 다음 디자이너는 블루프린트에서 테이블과 행 이름을 지정하면 됩니다.
이 레퍼런스 설정이 완료되면 FCurveTableRowHandle::GetCurve() 를 호출하여 FRichCurve 를 구하거나, FDataTableRowHandle::FindRow() 를 호출하여 미리 정의한 구조체의 인스턴스에 대한 레퍼런스를 구할 수 있습니다. 이 레퍼런스는 함수의 영역을 넘어서는 범위까지 유지해서는 안되는데, 그 이유는 데이터를 다시 임포트하여 변경된 내용을 즉시 확인하고자 하는 경우, 유효하지 않은 포인터에 접근하지 않도록 하기 위해서입니다.
데이터 테이블 및 커브 테이블 관련 추가 정보
자세한 내용은 데이터 주도형 게임플레이 요소 문서 를 참고해 주시기 바랍니다.
이 글이 엑셀을 사용하여 게임 디자인을 하시는 분들의 프로세스에 도움이 되었으면 좋겠습니다. 질문이나 피드백은 AnswerHub 나 Forum 를 통해 언제든 해 주시기 바랍니다. 한국 사용자를 위해 네이버 카페 도 준비되어 있습니다.