Lyra and SkyCreator crash because they keep Ticking after shutdown

We’re noticing our game has started to crash when we click the X button or click our Quit Game button (which simply calls Quit Game in blueprint).

Which component crashes (thus far I’ve personally seen Lyra & SkyCreator) depends on whether we’re in our lobby UI or playing on a level, but it’s crazy we’re getting the crash. The component’s Tick() is doing stuff even after player controllers or the GameClientViewport have been deleted, and we’re dying because these plugins don’t null-check some components. But they probably shouldn’t have to be null-checking there – it’s reasonable for them to expect to have player controllers or a game client viewport when they tick.

These are not our own plugins. For example, Lyra is made by UE’s team if I understand right, or something adjacent to that. But all the same, they keep on Ticking after Quit Game has started shutting the world down and deleting stuff, and that’s crashing us every time the game closes.

Is there something special we’re supposed to do now in 5.8?

  • When we call Quit Game, are we supposed to call an additional step to halt all Ticks (and if so, why doesn’t the engine do so)?
  • Or do we need to wait for these components to release updates to fix themselves?
  • Or must we fix them ourselves? We’d like to avoid this because that makes later updates harder – but if necessary, how do we fix it?

that is a teardown ordering crash. QuitGame drops the world into teardown mid frame while components still hold live timer handles and delegate bindings, the next Tick fires into half destroyed state and you get the access violation. skycreator and lyra components are just the ones with aggressive tick loops, anything wired the same way will do it.

in your own components: EndPlay should SetComponentTickEnabled(false), clear every timer handle you own with ClearAndInvalidateTimerHandle, and unbind from any subsystem delegates. in Tick guard early: if (!GetWorld() || GetWorld()->bIsTearingDown) return;

for the quit path itself: RequestExit is instant and does not wait for the frame to end. smoother is disabling the ticking sources first, then one frame later call ConsoleCommand(“quit”) on the player controller. if the crash callstack shows a timer proc or TickComponent touching a bad Outer you have confirmed the ordering issue.

worth reporting to the skycreator author too, that endplay hygiene belongs in their component code.