본문 바로가기
Unreal/Manual

Unreal C++ 언리얼 에셋 불러오기

by Dev_카페인 2023. 10. 28.
반응형

[Unreal/C++] 언리얼 에셋 불러오기

 

언리얼에서 에셋을 가져오는 경우가 수도 없이 많다.

게임 시작 전에 미리 불러와 사용하는 경우도 있고 게임 중간에 동적으로 불러오는 일도 많다.

 

이 글에서는 상황에 따른 에셋 참조 방법을 설명한다.

1. 언리얼에서의 에셋 경로 분석

2. 생성자에서 ConstructorHelpers의 FObjectFinder를 이용한 방법

3. 게임 중간에 생성자가 아닌 곳에서 동적으로 불러오는 방법

4. 블루프린트 클래스를 가져오는 방법

 

 

언리얼에서의 에셋 경로 분석

다양한 경로들
Material'/Game/StarterContent/Materials/M_Ground_Grass.M_Ground_Grass'
ParticleSystem'/Game/StarterContent/Particles/P_Fire.P_Fire'
StaticMesh'/Game/StarterContent/Shapes/Shape_Plane.Shape_Plane'
Blueprint'/Game/Blueprints/BP_MyMyActor.BP_MyMyActor'

다양한 경로를 확인하면 보이겠지만 대략적으로 3부분으로 나뉜다.

Material       '/Game/StarterContent/Materials/M_Ground_Grass       .M_Ground_Grass'

앞에 있는 Material은 에셋의 자료형을 나타낸다.

중간에 있는 경로는 언리얼 엔진에서의 경로를 나타낸다.

가장 뒤에 있는 .M_Ground_Grass은 식별자를 나타낸다.

 

경로에서 자주 보이는 것은 /Game과 /Engine인데

/Game은 언리얼에서 프로젝트 콘텐츠 폴더이고, /Engine은 언리얼 내에 있는 폴더이다.

참조 경로를 사용할 때는 식별자와 자료형을 생략해도 무방하지만,

파일이 많아질수록 모호한 경우가 생겨 언리얼에서 에러를 발생시킬 수 있다.

그러므로 길이가 길더라도 자료형과 식별자는 꼭 포함시켜 주도록 한다.

 

 

생성자에서 ConstructorHelpers의 FObjectFinder를 이용한 방법

ConstructorHelpers

- #include "UObject/ConstructorHelpers.h" 헤더에 포함되어 있다.

- 생성자에서만 사용 가능하며,

- 에디터 상에서 미리 에셋을 불러놓기 위해 사용한다.

- 컴파일이 완료되면 에디터 상에서 Helpers에 의해 기본 값이 변경된다.

- 적용을 위해서는 에디터에서 Default 값으로 변경을 해주어야 할 수도 있다.

ConstructorHelpers::FObjectFinder<Type> name(AssetPath);
ConstructorHelpers::FObjectFinder<UStaticMesh> mesh(L"StaticMesh'/Game/Meshes/M_Cube.M_Cube'");

if (mesh.Succeeded())	// 정상적으로 불러들였는지 확인
{
	Mesh->SetStaticMesh(mesh.Object);
}

에디터 내에서 Default 값이 설정된다.
기본 값으로 변경하면 지정한 Mesh로 설정된다.

 

 

 

게임 중간에 생성자가 아닌 곳에서 동적으로 불러오는 방법

StaticLoadObject(UClass::StaticClass(), nullptr, AssetPath);

StaticLoadObject

- UObject를 상속받는다면 사용할 수 있다.

- 생성자에서 사용하지 않는다.

- 게임 중간에 동적으로 불러올 수 있다.

UObject를 상속받는 모든 클래스는 UClass를 반환하는 StaticClass()가있기 때문에 쉽게 형변환하여 사용할 수 있다.

#include "Materials/MaterialInstanceConstant.h"
#include "Materials/MaterialInstanceDynamic.h"

UObject* obj = StaticLoadObject(UMaterialInstanceConstant::StaticClass(), nullptr, L"MaterialInstanceConstant'/Game/Materials/M_Mesh_Inst.M_Mesh_Inst'");
UMaterialInstanceConstant* material = Cast<UMaterialInstanceConstant>(obj);

Material = UMaterialInstanceDynamic::Create(material, this);
Mesh->SetMaterial(0, Material);

위 코드는 Material을 지정하는 코드를 간략화한 것이다.

 

 

 

 

블루프린트 클래스를 가져오는 방법

Blueprint 에셋을 가져오는 방법은 다른 에셋을 가져오는 방법과 한 끗 차이로 다르다.

C++ 클래스를 가져오는 것은 생성자에서 ConstructorHelpers::FClassFinder를 활용하면 간단하게 불러올 수 있지만,

블루프린트 클래스 타입을 불러올 때는 식별자에 '_C'를 꼭 붙여줘야 정상적으로 불러올 수 있다.

ConstructorHelpers::FClassFinder<APawn> pawn(L"Blueprint'/Game/Blueprints///BP_CPlayer.BP_CPlayer_C'");

 

 

반응형