How to create & destroy members of Component in accordance with lifecycle?

Hello,

I have a project plugin for connecting to a data streaming service (running locally). My plugin exposes a class like

UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class MY_API UMyComponent : public USceneComponent
{
    [...]
    protected:
        my_service::a_connection * my_connection;
}

I would like to create a connection to the service that begins during play and dies at the end of play. The creation of the service will create a private member variable in the component.

my_connection = new my_service::a_connection(connection_info);

The my_service API is designed to terminate the connection when the instance of a_connection is destroyed.

delete[] my_connection;  // internally as my_service::a_connection{ ~a_connection() {destroy_connection();} }

Questions:

  1. What is the correct function in which I should create a connection that only lives during play?
  2. What is the correct function to destroy the connection in a way that is symmetric with the answer to the first question?

Currently I am creating the connection in InitializeComponent and destroying it in OnComponentDestroyed but this is not working out for me. InitializeComponent seems to be called whenever the Actor is spawned, and that includes opening up the Actor’s blueprint. OnComponentDestroyed is not called when Play-In-Editor (or PlayInVR) is terminated, even though InitializeComponent is called when play is started. While testing and editing blueprints, I’m ending up with many connections to the service that are not getting destroyed, even if only one of them actually streams data.

Thank you.

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.

  1. 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()

  2. 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()

  3. 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()

  4. When I close the actor blueprint:

    [771]LogMySceneComponent: UMySceneComponent::ReceiveUninitializeComponent()

    [771]LogMySceneComponent: UMySceneComponent::UninitializeComponent()

    [771]LogMySceneComponent: UMySceneComponent::OnUnregister()

    [771]LogMySceneComponent: UMySceneComponent::OnComponentDestroyed()

  5. 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)

  6. 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()

  7. 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()

  8. When I save the level:

    [329]LogMySceneComponent: UMySceneComponent::BeginDestroy()

    [329]LogMySceneComponent: UMySceneComponent::~UMySceneComponent()

  9. 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()

This is an awesome answer and should be included in the official doc or the UE4 wiki. Thanks for providing it.