BeginPlay
프로젝트 중 상호작용 가능한 Actor에 WidgetComponent를 넣어 놨는데 해당 위젯이 보이지 않는 현상이 발견되어 많은 시간을 고민했다.
기존에도 했던 방식인데 다른 Actor에서는 동일한 Widget을 써도 올바르게 동작하고 Root로 설정한 Mesh의 scale 문제인지도 체크해 봤다.
계속 찾아보다 다른 점 하나를 발견했다.
다른 점은 BeginPlay에서 Super의 BeginPlay를 호출하지 않은 것이었다.
Super인 AActor의 BeginPlay에서는 Component를 초기화하는 부분이 있다.
//...
for (UActorComponent* Component : Components)
{
// bHasBegunPlay will be true for the component if the component was renamed and moved to a new outer during initialization
if (Component->IsRegistered() && !Component->HasBegunPlay())
{
Component->RegisterAllComponentTickFunctions(true);
Component->BeginPlay();
ensureMsgf(Component->HasBegunPlay(), TEXT("Failed to route BeginPlay (%s)"), *Component->GetFullName());
}
else
{
// When an Actor begins play we expect only the not bAutoRegister false components to not be registered
//check(!Component->bAutoRegister);
}
}
//..
이 부분이 실행되지 않아 WidgetComponent가 초기화되지 않은 것이다.
WidgetComponent 이외 다른 Component들은 모두 올바르게 동작하여 의심하지 못했다.
Component마다 BeginPlay에서 초기화가 필요한 것도 있고 아닌 것도 있는 듯하다.