That looks roughly correct, however you should not store a pointer to Steam callback information; it has a very small lifetime and may not exist outside of the function call. You will need to make a copy of that struct and then copy that copy again into the ExecuteNextTick lamda.
Your example should look something like this:
void FSteamworksCallbackAsync::OnSteamOverlayActive(GameOverlayActivated_t *CallbackData)
{
check(CallbackData != nullptr);
GameOverlayActivated_t DataCopy = *CallbackData;
LiveSteamSubsystem->ExecuteNextTick([DataCopy, this]() {
bool IsOverlayActive = (DataCopy.m_bActive != 0);
if (MusicalRangeGameInstance != nullptr)
{
MusicalRangeGameInstance->OnSteamOverlayIsActive(IsOverlayActive);
}
});
}
Or, even better, if you only care about that bool, it’s much more efficient to copy only that value, like this:
void FSteamworksCallbackAsync::OnSteamOverlayActive(GameOverlayActivated_t *CallbackData)
{
check(CallbackData != nullptr);
const bool IsOverlayActive = (CallbackData->m_bActive != 0);
LiveSteamSubsystem->ExecuteNextTick([IsOverlayActive, this]() {
if (MusicalRangeGameInstance != nullptr)
{
MusicalRangeGameInstance->OnSteamOverlayIsActive(IsOverlayActive);
}
});
}