Child maps

Because many objects on my maps need to be enabled/disabled based on the current game mode, I suggest adding child maps (or map instances), which inherit any actor changes made to their parent maps, allowing one parent map to be used for layout and child maps to be used for game mode specific stuff, such as collectables and race checkpoints. In Unity, I would simply parent all objects necessary for a game mode to a single object and enable/disable that to toggle the entire mode’s content at once, leaving them disabled by default. UE4’s hierarchy folders don’t have that level of realtime utility.

Incidentally, I’m interested in any alternative methods for enabling game mode specific content that may be currently available.

Without knowing too much about what you’re trying to do, you may want to look at streaming levels. It sounds like you may be able to make your core map, then have your game code stream in sublevels that contain the gamemode-specific content.

I’m talking about adding actual actors: collectables, race checkpoints, doors, and other game mode specific actors in specific locations throughout the level that only exist in one mode or another. These are not things that can be done with level streaming, because there’s no way to tell where they will be streamed into the level.

Maybe I am misunderstanding what you are saying, but loading a streaming level containing actors will stream those actors in at the exact locations they are placed. Using level streaming for what you want to do seems totally doable.

It’s only doable if you know where to put the actors in the first place. For example, if you want a collectable to be on a mountain that exists in one map, you’d need to place a dummy object, copy its location axes individually, and paste them into the streamed map’s collectable transform. That’s simply not viable if you have more than a few game mode specific objects. For example, Banjo-Kazooie levels each contain 100 notes. If one wanted to make a 100-collectable game mode, that would require copying and pasting 300 separate values, and every time you wanted to make modifications to the location of the collectable, you’d have to go back and forth between the main and streamed levels placing dummy objects in the main level to find out where they should go and the copying and pasting the new axis values into the streamed level.

In my case, each map contains 33 collectables that are needed for the time attack game mode and anywhere between 50 and 100 for the sandbox game mode. Then, there’s race mode specific checkpoints and boosters. And, there’s a roller coaster track with boosters and additive visual elements for the coaster mode. And, another track for the tour mode. And, that’s only the modes for a single map! Iteration (or initial placement, for that matter) would be practically impossible if I couldn’t see the level geometry while I was placing all of that stuff for at least five separate game modes per map. Streaming from a separate level would only be viable if we could see another level overlaid on the to-be-streamed level we’re working on.

Why can’t you use the Blueprint Construction Script? It can randomly distribute objects all around your levels. From there you can fine tune that control using textures or more blueprint stuff. You can control how far apart the objects are etc., make sure they’re always on the road using a spline or a texture - for example.

Objects aren’t (and shouldn’t be, in this case) randomly placed in the least; every single one is placed precisely. And, a construction script doesn’t make it any easier to enable or disable sets of objects based on game mode, which is the whole point. Individual objects should never dictate when they are needed; that is the job of the systems that need them, such as the game mode.

That’s exactly what level streaming gets you. If you go to Window->Levels you can add sub levels to your scene. Select the new level in the window and hit Make Current. Then you can select actors in the Outliner, right-click on them and select Levels->Move Selection to Current Level. You can toggle the visibility of each of the sublevels in the Levels menu by toggling the eye icon.

Whoa. I have seriously underestimated level streaming. Because I’ve only heard of the feature being used for loading contiguous levels, I was under the impression that they required separate levels rather than sub-levels. Well, thank you for the swift education. That certainly solves the problem. And, my apologies for not looking deeper into streaming at the first suggestion.