컴포넌트를 생성할때 CreateDefaultSubobject를 사용했었습니다. 그러나 CreateDefaultSubobject는 생성자에서만 사용할 수 있습니다.
검의 양끝에 BoxComponent를 부착하고 이 두 BoxComponent 사이에 일정한 간격으로 특정 개수의 BoxComponent를 부착하는 기능을 구현하려고 할 때 평소에 사용하던 CreateDefaultSubobject는 사용할 수 없었습니다.
이를 구현하기 위해서는 게임을 시작할 때 또는 게임을 플레이 중일때 BoxComponent를 생성하여 부착해야 했습니다.
블루프린트에는 BoxCollision을 추가하는 노드가 블루프린트 전용으로 존재하였습니다. 하지만 C++로 구현할 계획이기에 해결하는데 오랜시간이 걸렸습니다.
BeginPlay함수에서 BoxComponent를 생성하여 액터에 부착하겠습니다.
생성자 이외의 공간에서 컴포넌트를 생성하기 위해서는 NewObject를 사용합니다.
docs.unrealengine.com/en-US/API/Runtime/CoreUObject/UObject/NewObject/3/index.html
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함수로 등록합니다.
이제 이를 바탕으로 BeginPlay또는 다른 함수에서 구현하고 하는 기능을 실행하면 된다.
참고
answers.unrealengine.com/questions/286630/component-added-at-runtime-doesnt-have-beginplay-c.html
'Unreal Engine > C++' 카테고리의 다른 글
[Unreal Engine 4 C++] 비헤이비어 트리 관련 기능 모듈 추가 (0) | 2020.12.09 |
---|---|
[Unreal Engine 4 C++] 내비게이션 사용 시 모듈 추가 (0) | 2020.12.09 |
[Unreal Engine 4 C++] class 키워드와 전방선언 (0) | 2020.11.08 |
[Unreal Engine 4 C++] 범위 기반 For 루프 (0) | 2020.11.04 |
[Unreal Engine 4 C++] 유효성 검사, nullptr과 IsValid 그리고 Pending Kill (0) | 2020.10.30 |