OnConstruction not called on game start

Our team has been working with 4.3 for a while now and we have just switched to 4.6, finally.

We have created a placeable pickup which changes its appearance based on some values inside the GameMode. GameMode doesn’t exist in the Editor - so we have been forced to display a generic pickup shape until the game or PIE session starts, then the GameMode becomes available again, pickups get recreated and set themselves up in OnConstruction.

This worked fine until we migrated to 4.6, now the game start does not invoke OnConstruction anymore, while class constructors still get called (from ULevel::Serialize). If the same pickup is spawned from blueprints, OnConstruction always executes. It’s funny because there is a ton of init functions in Actor.h (like PostActorCreated), yet OnConstruction does not work consistently. Just to illustrate, this is a rather small sample of available init functions from AActor:

  • PostLoad/PostActorCreated - Do any setup of the actor required for construction. PostLoad for serialized actors, PostActorCreated for spawned
  • OnConstruction - The construction of the actor, this is where Blueprint actors have their components created and blueprint variables are initialized
  • PreInitializeComponents - Called before InitializeComponent is called on the actor’s components
  • PostInitializeComponents - Called after the actor’s components have been initialized
  • BeginPlay - Called when the level is started

Which function should I override instead of OnConstruction to make use of GameMode?
What is the correct way of getting GameMode on game start and is it a safe practice in a single player game?

P.S. I have been using BeginPlay ever since without much trouble, but wanted to clarify if it will always work as I want it to.

OnConstruction is only called once per object. In the case of a placed object in the scene that is at placement time or when you make modifications in the editor. This allows you to do any automation while editing actors (procedural geometry based on parameters or position for example).

If you want your code to run at game start, use BeginPlay or PostInitializeComponents.

For people like me, who have missed an extremely obvious piece on actor initialization and more:
ActorLifecycle

According to https://answers.unrealengine.com/questions/165787/view.html , OnConstruction is not (only) called once per object, but also on every property change.