Use some good old print to log, in each begin play get actor name (self) print it out, and some message.
I see you are using breakpoints, and with breakpoints there is a problem. You put those in editor (source code) copy of actor, it is very easy to have that breakpoint in copy of actor that is not used in level. So use prints, to see if they are really not used, and to see order of begin play.
Yes whole loading order stuff is quite messed up, in unreal. However do not blame Epic, its mess from oop side more than epic fault.
However it could be nice to have real begin play.
This may have some clues (chat GPT aka yellow rubber duck) take on this problem:
In Unreal Engine, if you’re streaming in a level and actors inside it don’t have BeginPlay()
triggered, it’s likely due to one of the following issues:
Checklist for BeginPlay
to fire:
- Level is loaded but not made visible
BeginPlay
only fires when the streaming level becomes both loaded and visible.- Fix: Make sure you’re using
SetShouldBeVisible(true)
orLoadStreamLevel
withbMakeVisibleAfterLoad = true
.
- Actors are not considered part of gameplay
- Only actors that are “Actors in Game” will trigger
BeginPlay
. Actors marked as Editor-only or not placed in the persistent world might not trigger gameplay events. - Fix: Ensure your actor is not marked as
IsEditorOnly()
or part of a construction script-only logic.
- Streaming level is not loaded in the correct World context
- If you’re loading a level in the editor context (e.g., with the wrong world pointer or from an editor utility), then gameplay events like
BeginPlay
won’t fire. - Fix: Make sure you’re loading levels during actual gameplay, not in the editor or via
EditorUtility
.
- The level was already loaded and made visible before the game started
- If a streaming level is already loaded and visible at the start of the game, actors in that level may have already triggered
BeginPlay
before your logic runs. - Fix: Check the load order and ensure you’re observing the behavior immediately after the streaming.
- The level is not marked as a streaming level (or not properly referenced)
- If a level is not actually loaded as a sublevel in the World Composition or World Partition setup, then streaming behavior may not behave as expected.
Common Blueprint fix:
If you’re doing this in Blueprint, double-check the level streaming node:
- Use Load Stream Level.
- Check
Make Visible After Load = true
. - Optionally, wait for the Level Loaded and Level Shown output pins before proceeding.
ps.
Double check what ajj produced, they tend to make up “facts”.