Download

Get all items(Actors) from LevelStreaming

I can’t find a way to list all the Actors inside sublevel (LevelStreaming). For an enumeration, I try to use TActorIterator, but its constructor accepts a reference to UWorld, it does not accept a reference to ULevelStreaming, since they both inherit from UObject. I can list all the Actors from the world like this:



        UWorld* world = GetWorld();
        TActorIterator<AActor> Iterator(world, AActor::StaticClass());
        for (; Iterator; ++Iterator)
        {
            AActor* Actor = Cast<AActor>(*Iterator);
            GEngine->AddOnScreenDebugMessage(-1, 30.f, FColor::Yellow, Actor->GetFName().ToString());  //Print name of the Actor
             //another code
        }
    

This works, but I only get objects from the main map (Persistent Level), and I have no idea how to get a list of all the Actors from the additional levels that I add as ULevelStreaming.



    UWorld* world = GetWorld();
    auto levels = world->GetStreamingLevels();
    for (auto level : levels) {
        ULevelStreaming* currentLevel = Cast<ULevelStreaming>(level);
        TActorIterator<AActor> It(currentLevel, AActor::StaticClass()); //Here is compiler error with TActorIterator's constructor
        for (; It; ++It)
        {
            AActor* Actor = Cast<AActor>(*It);
            GEngine->AddOnScreenDebugMessage(-1, 30.f, FColor::Yellow, Actor->GetFName().ToString());
        }
    }


Got it, i need to get all Actors from ULevel, not LevelStreaming. Like this:



      UWorld* world = GetWorld();
      auto StreamingLevels = world->GetStreamingLevels();
      for (UStreamingLevel* StreamingLevel : StreamingLevels ) {
            ULevel* level = StreamingLevel->GetLoadedLevel();
            if(!level) continue;
            for (AActor* Actor : level->Actors)
                    { // Actor action }
}


And of course, it’s need to be loaded before.