Make Unreal REAL.
article thumbnail
이득우의 언리얼 C++ 게임 개발의 정석

 

캐릭터나 아이템의 스텟 등은 게임의 기반을 이루는 변하지 않는 데이터이므로, 보통 게임 어플리케이션이 초기화될 때 불러들인다.

 

언리얼 엔진은 게임 어플리케이션을 관리하기 위한 용도로 게임 인스턴스(Game Instance)라는 언리얼 오브젝트를 제공한다.

 

데이터 테이블은 효과적으로 테이블(표) 데이터를 관리하기 위해 언리얼 엔진에서 제공하는 오브젝트이다.

  • 콤마(,)로 구분된 csv 파일을 읽어들일 수 있다.

 

게임 인스턴스가 데이터 테이블을 통해 캐릭터나 아이템의 스텟을 관리하도록 설계하면, 게임 어플리케이션이 초기화될 때 데이터를 불러들이며 종료될 때까지 보존된다.

 

새로운 게임 인스턴스를 만든다.

  • 기본 목록에 없으므로 직접 검색해서 선택해야 한다.

 

 

Game Mode는 Level(Map)별로 다른 반면 Game Instance는 게임 프로그램에 하나 존재한다.

 

 

새로운 클래스를 만들었으니 헤더에서 CoreMinimal.h를 ArenaBattle.h로 바꿔준다.

 

 

생성자와 초기화 함수 Init()을 오버라이드 하도록 선언한다.

 

 

Init() 함수에서 간단히 로그를 출력해본다.

 

 

게임 인스턴스의 Init() 함수는 게임 어플리케이션 거의 초반부에 오디오 장치를 초기화하기 전부터 실행된다.

 

 

더 이후의 로그이다.

 

Init()은 플레이를 위해 로드한 월드를 가져오기 훨씬 전에 실행된다.

 

 

실제로는 아래 사진가 같은 과정을 거쳐 게임이 시작된다.

 

주요 함수들의 실행 순서는 다음과 같다.

  1. UGameInstance::Init()
    게임 어플리케이션의 초기화
  2. AACtor::PostInitializeComponents()
    레벨에 속한 액터의 초기화
  3. AGameMode::PostLogin()
    플레이어의 로그인(플레이어의 준비가 완료됨)
  4. AGameMode::BeginPlay(), AActor::BeginPlay()
    게임 시작

 

 

로드할 csv 파일을 확인해본다.

  • csv 파일은 실제로는 콤마(,)나 공백 등의 구분자로 구성된 행들의 집합이다.

 

 

데이터 테이블을 사용하기 위해서는 "Engine/DataTable.h" 헤더를 포함해야 한다.

 

 

csv 파일을 데이터 테이블로 불러들이기 위해서는 각 열의 이름과 타입이 동일한 구조체를 선언해야 한다.

  • 이때 첫 번째 열은 이름이 꼭 Name이 아니어도 언리얼 엔진에서 자동으로 키 값으로 사용하기 때문에 제외한다.

 

언리얼 엔진에서 제공하는 FTableRowBase 구조체를 상속 받는 FABCharacterData라는 구조체를 선언한다.

  • 클래스 선언과 비슷하게 USTRUCT()와 GENERATED_BODY() 매크로를 사용해야 한다.
  • 이 구조체는 테이블 전체의 형식을 나타내는 것이 아니라 한 행의 형식을 나타낸다.

 

 

이제 컴파일하면 FABCharacterData 형식에 맞게 csv 파일을 임포트할 수 있게 된다.

 

콘텐츠 브라우저에 드래그한 후, 행 형식을 ABCharacterData로 지정해 임포트한다.

 

 

csv 게임 데이터가 잘 불러와졌고 여기서 값을 수정할 수도 있다.

  • 수정하다가 다시 초기값을 불러오고 싶다면 Reimport를 하면 된다.

 

 

게임 인스턴스에 게임 데이터를 불러와 저장할 DataTable 오브젝트 변수를 만든다.

  • 테이블 자체는 FABCharacterData가 아니라 UDataTable 형식이다.

 

Level에 해당하는 한 행을 가져오는 GetABCharacterData() 함수를 만든다.

  • UDataTable 테이블에서 FABCharacterData 형식으로 한 행을 가져온다는 의미이다.

 

 

UDataTable 변수에 데이터 테이블 에셋을 읽어들인다.

  • UDataTable->GetRowMap().Num() 함수로 행의 개수를 확인할 수 있다.

 

 

GetABCharacterData() 함수에서는 Level에 해당하는 행을 찾아 반환한다.

  • UDataTable->FindRow<FTableRowBase>() 함수를 이용해 데이터 테이블에서 행을 가져올 수 있다.
  • UDataTable 테이블에서 FTableRowBase 형식으로 한 행을 가져온다는 의미이다.
  • 첫 번째 인자는 행 이름, 두 번째 인자는 오류 시 출력할 디버깅 문자열이다.
  • 가져온 데이터 테이블은 행 이름과 Level 값이 일치하므로 Level을 전달해도 된다.

 

게임 인스턴스의 Init() 함수에서 20레벨의 DropExp 값을 출력해 테스트한다.

 

 

csv 파일을 활용해 데이터 테이블 에셋을 만들고 게임 인스턴스에서 불러 들이는 데 성공했다.

 

profile

Make Unreal REAL.

@diesuki4

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그