Unreal Engine/C++

[Unreal Engine 4 C++] 컴포넌트 생성(CreateDefaultSubobject, NewObject)

한돌이 2020. 11. 25. 01:32

 컴포넌트를 생성할때 CreateDefaultSubobject를 사용했었습니다. 그러나 CreateDefaultSubobject는 생성자에서만 사용할 수 있습니다.

 검의 양끝에 BoxComponent를 부착하고 이 두 BoxComponent 사이에 일정한 간격으로 특정 개수의 BoxComponent를 부착하는 기능을 구현하려고 할 때 평소에 사용하던 CreateDefaultSubobject는 사용할 수 없었습니다.

검의 양끝에 있는 BoxComponent

 이를 구현하기 위해서는 게임을 시작할 때 또는 게임을 플레이 중일때 BoxComponent를 생성하여 부착해야 했습니다.

블루프린트에 존재하는 BoxCollision을 추가하는 노드

 블루프린트에는 BoxCollision을 추가하는 노드가 블루프린트 전용으로 존재하였습니다. 하지만 C++로 구현할 계획이기에 해결하는데 오랜시간이 걸렸습니다.

 BeginPlay함수에서 BoxComponent를 생성하여 액터에 부착하겠습니다.

 

 생성자 이외의 공간에서 컴포넌트를 생성하기 위해서는 NewObject를 사용합니다.

docs.unrealengine.com/en-US/API/Runtime/CoreUObject/UObject/NewObject/3/index.html

 

NewObject

Convenience template for constructing a gameplay object

docs.unrealengine.com

template<class T>
T * NewObject
(
    UObject * Outer,
    const UClass * Class,
    FName Name,
    EObjectFlags Flags,
    UObject * Template,
    bool bCopyTransientsFromClassDefaults,
    FObjectInstancingGraph * InInstanceGraph
)

<함수 원형>

 매개변수 중 Outer, Class, Name만 사용합니다.

Outer NewObject로 생성되는 컴포넌트를 붙일 오브젝트입니다. 간단하게 this를 입력하면 됩니다.
Class NewObject로 생성할 컴포넌트의 Static클래스입니다.
Name NewObject로 생성할 컴포넌트에 적용할 이름입니다.
UBoxComponent* NewTraceCollision = NewObject<UBoxComponent>(this, UBoxComponent::StaticClass(), FName(*Name));
if (NewTraceCollision != nullptr)
{
	NewTraceCollision->RegisterComponent();
	NewTraceCollision->AttachTo(Root);
	NewTraceCollision->SetRelativeTransform(CalculateTraceCollisionSpawnOffset(index));
	TraceCollisions.Add(NewTraceCollision);
}

<구현 예시>

 

 NewObject로 컴포넌트를 생성하고 이를 RegisterComponent함수로 등록합니다.

docs.unrealengine.com/en-US/API/Runtime/Engine/Components/UActorComponent/RegisterComponent/index.html

 

UActorComponent::RegisterComponent

Register this component, creating any rendering/physics state.

docs.unrealengine.com

 

 이제 이를 바탕으로 BeginPlay또는 다른 함수에서 구현하고 하는 기능을 실행하면 된다.

 

BeginPlay에서 실행한 결과


참고

answers.unrealengine.com/questions/286630/component-added-at-runtime-doesnt-have-beginplay-c.html

cafe.naver.com/unrealenginekr/15390