엑셀에 저장돼 있는 캐릭터의 스탯 데이터 테이블을 언리얼 엔진에 불러들여보자. 캐릭터 스탯 데이터는 게임의 기반을 이루는 변하지 않는 데이터이므로 보통 게임 앱이 초기화될 때 불러들인다. 언리얼 엔진은 게임 앱을 관리하기 위한 용도로 GameInstance라는 언리얼 오브젝트를 제공한다. 이 인스턴스가 캐릭터의 스탯을 관리하도록 설계하면 게임 앱이 초기화될 때 캐릭터 스탯 데이터를 불러들이고, 앱이 종료할 때까지 스탯 데이터는 보존된다. GameInstance 클래스를 부모로 하는 클래스를 제작 후 프로젝트 세팅의 맵&모드로 들어가서 GameInstance항목을 우리가 만든 것으로 바꿔주면 게임 앱을 관리할 수 있다.
다음으로 원하는 캐릭터 스탯 데이터를 엑셀에 작성 후 CSV파일 형식으로 저장해준다.
이 파일을 언리얼 엔진에서 불러들이기 위해 테이블 데이터의 각 열의 이름과 유형이 동일한 구조체를 선언해야 한다. 언리얼에서 제공하는 FTableRowBase 구조체를 상속받은 FMyCharacterData라는 이름의 구조체를 게임 인스턴스의 헤더에 선언한다.
구조체 선언
구조체를 생성할 땐 언리얼이 정한 규칙에 따라줘야 에디터 인터페이스에서 연동해 사용할 수 있다.
1. USTRUCT매크로를 구조체 선언 윗줄에 넣는다.
2. 구조체 내부에는 GENERATED_BODY() 매크로를 선언한다.
3. CSV 파일의 각 열의 이름과 동일한 멤버 변수를 타입에 맞춰 선언한다.
4. 테이블의 첫 번째 열데이터는 언리얼 엔진에서 자동으로 Key 값으로 사용하므로 선언에서 제외한다.
USTRUCT(BlueprintType)
struct FMyCharacterData : public FTableRowBase
{
GENERATED_BODY()
public :
FMyCharacterData() : Level(1), MaxHP(100.0f), AttackPower(10.0f), NextExp(30) {}
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Data")
int32 Level;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Data")
float MaxHP;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Data")
float AttackPower;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Data")
int32 NextExp;
};
CSV 파일 임포트
이제 에디터에서 임포트를 클릭하고 아까 만들어둔 CSV파일을 선택한다. 그러면 데이터테이블 옵션 다이얼로그가 생성되는데, 데이터 테이블 행 유형 선택의 드롭다운 목록에서 우리가 선언한 MyCharacterData로 설정하자.
데이터 테이블 로딩
언리얼은 해당 테이블 데이터를 관리하도록 DataTable이라는 언리얼 오브젝트를 제공한다. DataTable을 게임 인스턴스의 멤버 변수로 선언하고, 위의 임포트 데이터의 레퍼런스를 복사한 후 데이터를 불러들여보자.
public:
FMyCharacterData* GetMyCharacterData(int32 Level); //레벨에 따른 구조체 데이터 반환.
private:
UPROPERTY()
class UDataTable* MyCharacterTable; //CSV파일과 연동하여 데이터 불러들이기.
멤버 변수를 다음과 같이 선언하고,
UMyGameInstance::UMyGameInstance()
{
FString CharacterDataPath = TEXT("DataTable'/Game/GameData/MyCharacterData.MyCharacterData'");
static ConstructorHelpers::FObjectFinder<UDataTable> DT_MYCHARACTER(*CharacterDataPath);
if (DT_MYCHARACTER.Succeeded())
{
MyCharacterTable = DT_MYCHARACTER.Object;
}
}
위에서 임포트한 CSV파일을 가져와 MyCharacterTable에 저장시켜준다.
void UMyGameInstance::Init()
{
Super::Init();
float temp = GetMyCharacterData(20)->MaxHP; //20레벨의 최대체력 데이터 가져와 temp에 저장.
}
FMyCharacterData* UMyGameInstance::GetMyCharacterData(int32 Level)
{
//CSV임포트 데이터에서 내가 제작한 구조체의 행 데이터 찾아 반환.
return MyCharacterTable->FindRow<FMyCharacterData>(*FString::FromInt(Level), TEXT(""));
}
다음과 같이 데이터가 로딩되는 것을 확인할 수 있다.
'UE4' 카테고리의 다른 글
[UE4] Unrecognized type Error 해결법 (0) | 2022.11.12 |
---|---|
[UE4] 캐릭터 스텟 컴포넌트 만들기 (0) | 2022.11.12 |
[UE4] 이펙트 구현하기 (0) | 2022.11.11 |
[UE4] 아이템 상자 제작 (0) | 2022.11.11 |
[UE4] 무기 액터 제작 (0) | 2022.11.09 |