본문 바로가기
Unreal/Tool

[Unreal] 에디트 상황에서 컴포넌트 생성/해제 콜백

by 카피마스터 2024. 3. 24.

ex) ObstacleComponent 라는 컴포넌트가 있고

이 컴포넌트안의 Collider객체를 컴포넌트가 생성될때 매니저에 등록하고 제거될때 빠져야 하는 상황

 

OnReigster()에서 객체가 생성되어있는지 체크하고 객체를 생성

OnComponentDestroyed() 에서 객체를 해제

 

* OnRegister()는 Actor::PostEditChangeProperty()에서 호출되기 때문에 자주 호출됨

객체를 생성해야 한다면 객체의 존재여부를 체크해서 한번만 생성되도록 처리

 

* OnUnregister()의 경우에도 Actor::PreEditChange()에서 호출되기 때문에 자주 호출됨

OnRegister / OnUnregister의 조합으로 사용하는 경우 자주 등록/해제 처리가 발생

 

* OnComponentCreated()는 액터를 월드에 배치하고 에디터를 재시작하면 호출되지 않아서 사용할수 없음

 

void UPFObstacleComponent::OnRegister()
{
	Super::OnRegister();

	// 아직 생성되지 않았다면 생성후 매니저로 등록
	if (nullptr == Collider)
	{
		Collider = new MBoxCollider();

		UPathFinderSubsystem* subSystem = GEditor->GetEditorSubsystem<UPathFinderSubsystem>();
		subSystem->AddObstacleComponent(this);
	}
}


void UPFObstacleComponent::OnComponentDestroyed(bool bDestroyingHierarchy)
{
	// 등록된 Collider가 있다면 해제 처리
	if (nullptr != Collider)
	{
		UPathFinderSubsystem* subSystem = GEditor->GetEditorSubsystem<UPathFinderSubsystem>();
		subSystem->RemoveObstacleComponent(this);

		delete Collider;
		Collider = nullptr;
	}

	Super::OnComponentDestroyed(bDestroyingHierarchy);
}