I solved my problem. I should use InitializeComponent and UninitializeComponent. InitializeComponent is called when a Blueprint containing the component is called, or when play is started. UninitializeComponent is called when the blueprint is closed or when play is halted. That works for me. I had to make one more change: I had to delete my_connection;
not delete[] my_connection;
.
To get to this solution I made a MySceneComponent class in a separate project (no plugins). This overrode as many lifecycle-related functions as I could identify but did nothing other than call the super and print a log statement. My logs during testing are below.
-
When debugging the project in editor (from XCode), and I have a level (not default level) with an instance of MyActor with its attached MySceneComponent instance, the scene component constructor is called:
[ 0]LogMySceneComponent: UMySceneComponent::UMySceneComponent()
-
When loading up the level containing the actor (containing the scene component):
[445]LogMySceneComponent: UMySceneComponent::UMySceneComponent()
[445]LogMySceneComponent: UMySceneComponent::PostLoad()
[445]LogMySceneComponent: UMySceneComponent::OnRegister()
[snip map and lighting]
[445]LogMySceneComponent: UMySceneComponent::OnUnregister()
[445]LogMySceneComponent: UMySceneComponent::OnRegister()
-
When I open the actor blueprint:
[730]LogMySceneComponent: UMySceneComponent::UMySceneComponent()
[730]LogMySceneComponent: UMySceneComponent::PostLoad()
[730]LogMySceneComponent: UMySceneComponent::OnComponentCreated()
[730]LogMySceneComponent: UMySceneComponent::OnRegister()
[730]LogMySceneComponent: UMySceneComponent::ReceiveInitializeComponent()
[730]LogMySceneComponent: UMySceneComponent::InitializeComponent()
[730]LogMySceneComponent: UMySceneComponent::ReceiveUninitializeComponent()
[730]LogMySceneComponent: UMySceneComponent::UninitializeComponent()
[730]LogMySceneComponent: UMySceneComponent::OnUnregister()
[730]LogMySceneComponent: UMySceneComponent::OnComponentDestroyed()
[730]LogMySceneComponent: UMySceneComponent::DestroyComponent()
[730]LogMySceneComponent: UMySceneComponent::UMySceneComponent()
[730]LogMySceneComponent: UMySceneComponent::PostLoad()
[730]LogMySceneComponent: UMySceneComponent::OnComponentCreated()
[730]LogMySceneComponent: UMySceneComponent::OnRegister()
[730]LogMySceneComponent: UMySceneComponent::ReceiveInitializeComponent()
[730]LogMySceneComponent: UMySceneComponent::InitializeComponent()
[371]LogMySceneComponent: UMySceneComponent::BeginDestroy()
[371]LogMySceneComponent: UMySceneComponent::OnUnregister()
[371]LogMySceneComponent: UMySceneComponent::BeginDestroy()
-
When I close the actor blueprint:
[771]LogMySceneComponent: UMySceneComponent::ReceiveUninitializeComponent()
[771]LogMySceneComponent: UMySceneComponent::UninitializeComponent()
[771]LogMySceneComponent: UMySceneComponent::OnUnregister()
[771]LogMySceneComponent: UMySceneComponent::OnComponentDestroyed()
-
When I play in editor:
[ 77]LogMySceneComponent: UMySceneComponent::UMySceneComponent()
[ 77]LogMySceneComponent: UMySceneComponent::PostLoad()
[ 77]LogMySceneComponent: UMySceneComponent::OnRegister()
[ 77]LogMySceneComponent: UMySceneComponent::ReceiveInitializeComponent()
[ 77]LogMySceneComponent: UMySceneComponent::InitializeComponent()
[ 77]LogMyActor: AMyActor::BeginPlay()
[ 77]LogMyActor: AMyActor::Tick(0.134228)
[ 77]LogMySceneComponent: UMySceneComponent::TickComponent(0.134228)
-
When I stop playing in editor:
[153]LogMyActor: AMyActor::Tick(0.026880)
[153]LogMySceneComponent: UMySceneComponent::TickComponent(0.026880)
[153]LogMySceneComponent: UMySceneComponent::ReceiveUninitializeComponent()
[153]LogMySceneComponent: UMySceneComponent::UninitializeComponent()
[153]LogMySceneComponent: UMySceneComponent::OnUnregister()
[153]LogMySceneComponent: UMySceneComponent::BeginDestroy()
[153]LogMySceneComponent: UMySceneComponent::BeginDestroy()
[153]LogMySceneComponent: UMySceneComponent::BeginDestroy()
[153]LogMySceneComponent: UMySceneComponent::BeginDestroy()
[153]LogMySceneComponent: UMySceneComponent::BeginDestroy()
[153]LogMySceneComponent: UMySceneComponent::BeginDestroy()
[153]LogMySceneComponent: UMySceneComponent::BeginDestroy()
[153]LogMySceneComponent: UMySceneComponent::~UMySceneComponent()
[153]LogMySceneComponent: UMySceneComponent::~UMySceneComponent()
[153]LogMySceneComponent: UMySceneComponent::~UMySceneComponent()
[153]LogMySceneComponent: UMySceneComponent::~UMySceneComponent()
[153]LogMySceneComponent: UMySceneComponent::~UMySceneComponent()
[153]LogMySceneComponent: UMySceneComponent::~UMySceneComponent()
[153]LogMySceneComponent: UMySceneComponent::~UMySceneComponent()
-
When I move the actor in editor:
[380]LogMySceneComponent: UMySceneComponent::OnUnregister()
[380]LogMySceneComponent: UMySceneComponent::OnRegister()
[380]LogMySceneComponent: UMySceneComponent::OnUnregister()
[380]LogMySceneComponent: UMySceneComponent::OnComponentDestroyed()
[380]LogMySceneComponent: UMySceneComponent::DestroyComponent()
[380]LogMySceneComponent: UMySceneComponent::UMySceneComponent()
[380]LogMySceneComponent: UMySceneComponent::PostLoad()
[380]LogMySceneComponent: UMySceneComponent::OnComponentCreated()
[380]LogMySceneComponent: UMySceneComponent::OnRegister()
-
When I save the level:
[329]LogMySceneComponent: UMySceneComponent::BeginDestroy()
[329]LogMySceneComponent: UMySceneComponent::~UMySceneComponent()
-
When I close the editor:
[677]LogMySceneComponent: UMySceneComponent::BeginDestroy()
[677]LogMySceneComponent: UMySceneComponent::BeginDestroy()
[677]LogMySceneComponent: UMySceneComponent::OnUnregister()
[677]LogMySceneComponent: UMySceneComponent::OnComponentDestroyed()
[677]LogMySceneComponent: UMySceneComponent::BeginDestroy()
[677]LogMySceneComponent: UMySceneComponent::~UMySceneComponent()
[677]LogMySceneComponent: UMySceneComponent::~UMySceneComponent()
[677]LogMySceneComponent: UMySceneComponent::~UMySceneComponent()