New World Building Features | Inside Unreal

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
[MUSIC PLAYING] [WIND WHISTLING] [MUSIC SWELLS] AMANDA: Hey, everyone! Meet The Ancient One, a 50-million-polygon character imagined by Aaron Sims Creative for our latest Unreal Engine 5 demo, Valley of the Ancient! With a reputation for creating incredible creatures, learn more about The Ancient One's development, and how ASC pushed the animation tools to the limits, animating them entirely in-engine. And for the educators in the audience, we've created a brand new guide to help you learn everything you want to know about Unreal Engine 5 Early Access, including when to start incorporating it into your classroom. Download it via the feed today! Sweden-based studio Experiment 101's first title, Biomutant, takes a unique approach to the post-apocalyptic genre--creating a "weird, but in a good way" action RPG. Discover more about the relatively small team's experience as a new studio shipping their first game, and how they developed such a massive world. And now over to this week's top karma earners. Many thanks to: Everynone, CtnDev, ClockworkOcean, mightyenigma, chrudimer, L1z4rD89, LogierJan, Mahoukyou, Jacky, and Zegi_assets. Master physics-defying magic in Cypher Creations' action-puzzler Strawhart--go on a quest to start a brand-new cult and resurrect an ancient evil in the realm of Acre. Wishlist Strawhart on Steam. Once you've finished taking over the world, pop into this lovely kitchen created by Justin Jager for a snack. Built to experiment with UE5 and Lumen, they've leveraged Quixel Megascans, in addition to their own models. Head over to Justin's ArtStation to see more of their work! Set sail in The Black Swan, a short film by Gianpietro Fabre inspired by their work with Oslo-based production company Bacon--and Master & Commander. Watch the full short and see more of Gianpietro's work on their ArtStation page. Thanks for watching this week's News and Community Spotlight! VICTOR: Hi, everyone and welcome to Inside Unreal, a weekly show where we learn, explore, and celebrate everything Unreal. I'm your host, Victor Brodin. And today I would like to introduce-- once again, thank you for being here-- Chance Ivey, senior technical product designer. CHANCE: Glad to be back. Thanks for having me, Victor. Excited. VICTOR: Awesome. And we are going to talk about new world-building features today. And to help us in this endeavor, we invited Jean-Francois Dube. Welcome to the show. Principal programmer, got to make sure I mention that. JEAN-FRANCOIS: Happy to be here. CHANCE: Now we're super glad to have you. Yeah, this is one of the workflow tools that we employed for Valley of the Ancient in Unreal Engine 5 that I think had-- I guess it required us to change the way we thought quite a bit whenever we came to approach world-building in general. So I'm really excited today to hear more about some of the thinking behind it and have you share a lot of the details about how it all works, and what all is in it with the community. I think you've got some slides you wanted to walk through for starters? JEAN-FRANCOIS: Yes. Yes, I have some slides, so-- CHANCE: Great. JEAN-FRANCOIS: --I'll start with that. CHANCE: Great. All right. JEAN-FRANCOIS: Are they showing up? VICTOR: Not just yet. Houston, can we get the sides up, please? You're good to go. CHANCE: Thank you, Houston. JEAN-FRANCOIS: Yes, thank you. Yes, so I'm going to start off talking about what are the motivations between doing all these changes. So just a little bit of history. In UE4, Actors are saved in a specific level, right? So a world is composed of a list of sublevels in a persistent level. And the Engine can stream in and out of the sublevels, and the persistent level is always loaded. Moving Actors between levels is a manual operation, so the user has to keep track of the current level. You have to select the target level you want to move your Actors in, right click on the Actors, select Move To Current Level. And it's essentially doing a cut-and-paste, so it can lead to broken references and all kinds of problems. And just moving Actors around in space is not enough because, it's just growing the level downs, right, the current level downs. It's not moving Actors between the [AUDIO OUT]. So this is one thing that we wanted to fix. And then each Actor is saved in its own file, its own level file, I mean. So if I work in a specific level and I'm changing some actors, and let's say that Chance is [AUDIO OUT] I think [AUDIO OUT] he wants to change some other Actors that are in the same level, but maybe they are hundreds meters away. So we're not competing for the same things. Even with that Chance cannot work because I have to level file and check out. So he has to contact me and say hey, when are you going to release the file? And I might say 10 minutes, and then release it somewhere after lunch. CHANCE: Yeah, that never happens. JEAN-FRANCOIS: No, no, exactly. And then you can network in the meantime, because you have to get my changes before. So since we don't support merging map files, you have to wait. So you have to figure out, work on something else. So it's one of the big problems. So to overcome this, the user would make changes to how they organize their levels in the editor. So making smaller level sizes or making layers, like a sound layer, a gameplay layer, lighting layers. But one problem with that is that it also affects the cook build, right? So when going into a cook build, you still have all these layers. All these levels to stream, and it's not ideal for streaming performances. So what we really wanted to do with World Partition was to break how we organize the data in the editor, and how it is organized in a cook field. CHANCE: Right. Real quick, on that note. Yeah, you talk about building things in layers so people can work better together. But still it's this finite bucket of all those things inside that layer, right? And that's things need to talk between those layers, it's really tricky. You still have to think really hard about where you put things. You break things up a little bit by discipline type, but still spatially it might be similar to where something else is, and without having that other level loaded you know-- and you still have a finite set of bounds as to how far out those things go. So building further out this way, there might be not items in the layers below that. You still have to have the holistic view of everything else that everybody is still working on in those big, binary blobs, right? JEAN-FRANCOIS: Yes. So it forces teams to have some level of organization to make sure that everything is at least [AUDIO OUT] fine-grained enough so people can work, but it doesn't have that much impact on the streaming performance at runtime. CHANCE: Right. Right. Yeah, it just loads the whole thing in anyway, just clump. JEAN-FRANCOIS: Right. Yeah, exactly. So with that in mind there are four goals to World Partition. Is to first reduce contention, then completely remove the manual level management, and to allow tweaking of the runtime levels topology. So make a complete distinction between editor and the runtime levels. And also to add automatic distance based level streaming. So you don't have to put level streaming volumes, or have some kind of-- have to write code to stream depending on some conditions. CHANCE: Right. The user enters the elevator, and so you're streaming all the stuff behind the elevator out and all the new stuff in this new location, right? It's not something you have to think about the same way anymore. JEAN-FRANCOIS: Yeah, exactly. But we'll have some-- some things are in the works, to handle this specific case. Yeah, 99% of the time, what you want is distance based streaming. Yeah. So the first thing to that we want to address is file contention. So that's why we introduced one file per Actor. So that's a separate feature. So it can be used without the word partition, but World Partition cannot be used without one file per Actor. CHANCE: Got it. Oh, so you're saying that one file per Actor can be used in existing non-World Partition maps in UE5? JEAN-FRANCOIS: Yes. CHANCE: Great. OK, cool. JEAN-FRANCOIS: So it can be involved directly in the editor, and the editor will just do all the job to convert and add the files to Perforce. CHANCE: Awesome. JEAN-FRANCOIS: So in a nutshell, one file per Actor is saving Actors in their own file. So it's going to create a USF file per Actor. And these files are going to be stored in the specific folder that you can see here, just below my mouse. So that way the level does not track anymore what Actors it's holding. So the level is just containing an empty Actor array, and that way we can add and remove Actors without having to check out the level file. So when you load the level, which is when it's one file per Actor, the level will just go into that folder and parse-- it's just going to parse all the files there and load them. So it's auto-discovering the Actors instead of keeping a list inside of the file. So if you're just modifying Actors, you don't have to check out the level file anymore. So that fixes most of the contention that teams have. CHANCE: Right. And one thing we noticed specifically on that was-- well, something that I've run into quite a bit with UE4, or UE3 development in general, is occasionally it will think that the UMAP is dirtied, and I don't think I changed anything in it. And it's not clear to me what got changed. Whereas with this, it tells me exactly the Actor that I, as a designer, accidentally bumped that rock over and I don't want to save that change. But maybe I was doing something later next to that, and it was, maybe, some mission checkpoints or a volume that's for gameplay that I do want to have changed. And so instead of just checking the whole map back in, hoping that I didn't accidentally touch stuff that I didn't need to touch, I've got a nice fine list, that you can see here in that Change List view, that shows me, oh, I only need these changes, these other ones were accidents. And it's very clear to me. Which is super nice. JEAN-FRANCOIS: Yeah. And another thing that is a great improvement with that is that if you have a level that contains 1,000 Actors, you just change one, you're going to submit the whole file to Perforce. And it means that if the file is, let's say, 100 megs. With one file per Actor, you're just going to submit a one-key or two-key Actor to Perforce. So it's greatly to reduce the sync times and the storage on Perforce. And probably has an impact on integrations also, division times and-- CHANCE: I'm sure for integrations, absolutely. I think multiple times on working at Valley of the Ancient, we would sync things, and parts of the map would be repopulated and then other ones would be what I still have currently, and those kinds of things too. And there was no real contention whenever Team A versus Team B that are working on specific things, or stepping on each other's toes, unless they're already talking about stuff they're placing in the same spots. Yeah. Just a real quick question on that. You talk about the actual molecular asset change that you'd be checking in versus having to throw a whole 100 megabyte map. Do we have any idea of-- since we're breaking up the concept of where that data lives, what does it mean for memory overall? I think for Valley of the Ancient, all of our external Actors were only a few megs overall, and there was like 15,000 of them in there. Do we expect to see disk sizes for, say, a map that had all those in it, and then those separately, to be about the same? JEAN-FRANCOIS: Yes, it's going to be about the same. Because we're not changing how the file is saved or it's-- it's going to be a little bit bigger, because each USF file has a file editor and some stuff. But it's going to be quite small, I think. CHANCE: Great. JEAN-FRANCOIS: It's not some data that we've gathered, but I would expect it to not be that much bigger. CHANCE: Yeah. So there's not really a whole lot of compromise. You're adding a bunch of files to disk, but the disk space is still the same. And it makes those molecular exchanges with source control or other teammates way easier than passing them a gigantic blob. JEAN-FRANCOIS DUBE: Yes, exactly. CHANCE: Great, cool. JEAN-FRANCOIS: And you know exactly-- as you said, you know exactly what you've changed. Yeah. CHANCE: That's great. JEAN-FRANCOIS: So having that it means that you're going to have larger changes. So instead of having a change just with one UMAP file, you're going to end up with changes with maybe 10 or 100 Actor files. So we decided to add source control integration directly into the editor to manage the changes. To be able to create changes, move files around. And the one specific thing that is super important is that we added changes validations. So let's say that you have two Actors, and you've modified the two Actors, and one of these Actors has as a direct reference to the other one, so it needs to be checked in at the same time. So we have validations that will not let you submit if you have these two files in two different changes. So it's going to tell you this file has a strong dependency to the other one, you need to move them to the same changes before submitting. CHANCE: Interesting. So it's like if I were to update a reference on a material, that material will dirty the static mesh, for instance. Because it knows that it needs that. Say, hey, you changed this that might have changed something else here that you need to save. Or if I move a texture, it knows that. It's kind of that same kind of concept, but brought to the source control management. So you know that your change that affects other things, it's going to bring those things along with you through this validation whenever you go to submit. JEAN-FRANCOIS: Exactly. CHANCE: Great. OK. JEAN-FRANCOIS: And the system is then-- that we provide a subset of validations, but projects and licensees can write their own validations and can add to the existing validations. So if you have custom stuff that needs to be checked in at the same time, as your NavMesh, for instance. You can write a validation. So every time you end up having a problem on the production floor, and you can just say OK, I can write to a test to avoid that in the future. So it greatly helps avoiding pushing stuff to break everyone's day. CHANCE: Right. Yeah, it seems flexible. And since every game is going to be a little bit different, people can go through and have their own sets of validations. And make sure that teams are working and submitting things that don't break the build here and there. But in general, some of the validation that's there helped us quite a bit with that. We didn't run into a ton of that on working on Valley. Now a lot of our world building stuff was mostly placement, but a few things that we did go in there and add, I did get dinged to say oh, you're missing the important things here that I didn't know that someone else had hooked up to that. And it was really helpful, because it allowed me to then not revert somebody else's work on accident. JEAN-FRANCOIS: Yeah. So the goal of the source control integration is to be agnostic of the underlying source control software. So someone working in UE5, it will not be lost if he goes to another team and they use Git, for instance, or something like that. You are using the same source control software and-- some features may not be there, some source control software might not support shelving, for instance, or something like that. But the core of the experience will be the same. CHANCE: And the color coding, too, is quite nice too. Because it tells you what type of asset you're going to be putting in, which is good. Great breakdown. Super cool. JEAN-FRANCOIS: Yeah. So with World Partition, we introduce a new way to work in the editor. So to be able to support very large worlds, we decided that-- it's impossible to load the whole world in the editor, so we need to figure a way to be able to select a region that you want to work in, and then just load that part. So when you load a partitioned world, at first it's going to load an empty world. The only thing that will be there are the Actors that are specifically marked as always loaded. So this is usually backdrop and vista Actors and things like that. And then the users select some cells. Here, we just selected a 2 by 2 region, and then right-clicked Load Selected Cells, and it's going to load the actual editor cells that contains these Actors. And then you can start working there. I said before, it's needed for a very large world. I think the value of the-- if you have a good enough PC, you can probably load the entire thing. But for a normal PC, if I can say. It's not possible. So you have to load a subregion in. CHANCE: Yes. Yes, this definitely comes in handy whenever you're trying to work in a big space, and you can move around. If you're doing just set dressing and things like that, you can operate section by section. But even if you're building gameplay, say you're setting up a spline that's going to move through an entire large space, or you need to-- say you're going to drive down a street, you want to add checkpoints specifically. You can still get a lot of the benefits of this system by just loading the cell you need, and maybe the one next to it, and then unloading the next one, and then moving all the way down. And that doesn't just remove it from the viewport, that hides it and actually takes out memory as well too, right? So you're not paying for those resources at edit time at all until you need them. JEAN-FRANCOIS: Yeah, exactly. Yeah, so the only thing is that if you load some cell, and the trigger loading of some static meshes, or some textures, unloading the cells will still keep these meshes and textures in memory. But that's how the Unreal engine works, right? As soon as you load some assets, they will stay there forever. But there's no garbage collection in the editor. CHANCE: Right, right. Yeah, which is why if you load Valley of the Ancient and you run all the cells, you run through it the first time, it's doing all of its first, oh right, I'll pull all this stuff in for you now and we'll move from there. Cool. JEAN-FRANCOIS: And the minimap is generated using a commandlet, so it's meant to be run nightly, or maybe hijacking some other systems. I'll talk about it when we go over the HLOD generation, because we piggyback HLOD generation to generate the minimaps. CHANCE: Oh, cool. Very cool. JEAN-FRANCOIS: OK, so since the editor cells are completely disconnected from the runtime cells, we need to have a way to define the settings. So we are providing a grid, which is a 2D spatial hash. That's the first grid that we'll be providing for UE5 initial release. We're planning to release other type of grids, like maybe a 3D grid, or something more adapted for corridor-based games. But for now, we're just focusing on to 2D spatial hash grid, because it's the most common case with landscape and things like that. So you can see here the settings for the grid for the Ancient World demo. So the cell size is 64 meters, so it's 64 by 64 meters. And the loading range is also 64 meters. It means that when playing the game in a cook build or in a PIE session, the engine will automatically load every cell that's inside the radius of 64 meters around the player. CHANCE: And that's a radius, of 64 from the location all the way around. So 128 total. So if there are 64 sized, that could be up to about four at a time? JEAN-FRANCOIS: Yeah, exactly. So you can tweak these numbers, and hit PIE, and everything will be automatically updated. And it takes less than the second to go in PIE. So doing that with UE4, it would mean going through all the levels, taking all the Actors, moving them back to the new level sizes that you want to stream. It's a completely different type of-- CHANCE: Different beast. JEAN-FRANCOIS: --way to work. Yes, exactly. You were probably write a commandlet to do that or-- I don't know how teams ended up doing that. Right now you're just change the value, hit PIE, and it's there. CHANCE: Well, this is good for you to be able to test really quickly. You just make this change, and you can redeploy to other targets just to see how streaming is going to work on your target platforms as well. Because you have this, what, memory envelope you're trying to fit everything into. You got to test if your player can see the difference between the HLOD version and the full resolution version of things as you go. So this is a really powerful way to tweak that out, make sure your performance is feeling just right, make sure you're fitting inside your budgets. As well as your levels are designed in a way that the player doesn't even see that the streaming is taking place. JEAN-FRANCOIS: Yeah, exactly. And I'm going to show a demo after the presentation. CHANCE: Oh, great. Cool, cool, cool. Hate to jump ahead. JEAN-FRANCOIS: It's fine, it's fine. Yes, so we have advanced settings there, so you can create several grids if you want. If you want to have some objects that maybe will have a smaller loading radius, you can create another grid for that. It's important to know that when generating the cook build, it's going to generate sublevels. So if you have two grids, it's going to generate twice the number of sublevels to stream it. So you need to be careful. So that's why it's in the advanced section. CHANCE: OK. JEAN-FRANCOIS: Some words about the grid generation. So at cook and PIE time, the engine will generate sublevels, as I just said. And we need to generate a hierarchy of sublevels because Actors can only fit in one sublevel. So in this case, we have 64 by 64 meters sublevels. And then the higher level grid will have 128 by 128 sublevels, and then 256 by 256, until we reach the point where we have a single level that encompasses the whole world. And that cell we call the Always Loaded cell, because it's always loaded. The radius will always be inside of it. So if you have an Actor that has a reference to another Actor, they need to be loaded at the same time. So we need to compute the bounding box of all the references and find which level in the grid they fit into. CHANCE: That's smart. Yeah, so that way if you have something that's way far away and you need to, for some reason, get some data on it or react to some data on it, those will be moved up this hierarchy as to where they live and how they're loaded. I see. JEAN-FRANCOIS: Exactly. And so if you have two Actors, and one that each of the map, they will end up always loaded because of that. CHANCE: Right. Got it. JEAN-FRANCOIS: So we do an automatic reference gathering pass before moving Actors into the cells. And then we decide in which level they will end up. And also there's an advanced setting on Actors, which is called Replacement. So there's three different values. You can set Actors to be always loaded so they will always go inside the Always Loaded cell, for backdrop things and things at the distance that you always want to be loaded. Then you have the location, so it takes the location of the bounding volume of the Actor to select in which level they will end up. So they will never get promoted to a higher level, because we just use their position to place them in the grid. So 99% of the Actors show the location. And then you have some Actors that you want to set them by bounds, because they are very big. So these Actors will use their bounds similar to the actor referencing problem. So they will take their bounds to select which level can encompass them in this hierarchy. CHANCE: Got it. JEAN-FRANCOIS: And we have some heuristics going behind the scenes, where if an Actor is too big, but you've set it to be location, but if it's too big it's going to be promoted to using its bounds. CHANCE: OK. JEAN-FRANCOIS: That was a problem in-- not a problem but that was happening a lot in the Ancient demo, because the mass objects were very, very big. CHANCE: Yes. JEAN-FRANCOIS: Some of them were very big, right? CHANCE: Very large. JEAN-FRANCOIS: So they were promoted to the higher level cells. CHANCE: Larger cells. JEAN-FRANCOIS: Yes. So that explains why when you run the game without HLODs, you can see some objects popping before others. That's because they are in higher level cells. CHANCE: That makes sense. And the same thing, too, if you go into the Valley of the Ancient, and you drag and you unload all cells, you'll see our character on the ground and some of the stuff that's right there in front of you, as well as some of the mountain top pieces that were easier for us to keep always loaded. They're fairly inexpensive. We may not even show the full geometry because the player can never get to those points. But it would look a little Swiss-cheesy if everything's out there, because we've marked some of those things as always loaded, because that was the best result we could get using this system as we got there. And it's generally pretty light, even in that level, if you just loaded that, if you loaded nothing else. Which is great. JEAN-FRANCOIS: Yes, yeah. CHANCE: Cool. JEAN-FRANCOIS: And then once the grid is generated, we have the automatic runtime streaming. So the engine will use the streaming sources. What we call streaming services, it's defined by a position and some other settings, mainly a radius in that case. Players are automatically acting as streaming sources. So when you go into drone, the drone is acting as a streaming sources. And we also added a streaming source component to the character, as you can see on the right. Because we want to be able to go back instantly, so we want to keep things loaded around the player. So that's how it's done. CHANCE: Yeah. And the little line there is the heading, right? It's where the camera is facing so you can tell the direction, if it's moving, that's the way it's going to go. JEAN-FRANCOIS: Exactly. So here you see the loaded cells in green, the unloaded cells in the red. And there are some empty cells here, which means that there was no-- because we're only showing the first level in the hierarchy, so these cells are empty because there was no Actors in it. Because these Actors that were touching these cells are promoted to higher levels. CHANCE: Higher levels of the hierarchy. JEAN-FRANCOIS: Yes. So it's not obvious at first, when you look at this debug screen, but there's some debug options to show the other levels. So using streaming sources, you can use streaming sources to pre-fetch a part of the world, also, so you can-- let's say that the player is going to be teleported somewhere. You can spawn an Actor there with their streaming service component, and set the settings to be pre-fetched, not active. So it's going to be pre-fetched, and once you're ready to teleport, you can just switch the active state of this streaming source and then teleport-- do an instant teleport. CHANCE: And you can query the state of that, the cells, once you know them. To know, hey, these are ready to go when you can get that teleport there. So it's always ready to go by the time you actually fire the event to move them, which is great. JEAN-FRANCOIS: Exactly. So that's how they did the transition to the dark world. So we can activate-- I'm going there to the data layers, but when you activate a data layer, it's just going to stream Actors in this layer that are around the player. So if you know that you're going to teleport somewhere before, you can also say this streaming source activate these data layers. CHANCE: From where I am-- from where the player is? JEAN-FRANCOIS: Exactly. CHANCE: Yeah JEAN-FRANCOIS: Yes. HLOD. So one thing that we wanted to do for HLOD was to make sure that everything is automatic. So there is no need to make complex HLOD settings. You just set up a hierarchy of HLOD layers. So each layer is going to generate its representation, based on the child layer. So the first layer doesn't have a child, because it's the first layer. So it's using the main world as an input to generate the low resolution representation. And then the parent layer is using the other layer to generate. So if you have a very big world, you can set up several HLOD layers, which are less and less and less expensive in memory. But you can represent the whole world with that. We have multiple labor types. One of layer type is instancing. So it's creating one Actor per cell, with a single component per compatible asset. So if you have 10 static meshes in your world, 10 static mesh Actors that use the same static mesh, they're going to end up in this Actor, using a single instance component with 10 instances. So it's creating a representation of the world that is very lightweight to render. So the instancing layer doesn't have visual quality loss because it's using the same meshes, same textures. But it's just stripping away all the physics and gameplay stuff, right? So the instancing layer is just the visual representation optimized for rendering. CHANCE: Right on. JEAN-FRANCOIS: And then you can create merge and simplified layers. So these layers will work on their child layer. So in this case, an instancing layer probably. What they do is still create one Actor per cell, but they take all the meshes inside the cell, and they merge that into a new static mesh representing the whole cell. We run simplifying algorithms on that, and pre-render the materials, also, into a single texture. So it's really one draw call per cell for a very distant subject. CHANCE: That's great. So depending on your cell size, that can be relatively inexpensive across the board to get everything loaded and running. JEAN-FRANCOIS DUBE: Yes, exactly. So if you take a look here, a typical use case for a very open large world would be, let's say you have a loading range of 128 meters. So everything is fully streamed, physics, gameplay, everything is there. Then you can set up an instance layer, up to 768 meters. This layer is still streamed, so its distance-based streaming also, but it doesn't contain physics. So from the 128 meters to 768 meters, it's just a visual representation. And then you can set up another merge layer that will take the instanced layer as an input, generate merge meshes up to two kilometers. And then finally, you can have another merge layer that will take this merge layer as an input to generate two kilometers to infinity, and set that layer to be always loaded. So at any time you can like grab a helicopter, go in the sky, and see the whole world, right and everything looks fine. CHANCE: And as you come down, it takes from that big chunk and it gives a smaller chunk representations, all the way down to the final pro-res that you'd want once you're actually really up nice and close to it. Cool. JEAN-FRANCOIS: So you can achieve this by just setting up 3 layers in the editor, and setting up the parent layer. And then you have a nightly presence that runs with support-distributed generation on the build farm. So I think on Valley of the Ancient, we were using 20 machines at some point to generate HLODs. CHANCE: And you can generate these via command line, right? JEAN-FRANCOIS: Mm-hmm. CHANCE: And just running a command. So if you're just working locally, you can regenerate these things yourself and just have them. JEAN-FRANCOIS: Exactly. CHANCE: Yeah, cool. JEAN-FRANCOIS DUBE: But the thing is that the merge layers are very long to compute. So if you want to do a local test, you can just remove the parent layers which are merged, and just regenerate the HLOD 0, the instanced layer. And as I said before, we piggyback on the HLOD process to render the world minimaps. So we're just using the last HLOD layer to generate a top-view, because it's always loaded. So we just use that. CHANCE: Right, right. Oh, it makes sense. And I think we're ran into this on the project-- you can correct me if I'm wrong-- but I think we had times in our minimap where there were holes in the map because it didn't have all of the cells loaded in the editor. Does that happen at edit time, that generation? Basically, does it happen based on what you have loaded in the editor at the time? JEAN-FRANCOIS: Yes, so if you render it inside the editor, it just takes everything that is loaded. So if you just load a couple of cells, yeah. CHANCE: But yeah, load all your cells before you generate your minimaps, or you'll record some video with some holes in it that you'll have to go rerecord. As we found out. Cool. JEAN-FRANCOIS: OK, data layers. This is something that we added also with World Partition. So it's on par with the existing layer system, which was an editor-only system, right? So the existing layer system was there to categorize Actors, toggle visibility in the editor. So the new system is on par with that, but it adds filtering of loaded Actors in the editor, and also filtering of loaded Actors at runtime. So for example, that's how we did the Dark World transition. So we have a normal data for the [AUDIO OUT] which is called Campfire Replace. I don't know why it's not called Light World, but-- CHANCE: You know, names. JEAN-FRANCOIS: And then we have everything that's part of the Dark World assigned to that data layer. So when you go into the editor by default, this data layer is not loaded. But if you want to work in this data layer, you can just unload this one, load this one. And it's only going to load Actors part of that data layer for the cells that you have currently loaded, right? It's not going to load the whole world. So it's affecting the current loadset. CHANCE: Yeah. And one thing I wanted to clarify there for anybody that's gone through this, you might see that there's a little bit of a difference between having just these two data layers swapped in the editor versus when you swap them in the game when you run that. What we did on the actual change is we actually altered some global material parameter collections as well, to change some of the things in the [AUDIO OUT] --really using a couple of different systems to get the full effect across to you. This is the one where we have all the categorized assets that we had built specifically for that, on top of the base that is the Campfire geometry base, that does all the streaming in and streaming out, working well with World Partition. Just wanted to mention it. JEAN-FRANCOIS: Yes. So data layers can be also used for several other type of stuff. Let's say you have a mission where you need to collect all the stars. So you can just put all the stars into a special data layer for that mission, and at runtime you can just enable that data layer and the engine will start streaming, still around the streaming sources but it's going to start streaming all of these Actors. CHANCE: Yeah, that's really cool. I hadn't considered that whenever we were looking at this. So you could put gameplay objects-- this can be any Actor that you can place in a scene, right? It doesn't have to be geometry, specifically. It's anything that needs to render in the space, or have some data that's on it. That's great. JEAN-FRANCOIS: So most people think about data layers to switch the world, like night and day, or things like that. But it can be useful for missions and things like that. Yeah. Or just a broken bridge or something like that. CHANCE: Right, yeah. If you have a persistent game and the player has proceeded to handle these missions. And now every time they load up, you need the world to be set a very specific way, you can do that. I think from a workflow perspective too, being able to toggle between the two and seeing what the bridge looked like before or after, you can look at that real quick and make sure that this feels like a good state change for someone to come back into, which is super nice. JEAN-FRANCOIS: Yeah. And you see the bridge in its two states inside the world. It's not a separate build that you have to work in and you don't have a context of what you're working on. CHANCE: I wonder too-- now that I'm thinking, I wonder if you could use some of the physics destruction things to simulate something down and bake that in from the original, where the bridge was. And then just save that-- mark that for its own data layer, and then just be done with the exchange between those two. That's pretty neat. JEAN-FRANCOIS: Yeah And data layers support HLOD. So you can have specific HLODs for the Dark World, or for a broken bridge. If we take that example, if the bridge is broken we probably won't see it broken at the very far distance. So you can set up specific HLOD layer here for the data layer. CHANCE: That's great. The system's really, really nice and intertwined. JEAN-FRANCOIS: Yes. So there is a downside with that. Data layers will also generate sublevels. So you have to keep yourself from being crazy when using data layers. And that's why we added here the little green and red circles. The red circle means that it's an editor-only data layer, so it doesn't affect runtime. It doesn't create sublevels. It's meant to be used in the editor. We have to make sure that we keep the number of runtime data layers as low as possible, or at least make some tests to see the impact on the streaming. CHANCE: And on that note, we actually combined all our data layers while we were building the project. I think we started with six or seven while we were learning how they all worked. But a couple of the reasons we did that were for some quick performance testing to-- a good example is we have foliage in the Campfire environment, the Light World environment. And we weren't sure exactly how much of a performance hit that was going to have for us. So what we did was we used the Blueprints, which I think is next on your list here, to toggle those off while we were running it and doing performance capture. So we just would have it toggle those every few seconds, and then we could look at the profiling data and say, oh, our foliage is costing us this much. How can we minimize that, whether it be in optimizing the geometry, or how many there are on the scene at any given time. So they're powerful too, just as a tool for you to work with your data. And then we end up collapsing them down, I think based on your recommendation, before we ended up shipping, specifically for that reason. JEAN-FRANCOIS: Yes. But it's fun to see how you've used that to do things that weren't planned to be done with that. So yeah. And just to mention that data use can also be enabled via Blueprints and Sequencer. We're adding a Sequencer track-- CHANCE: Oh, awesome. JEAN-FRANCOIS: [AUDIO OUT] data layers. CHANCE: Yeah, I knew about the Blueprints, but I haven't touched Sequencer enough to know there. But that sounds great. JEAN-FRANCOIS: Yeah. Sequencer support is not there in early access. It's in the works right now. Just a quick mention of about Blueprints. So the Level Script still exists, but every Actor reference will be always loaded, because the Level Script is part of the persistent level. So if it has direct references to Actors, they need to be always loaded. So it's just it's the same thing for Blueprint classes. So if you have an Actor with a Blueprint class, and you have references to other Actors, they will be bundled together and moved to the higher level, as we saw before. So we have to take special care about that. We need to favor Blueprint classes over a Level Script for a script that contains Actor reference because of that. CHANCE: Right. VICTOR: Sounds like another reason not to use the Level Blueprint. JEAN-FRANCOIS: Exactly, yeah. CHANCE: There are valuable reasons to use Level Blueprint on example. But yeah, in general, good practice to do your big, quick prototyping, hooking stuff together there, and then move things out in modular self-contained managers and things understand the state of the game a little bit better. Early on, I think we had-- for this specifically, we had a lot of the level switching code in the Level Blueprint, or the data switching code in the Level Blueprint. And we end up moving that, I believe, to game mode, just because it was a class that we could access from pretty much anywhere we needed to. We knew that it didn't have a whole lot-- it didn't need to know a whole lot about the world, it could just call the functions that we needed on the world, and that seemed to work out really well. JEAN-FRANCOIS: That's why-- I was searching for the Blueprint that activate and deactivate the Dark World yesterday for the presentation, and I wasn't able to find it. So that explains why. CHANCE: Yeah, I think it's in game mode. And we-- actually, it's funny. You say that you can do these things in Sequencer. The way I set that up, I believe, was that I have Sequencer calling into an object that actually accesses the game mode to make the transition. Because we need to have that separation between objects in the world and things that are actually affecting the entire world. So there's a couple of callbacks there to make that work. But I think it's in game mode. Oh and then I will say, too, if you do dirty the map with a World Partition map, chances are you changed something in the Level Blueprint or in the always loaded Actors. So if you are working in a World Partition map, and you see that needs to be changed, you may have changed a persistent Actor, an always loaded Actor in the persistent world, that thinks that, hey, I need to take the UMAP too. Or you changed something in script there, or something else in that script got changed and that's where it got dirtied. So if you're working in this space and you think, I'm using World Partition, I didn't think I would need to check in the UMAP. You might take a look at what you did change, and see if it's actually referenced in there, because that will ask it to be saved and checked in. JEAN-FRANCOIS: Yeah. And there is a lot of code paths that still dirty the level instead of dirtying the exact object that is modified. So I think the rule of thumb is to submit the UMAP, right now. If it gets diritied, it's better to submit it. Because you can't know what you've modified inside it. CHANCE: Right. Yeah. And I think that talking to a couple of the folks on the gameplay team and core, they're like, yeah, there's a lot of assumptions that have been made over the 20 years of working in UMAPs, that we probably have to rethink now going forward as we move to this system for UE5 and other maps. We can probably get a little bit more surgical with hey, these are the areas we care about inside that big data blob, versus over here, these things are pretty safe to just go ahead and ignore. JEAN-FRANCOIS: Yeah. But normally with one file per Actor, there is a lot less scenarios where you need to submit to the UMAP file, right? It's only if you change the world setting. The world setting is not using one file per Actor. And then I think that's about it. Normally you can go days and days without changing the UMAP. CHANCE: Even the data layers option is not a UMAP, right? JEAN-FRANCOIS: It's an Actor. Just for each the one file per Actors, yes. CHANCE: That's great. JEAN-FRANCOIS: And adding data layers, moving data layers, it's all just checking out the data layer Actor. We could have done one Actor per data layer to really minimize the impact, but we decided just not go to wide at first. CHANCE: And it might be important to know on that, too, the Actor itself is the thing that saved in external Actors. What data layers that's associated with it, it's just more metadata on that Actor, right? It's not a duplicate version of it or something? JEAN-FRANCOIS: No. It's just using the internal name of the data layer to work. So if you delete the data layer, you don't need to save all the Actors that are part of that data layer. They would just discover that this data layer is gone when you load these Actors, and that doesn't ever dirty the Actor. CHANCE: That's great. JEAN-FRANCOIS: Then we've converted several systems to work with World Partition. Landscape was the first one. So landscape support that is done by automatically splitting the landscape proxies on to the grid. And then you cannot paint when you try to paint on the boundary that shares a boundary with an unloaded cell, because it has repercussions on the normal maps of the other cell and things like that. So the paint tool will become red, and it tells the user you need to load that specific part before. CHANCE: And that's just an edit time, right? JEAN-FRANCOIS: Exactly. CHANCE: Yeah. So you're not saying that we would have foliage up to the lines and then move to the next one and foliage up to the lines. You just need to load the edges as you're moving past the space that you're currently working in. JEAN-FRANCOIS: Exactly. And we've thought about having automatic loading. So it's the same thing for foliage, you speak about it. So foliage you just paint Actors in the map, and when you arrive at the point where you're trying to paint on the cell that is not loaded, it's just going to stop scattering foliage instances. And the foliage tool has been adapted, so it creates one foliage Actor per editor cell. So as long as you paint inside one editor cell, you're not going to create contention with another one. So if you're painting a cell and I'm painting a cell, I cannot start painting on your cell because you will have that Actor checked out. CHANCE: Got it. So the landscape cell is one Actor itself. As is the foliage and everything, and the painting-- everything that goes on it is considered-- that slice of cake is protected as you're decorating it. JEAN-FRANCOIS: Exactly. So it's one Actor containing one instanced static mesh component, and all the foliage instances just go in there. So before, it was a one foliage Actor per level. CHANCE: Right. Yeah. JEAN-FRANCOIS: We had to do something. Then [AUDIO OUT] multiplayer has been adapted. So we have data layer support so the server can activate the activated data layers. One thing is that the server will build the entire world. There's no solution for that yet. One solution would be to have streaming on the server, based on all the players' position, but that introduces a problem with persistence. So let's say you destroy a house in Fortnite, for example, and then you just move away. The server unloads that part, and then you come back, it loads back. So we need to have some kind of persistence. And normally persistence like that is handled with the server loading everything. CHANCE: Right. JEAN-FRANCOIS: So for 5.0, the server will load the whole world. And we also adapted NavMesh. Generating NavMesh needed to have the whole world loaded, so it's not possible with World Partition, because you can have a very, very large world. So the NavMesh generation has been adapted to load partially the world, and go through every editor cells, and generate part of the NavMesh, and do stitching to the final NavMesh at the end. CHANCE: I see. And that works with the hierarchy, as well too, right? Does that match how those are broken up, or is it more at the high level? JEAN-FRANCOIS: No, no. Because these are loading editor cells. CHANCE: Oh, editor cells. I see, I see. Got it, got it, got it, got it. JEAN-FRANCOIS: I think that would be a common problem to address, the difference between editor cells and streaming cells. It's something that we have to wrap our heads around. Yeah. CHANCE: They're serving a little bit of different needs. And so yeah, it makes total sense. JEAN-FRANCOIS DUBE: And something that is not done in static lighting. It's planned for 5.0. We have a plan for that, but it's not done yet. CHANCE: Ah, OK. Super cool. JEAN-FRANCOIS: And one last slide about enabling and converting to World Partition. So to enable World Partition, you need to go into the Project Settings and enable the World Partition checkbox here. It's not going to do anything at that point. What it's going to do is that if you create a new level from the File menu, if you go File, New Level, and you choose a template, it's going to automatically create a partition world for that. So it's going to enable one file per Actor, set up the grid with default values and things like that. So you can even create a new world from a template, place some Actors. Don't save, just press PIE, and you can tweak the grid setting. Press PIE and everything works without saving anything. And that's because unsaved Actors are not streaming from disk in PIE, they are duplicated to keep the changes that you did. And opening a non-partitioned world when this setting is set, it's going to ask for a conversion. So it's going to ask every time, Do you want to convert that level. Conversion is done through commandlet. So essentially the commandlet would just gather all Actors from our sublevels, migrate them [AUDIO OUT] persistent level, and enable one file per Actor on all of these Actors. And it's going to open for delete all the sublevels that were there before. It's creating a complete change list of the conversion process. Yeah So we make everything we can to make the conversion process as easy as possible. For instance, Actors coming from Always Loaded sublevels would be automatically set as Always Loaded for grid placement. Existing layers are converted to editor-only data layers. And the conversion process can happen in place, or it can create like a sidecar file so you can do comparisons. Because we don't expect big-- licenses that have big games, we don't expect them to run the conversion process, and 100% convert it and everything works fine, right? We expect them to at least run a couple of times and make tweaks to the config file, and even probably write some code to handle specific case for their project. So having a sidecar file to be able to load the original world, and then load the converted world and do some comparison is essential in this case. CHANCE: Yeah, it seems helpful. Yeah, I assume if you're making changes from a map or a stack of maps that's got some Blueprint sublevel streaming code, you're going to want to make sure that works with this. I'm assuming that you don't need to stream those things anymore. So if you're going to be moving those things into data layers, you just would want to change out your Blueprint functions from stream this level, and instead say, oh, make these data layers active for these location, or the whole thing. JEAN-FRANCOIS: Exactly so. You have two options in there, so you can change your source data and then run the commandlet. Or you can modify the commandlet code. It's done in such a way that you can create your own class of conversion, and override the function. So you can write specific code to convert your own specific cases. CHANCE: Oh, that's nice. JEAN-FRANCOIS: So internally we-- at first, we tried to convert Fornite, just as an internal process. So we have a specific content that derives from Engine 1, which handles all the specifics of how the data is set up. CHANCE: Right. Every game, especially bigger games that have bigger spaces, are going to have probably very different needs. Because everyone's trying to do something just marginally different from the next at best, and wildly different at worst, right? JEAN-FRANCOIS: Yeah. So we really expect them to write code and overload the World Partition convert command. CHANCE: It's nice though for those that aren't super complex. I'm sure a lot of folks that are dialing in have got smaller games, or games that don't have maps that have really convoluted level streaming codes set up in there. Or they just have a bunch of UE4 games they want to try to test on the new systems, they want to move their projects up. It seems that there's a pretty good path for them to do that. I think when we did our map, it was just a couple of days of trial and error. And we already had a lot of stuff in the space, right? We were trying a few things before we moved over to World Partition. So cool. JEAN-FRANCOIS: And the best scenario is for teams that are using World Composition with all their levels [AUDIO OUT] distance-based stream. Because that's essentially what we are doing, but at an Actor level. So converting these levels is will be easier for teams that are using World Composition. CHANCE: Right. Because their code is basically doing very similar things, as opposed to some patchwork trickery. JEAN-FRANCOIS: Exactly. But it doesn't mean that they don't have streaming levels of volumes, or Blueprints that triggers loading. CHANCE: Sure. JEAN-FRANCOIS: So yeah, that's it for the presentation. CHANCE: That's great. JEAN-FRANCOIS: I will switch to the Unreal editor. So that's how it looks like when you start the game-- not start the game, but load the map in the editor. There was nothing loaded, right? Only backdrops and things that were specifically marked as Always Loaded. CHANCE: This is all considered persistent level for those that are thinking in the non-World Partition terms. This is basically everything that lives at that UMAP level as it is, at that highest most level of the cell. OK. JEAN-FRANCOIS: That's a good thing to mention, because in a cook build, that we just move all these Actors directly into the persistent level. CHANCE: OK. Yeah. JEAN-FRANCOIS: So I don't need to load anything from the minimap. I can just hit PIE. Because there's a complete disconnection between what's loaded inside the editor, and what's loaded in PIE, right? Because it's using the grid settings to generate the settings. So as you can see I can load the map and start droning, and I didn't even load anything. CHANCE: Right, yeah. The editor still has nothing in it. JEAN-FRANCOIS: Exactly. So we have some debug views. If we enable this one, toggle draw runtime hash 2D, which shows the actual loading of the grid. If I move, you can see that we have a streaming source that is still on the player right now, to keep things loaded. So I can just go back instantly. So if I go back. CHANCE: Just the X button, I think. JEAN-FRANCOIS: Yeah, so everything stays loaded. So I'm just going to show playing with the grid-- CHANCE: And the two you see here, one of these is the camera that you saw, just while she was sitting there. And the other one was her, right? So you can see that there's still two, OK. JEAN-FRANCOIS: Yes. Yeah. And she's always loaded. CHANCE: Yeah. Floating around. JEAN-FRANCOIS: So I can go here into the runtime hash grid settings, and I can just say instead of having 32 cells, switch them to 64 just as a test. Pur 32 meters for the loading range, and just sit PIE again. And this is something that wasn't possible with UE4. You had to completely move your Actors through-- a complete different set of Actors. So you can see right now that the cells are bigger, and the loading range is very small, right? CHANCE: Yeah. JEAN-FRANCOIS: Just-- Oops, sorry. CHANCE: It'll also probably really show it off, what's going on. JEAN-FRANCOIS: So that again, I just stopped by PIE by error. CHANCE: You hit Escape? JEAN-FRANCOIS: Yes. CHANCE: That's the first thing I do, is rebind that to Shift Escape or something, because I push it all the time. I'm like, why'd I do this? JEAN-FRANCOIS: So in this case, the loading radius is 32 meters instead of 64. So it means that after 32 meters, it's the visual representation of the instanced HLOD layer. So there's no physics after 32 meters, there is no gameplay elements JEAN-FRANCOIS: --things like that. So I can disable HLOD, just for us to see. CHANCE: Yeah, I don't know if we had mentioned the HLOD disable. There's a bunch of really great commandlets that'll allow you to actually show what's going on. This is great. This is a really great debug tool that we were using to figure out what was going on, numerous times in building the project. JEAN-FRANCOIS: Yes. And we plan to add different views with coloring. So we want to have a coloring view that shows all the different HLOD layers, for instance, so you will see the bending of each layer with different colors. Have different colors for data layers. Have different colors, also, for the grid promotion. You can do with your object has been promoted to a very-- CHANCE: Oh, a different version. Yeah, yeah, yeah, very cool. JEAN-FRANCOIS: So that that's how it looks like without HLOD. So you can see that this one big object that just appeared has been probably moved into a higher level cell. CHANCE: Right. Which would explain, too, some of the holes you'll see in this-- we were talking about this right before this-- the holes you'll see in this graph doesn't mean that there's nothing in that space. That just means that the Actors that are filling that space are either origined or bounded right outside of that, or they're in one of the hierarchy layers. So you'll see them load up whenever appropriate. JEAN-FRANCOIS: Exactly. Yeah. OK, so I'm just going to go inside of this World Partition view and I'm going to load some cells. So just select some cells and click load. And then going to do something. CHANCE: We have a ton of stuff in those four cells. It's so dense right there. JEAN-FRANCOIS: It's the most dense parts. OK. So we have a debug view in the grid that helps you seeing the runtime grid cells. So if you activate Preview Grids here, into the Grid Settings, you have the actual grid at runtime-- CHANCE: That's so nice. JEAN-FRANCOIS DUBE: --an overlay. So it can help you debug stuff. Let's say I select this Actor. So by the size of this Actor, you can tell that it's going to end up in a single cell, because its grid placement is set to location. And it doesn't cover a huge part of the map, right? But if you see something like this one, probably that this one is going to be promoted to one layer on top, because it's going to end up in that level here that is highlighted by my mouse. Right? CHANCE: Yeah. JEAN-FRANCOIS: And if you really wanted to use bounds, as I said before, you can just switch its grid placement here to use bounds. CHANCE: And then it'll just basically-- any cell that that sneaks into, it will promote itself all the way up to make sure it's in the appropriate one. So any time-- Great. That is super helpful. I didn't actually use this much for this, because I think that you were in here poking around and making some of these changes with us as well. But that's a great tool, especially if you're not-- figuring out why your geometry is not-- or anything is not where it needs to be, being able to flip that and take a look at things very specifically is probably a huge, huge boon for efficiency. JEAN-FRANCOIS: Yeah, it's just the beginning of debugging tools. Because we have a ton of debugging tools that we want to write. We want have a heat map similar to this view here, but a heat map with, let's say, how the memory taken by cells, or we could even have some [AUDIO OUT] cell or things like that. And other coloring debug views, as I said before. So that would be great improvements to this basic debugging view. So if you change your-- let's say that I want to test with 120 meters, you can see directly the change in the map. So you can tweak your value here, and see directly the effect, and figure out what is going on with these objects and how it would be distributed in the grid and things like that. Another thing, I just want to-- I'm going to pop up this one here so I have a better view. So that's the minimap that is rendered with the HLOD generation. If you select an Actor in there, it's going to show the bounding volume of that Actor inside the editor cells. CHANCE: Oh, yeah. JEAN-FRANCOIS: It's great for you select an Actor, you click Focus Selection, and then you can say, OK, it's there, it's in these cells. CHANCE: Yeah. Those on the stream, the compression might be squashing that a little bit, but there's a nice sharp yellow bounds square that's being drawn on the minimap there. So you can see that just sneaking just outside of those two into two others. JEAN-FRANCOIS: Yeah. And then one thing that you will notice that was not there before is that the world outliner can show now unloaded Actors CHANCE: Oh, nice. JEAN-FRANCOIS: So if you need to work with that specific Actor, you can just click on it. You can click on Focus Actor Bounds, and it's going to move directly where is it, where it is in the map, right? So in that case, you would expect it to be loaded, but it's not. It's there in the map, it's part of one of the loaded editor cells, but it's not there. So it's probably in the data layer. So you can right click on it and say Load Unloaded Actor. So it's going to load it. So I just have to find it somewhere. Oh, what is it called? I'll just take another example. Take High 50-- OK, so it was called High 62. So if I take a look at the Actor and go into its data layers-- OK. So it's part of the data layer Campfire Replace. It's not a good example. It must be there somewhere. But I was just meaning that sometimes you can just click focus on that Actor and it's not there-- It's still going to focus on the good Actor, but it doesn't mean that it's loaded or not. Yeah. Because of-- so you can inspect all the data layers per Actor here, going through there. But can also just go into the data layer. CHANCE: And Actors can be associated with more than one data layer? JEAN-FRANCOIS: Yes. CHANCE: So if you were going to switch from one to the other, but you need some things to stay persistent, you don't need a third data layer that's that persistent layer. You can just keep it in both and toggle between those two, and that Actor stays where it's supposed to be. JEAN-FRANCOIS: Exact. CHANCE: That's nice, OK. JEAN-FRANCOIS: Yeah. So it's going to generate a specific sublevel for the Actor that is inside two data layers. Because if we need to load that independently, when you activate one or the other, we need to move all these Actors that are parts of several data layers into their own sublevels. But it's all done under the hood when you working with PIE or-- CHANCE: I don't have to think about it as a level designer or something. I can just say this is this version of the map that I'm trying-- or this version of this space that I care about, and this is this version of the space I care about. This Actor might be the same in both. I don't need to worry about what's happening with sublevels or streaming or anything like that. JEAN-FRANCOIS: Yeah. CHANCE: Great. JEAN-FRANCOIS: So that's the data layer view. If I go here and I want to work on the Dark World part, I can just first unload this one. So it's really going to unload that part of the world, and that's why it's asking me if I want to save. Because I changed an Actor, so if I unload that part it's going to unload that Actor. And it's asking me if I want to save that Actor or not. Because I'm going to lose my changes-- CHANCE: It's basically like closing the level, right? Or that level, that sublevel. Got it. JEAN-FRANCOIS: Yeah. It's the same behavior. So I just go, don't save. That's going to unload-- CHANCE: And again, this is so nice. Because if I actually touch something I'm like, I don't know if I can-- I don't know if I should save this or not. I'll at least know, oh I didn't touch that [? buit, ?] revert that. Galen will be mad at me if I don't. JEAN-FRANCOIS: And then I can activate the Dark World, which is going to load Actors that are parts of the cells that I had already loaded. And they're loaded inside. We can also just double the visibility, if you just want to switch-- if you happen to load both, because you can load both. Yeah, so I'm just loading it. Again, the most dense part of the world. CHANCE: Yes. Yeah, this is something we did quite a bit when trying to understand what it would feel switching between things, making sure that things are spatially aligned. Some of the machines we have here with a ton more memory and whatnot, we were able to load everything all at once, all of it. Both worlds, even before we done any optimization, and just used those toggles there, just to make sure everything was aligned right. And then we would unload the thing when we don't need it anymore. JEAN-FRANCOIS: Yeah. So we can activate them, just switch their visibility without having to go through the burden of loading and unloading. CHANCE: And that's just the same behavior as activating or deactivating layers in the old maps, correct? That's just turning visibility on those Actors off. JEAN-FRANCOIS: Exactly, yeah. CHANCE: That's cool. JEAN-FRANCOIS: Yeah, so there are several settings in the data layers. So all these data layers settings are persistent per user, so when you close the editor it saves. So if you close the editor with the Dark World not loaded, it's not going to be loaded the next time you load the level. But if you work on the Dark World setting, so you visually disable this one and load this one, the next time you load the editor it's going to be at the same state as you were before. CHANCE: Right. And-- JEAN-FRANCOIS: Go ahead. CHANCE: I was just going to say it's super nice for the way we had things split up. Because we broke the map up for set dressers to have their areas. And so they're not having to turn stuff off and go to the right spot to turn stuff back on. And then also data layers as well, not just the partitions but data layers as well, we had a completely separate team working on different parts of those as well. So everybody when they load the editor, had a completely different map experience that's catered specifically to what they were working on. JEAN-FRANCOIS DUBE: Yes, exactly. And there is another thing. So the World Partition cells also are saved per user. So when you load the map that you just load the last of the cells that you-- it's just to make sure that when you put up the editor, it's the last state that you were in before. CHANCE: Yeah. The last thing you want is to load the map and someone has loaded a whole bunch of new stuff in there that you're not expecting to have to open, and it taking a lifetime. JEAN-FRANCOIS: Exactly, exactly. Yeah. But there is always the case where someone will load the entire world, and it's going to crash. And then you cannot load the editor anymore, because it's always trying to load this. So it happened during Ancient World development. So we just decided to at least save-- that's thing when you properly close the editor. So if you crash, it's not going to be saved. CHANCE: Great. Yeah, so it's only been successful shutdowns, not I think abnormal shutdowns is what they're called in code. Aptly named. JEAN-FRANCOIS: Then just a quick overview of the HLOD setups. So if you go in the World Settings under the World Partition setup, you have the HLOD layer, which is there. So in Ancient World, there's only one HLOD layer and it's always loaded. But just for the sake of showing it. So you can disable Always Loaded here. And you can tweak the loading range here. So you can say I want HLOD layer to be 256 by 256 meters cell size, and that's the loading range. And then you choose between instancing and different types of mesh merging and mesh simplifications. And then if you want to have another layer-- let's say that we want to have another layer, which is a merged version of the world, we could just go here, create a new layer, save it here. And then just say, OK, I want to be [AUDIO OUT] simplified version. This is going to use this one, because this one is its child. So this one is set as its parent. And it's going to use the child layer to generate a simplified mesh with a cell size of, let's say, one kilometer wide and the loading range of-- or always loaded, if that's what we want. And then we just save that, and it's done. We just wait for the next HLOD generation. It's going to be there. CHANCE: That's great. Yeah, lots of little knobs in here to play with when you're testing and trying to make sure things are loading appropriately, both with your native geo that's in here, and the actual HLOD versions, cell size, everything. And again that'll be very-- that'll be determined almost exactly by what your game is and what content you might need. Say if this had a bunch of buildings and streets, there's a lot that we wouldn't need to load necessarily, unless you could get above those, right? And so we would probably have different HLOD settings, different things we could get away with loading, cell size and whatnot. JEAN-FRANCOIS: You would have a data layer, let's say, for rooftops and things that you would just enable when you go into a chopper or something like that. CHANCE: Right, right, right. Yeah. JEAN-FRANCOIS: And then I think that's it. CHANCE: That's great. JEAN-FRANCOIS: Yeah. Just something to mention, one plan that we have is to show HLOD directly into the editor also. So instead of showing empty space for unloaded areas, we would display HLODs directly inside the editor. So one step further would be to completely remove the need to load the cells there, and just use cameras remaining directly inside the editor. So that's-- CHANCE: Oh, that would be nice. JEAN-FRANCOIS: That's a far-fetched goal that's on our track. And this is the dream that we want to achieve, is to be able to just navigate in the editor, seeing HLOD and having automatic streaming. And remove the minimap. CHANCE: Yeah, no. That's fantastic. Well, it's super cool. VICTOR: Yeah. CHANCE: Thanks for sharing everything there. I mean, I've been working with the tools for a little bit and I've learned a handful of things that I didn't find out working with you on this, or just by nature of poking around. So really appreciate it. Lots of really good information in there. Thanks JF. JEAN-FRANCOIS: Thanks. VICTOR: Ready for some questions? JEAN-FRANCOIS: Yes. CHANCE: I think we have numerous. VICTOR: Sure do. Kick it off, I think it will be-- since today's topics were fairly concise on just world-building, we'll just dive right in and shoot them off one at a time here, for the stuff that you haven't already addressed. First question comes from Sergio Free, who's wondering will data layers be available for non-World Partition levels? JEAN-FRANCOIS: The answer is no. It's really developed on top of World Partition. So it's leveraging the fact that it generates sublevels directly at cook time. So it's really a feature of World Partition. CHANCE: Yeah. I think if you can't move to World Partition for whatever reason, you would probably still just use the sublevel model. JEAN-FRANCOIS DUBE: Yes, exactly. And at some point every level on Unreal will be partitioned. VICTOR: Next question comes from UE5 Project Storm, who is wondering what are the default world size limitations for World Partition? In UE4, it was 20 by 20 kilometers. JEAN-FRANCOIS: Yes. So it's the same limitations. We have some development in flight to be able to enable larger worlds. But right now it's the same limitation as before. But there are something ongoing to be able to support hundreds and hundreds of kilometers away from the origin. Yes. VICTOR: There has been several questions in regards to a different landscape solution. Several people are wondering if there's any work in regards to landscape to be able to make it work better with World Partition, real time virtual textures, Nanite, et cetera. Do we have anything to share there? JEAN-FRANCOIS: Yes. So World Partition has direct support for landscape, as I mentioned before. So landscape proxies are directly created on the grid, so you can partially load the landscape inside the editor and work from there. But I cannot answer for Nanite. There is no Nanite support for landscape. But does the future [AUDIO OUT] that will have support [AUDIO OUT] I don't know. CHANCE: I've got one here that says HLODs and landscapes, from Carlos Pures. He says how is it possible to see far tiles with high HLODs in an open world with World Partition. I think you answered. That you'll have maybe some of your [? buits ?] and big stuff that you could never get close to always loaded. And then your HLOD will be at some layer that will populate all that space out right. JEAN-FRANCOIS: Yeah, exactly. So normally you would set up your HLOD layers hierarchy, have a final layer that is always, right? So it's a layer that is always loaded. It's the most simplified one, so it should take less memory. Unless you have a game with fog or something like that you can hide very far away objects. But I don't know if the question was specifically about landscape, but we don't have landscape support for HLODs currently. But this is planned. This is not in the early access. VICTOR: That was-- a couple were asking that. So thank you for addressing that. On the same note in regards to being able to see objects in the far distance, someone was wondering here if you have a game such as a sniper game and you want to look really far, does that involve similar techniques that you were talking about, teleporting where you want to manually load those areas? Or what does that look like? JEAN-FRANCOIS: Yeah, so that's a common problem, sniping to a part of the world that is not fully loaded. It means that you need to load, right? So if you know in advance that you're going to start to snipe there, like for a scripted sequence or something like that, you can have a streaming source placed there and make sure that everything is streamed before you zoom in. But if the player can zoom in at any time at any far distance, that's an unaddressed problem. Yeah. You have to figure out ways to hide the fact that you're zooming into HLODs. CHANCE: Yeah. JEAN-FRANCOIS: It's a common problem between games that has snipers. CHANCE: Potentially creative content solutions there, too. Some combination, I think, of being able to pre-fetch some of the information, maybe some smart work with HLODs and how you build them. And then, yeah, content. So tricky. JEAN-FRANCOIS: But even if you zoom in a part that is not loaded, so not supposed to have replicated players there. So normally you're not supposed to see gameplay elements there, also. So it really depends on the game. Maybe a game with a sniper that can snipe at the distance of one kilometer will have its main loading range set to one kilometer. CHANCE: One kilometer. Yeah. It comes down to where do you spend your budget? What's most important for your game? VICTOR: Another question is from Charles Cox, who is wondering will Unreal Engine's water body system work with World Partitioning? JEAN-FRANCOIS: Yes. So the new water system that we're currently developing is currently going under work to support World Partition. It's not there in the early access, but it's planned to be there in the initial 5.0. CHANCE: Cool. VICTOR: Chance, did you have one? CHANCE: No. I'm digging-- there's a very dense document of questions. VICTOR: I've been trying to make some space, since you asked me for that, or you've been doing it earlier. So in general, we've seen a lot of questions in regards to World Partition, and I guess UE5 in general when it comes to large worlds and multiplayer. Moss306 here specifically was wondering will World Partition work with listen server's and clients, or just dedicated servers like World Composition? JEAN-FRANCOIS: Yes, so it works with listen servers. The thing is that the server needs to load everything. VICTOR: Everything, OK. JEAN-FRANCOIS: The most common case will be running servers on dedicated machines that can afford to load the whole world. It really depends on the game and how the servers, and on which machine the server runs. But in future releases, we plan to have server streaming, and have a persistent system on the server that would be able to at least get objects back to their states before the cells were unloaded. VICTOR: So that would allow for single shard, but with individual cells loaded depending on where players are? JEAN-FRANCOIS DUBE: Exactly, yes. VICTOR: OK. That's super exciting. CHANCE: I've got one here. Because I think I've asked you this, JF, but in the past. What do the debug colors mean when you're looking at the cells, whether it be runtime-- there's greens, there's reds, there's purples, there's blues, there's light blues. JEAN-FRANCOIS: So I don't know all of them, but I know that green is loaded, red is unloaded but waiting for garbage collection to ascend and unload all this stuff. Purple means that the level is currently being unloaded, but it's not on-- because it's an iterative process over several frames. So purple it means it's in the process of being unloaded and red it's unloaded but waiting for garbage collection. Yeah. CHANCE: Yeah. It's all happening asynchronously. So there's varying states between just on and off. And I think, too-- Oh, go ahead. JEAN-FRANCOIS: No, I just said yes to what you were saying. CHANCE: Oh, great. And I think, too, there's a really good something-- I can't remember who won the open world team mentioned this to me, but it helped me so much understanding what's going on behind the scenes. Stat Levels is a great command that just tells you everything that's trying to load. Just stat space levels, the same way you would do stat units, stat fps, stat GPU, or anything like that. It'll list out all the individual cells with their data layer hash and everything. And it's the same kind of thing. Green means loaded, light blue means loaded not visible or something like that. And so you can watch-- JEAN-FRANCOIS: It's even written at the right of the level name, if it's loading, unloading. It's written in there. CHANCE: Yeah, it's written in there. Yeah. So if you do a stat levels while you're moving around and doing stuff, not just in the hash view, you can see the state of the layers below you and what they're doing-- or the cells below you, and what you're doing, and what data layer itself is actually doing. So one thing we did for Valley of the Ancient early on was we were testing pre-fetching the entire Dark World to see if we could fit all that into memory so the transition could be a lot shorter. We actually ended up shipping with that disabled just because the first time you load the editor, it was going through the turn of trying to get everything loaded into memory. So you hit Play in editor and it's like a slide show for the first few seconds. So we didn't really want to do that. There's a way you can do that, I think, that's in the game mode script. We do a pre-fetcher, maybe, in the Level Blueprint. But that's a really great way to know, oh, everything is ready to go. Especially if you're using Blueprints to query the state of things. You can match what you see in stat levels with what your Blueprints are telling you is actually loaded, to make sure everything is set up appropriately. We used that heavily. Yeah, anyway, sorry. Just on the debug topic, I figured I'd mention it. JEAN-FRANCOIS: And just to get back to the stat levels that you just mentioned, it's a good way to see how much levels are generated. So you can go in PIE, use stat levels and you will see maybe 100 levels in flight and currently loading. And then you change your grid settings, double the size of the cells, and then you can see the direct impact on the number of levels that are loaded. And it's like four times less, just by doubling the number of cells. So you can see the impact of changing the grid settings directly. CHANCE: Very, very helpful tool. Very helpful tool. All right, back to-- VICTOR: We have two more questions. I think you just discussed a little bit, but these two questions comes from Rodolfo Pasadi. The first one was what tools does UE5 have to monitor amount of data being streamed per data layer and grid? JEAN-FRANCOIS: Apart from stat levels, we don't have tools right now to monitor these. But as I said before, we want to have heat map [AUDIO OUT] will show the amount of data per cell. So it's going to be a heat map-- or the runtime cells, not the editor cells, obviously. All of these tools are currently in the thought process. So there is nothing done yet. So yeah, that's in flight. VICTOR: And then the next question from Rodolfo is will there be support for data layers within data layers, or groups? JEAN-FRANCOIS: Yes, this is something that we've talked about. So I think a hierarchy of data layers, so if you activate a top level data layer, it's going to activate all the sub-data layers. That's something that we've talked about. Because the need has come up for some internal project. So yes. We are still going through the thought process of how it would look like, and how it would be to the user to understand how things are organized. But yes. CHANCE: Let's see, I've got a good one here. We touched on this earlier. But from Tyler, having the ability to change grid size is great, but is there a sweet spot where changing out numbers outside of the defaults are likely to be less performant. And I think the answer is depends on your game, depends on your platform, depends on numerous things that are important to you. But I think the defaults are pretty good just to poke around, as a good starting point. Is that right, JF? JEAN-FRANCOIS: So the defaults should be fine for most testings. But if you have a game that is very dense, or a game that has very dense areas and then some areas that are very sparse, you will have to tweak and will probably have to make two grid [AUDIO OUT] really different. Each game is different. One thing to mention is that the loading range is dynamic. So in game you can change the loading range dynamically. So let's say that you have some places in the map that you want to have a bigger loading range, and then you enter a city. You can just lower the loading range to get some memory back, because you're streaming more dense-- CHANCE: Right. I didn't know that. So that's great. So if you have a city that goes out into an expanse, like our Moab desert, you could have it small for when you don't see the things in the super far distance. Because everything here is really dense, you have a ton of stuff you're trying to load in, there's so much in memory at the same time, and it's all close to you. So you don't really care about anything outside of that, and you get really, really, really detailed in those spots. But maybe you enter a volume on one side and you're looking a specific direction, Blueprint logic that says, OK, when you're here, we can make the loading radius a lot bigger. You're going to be walking out this way, you drive a car out that-- unload everything behind you and everything in front of you is loading in, because you can see it all. That's great. VICTOR: Had another question from Loresh here, who's wondering what happens with these one Actor per cell setups if you need to change the editor's cell size later on? JEAN-FRANCOIS: OK. So editor cell size is really a helper. Because when you select cells in the editor to load, it's actually just doing an intersection between the bounding box of the cells and the Actors. So you can change that value as much as you want. The only thing is that you probably have to just reboot the editor. There is nothing that is tied to editor runtime cell-- editor [AUDIO OUT] so you can change-- it's not exposed, because there has been no real need to change that. But we could expose it, and change it, and just restart the editor. Everything's [AUDIO OUT] CHANCE: Want to touch on one here, I think we kind of mentioned earlier, but I don't know if the question was asked this way. So I have Simon Finney asks, how will projects transition from World Composition to World Partition. I mean, you talked about the transition itself being a little bit smoother because of the way that World Composition does streaming past a certain point. Will the commandlet work with that too, to move from a World Composition map setup to a World Partition map setup? JEAN-FRANCOIS: Yes. So the conversion commandlet will take-- when you have a world using World Composition, you have different layers with different streaming distances. So what we try to do in the conversion commandlet is to keep these distances and we create one grid [AUDIO OUT] streaming distance that you had in your World Composition. That that's an option. But if we want like to respect exactly the current setup, we do that. And since most of the World Composition games are set up using Tide level setups, it's easier for us just to convert the World Composition level to World Partition because of that. But as I said before, if you have custom logic to stream some sublevels or [AUDIO OUT] level streaming volumes, you will have to address these yourself post-conversion or during the conversion process. VICTOR: A little bit of chatter and questions in regards to not only horizontal World Partitioning, but potentially vertical. And there's a question from Roy Ossum, who is wondering will World Partition support 3D partitions? Can we use it for a space game? JEAN-FRANCOIS: The answer is yes. It's not provided in the official UE5-- the initial official UE5 release. This will contain only one type of grid which will be a 2D grid. But the system is done that you can extend and write your own grid. So the plan is that we will provide a fully 3D solution in the future. So you can have a space game, for instance. And we also want to provide grid type to support more traditional [AUDIO OUT] based games. So the answer is yes. But if you need at the moment of the UE5 release, you will need to write your own for that. CHANCE: OK. VICTOR: Chance, let's grab some of the questions-- I saw you started there-- from the forums, and then we also have some from previous streams. CHANCE: Right. VICTOR: We tackled dedicated-- CHANCE: It's funny, the 3D one, I think, knocked out seven or eight of the ones that-- VICTOR: Yeah, yeah it did. [INTERPOSING VOICES] JEAN-FRANCOIS: So there was a question on the initial announcement, about NavMesh. So I think the question was does NavMesh would be streamed? So for now, NavMesh is not streamed. I know that it's in the works from the team that handles NavMesh, but currently the NavMesh is always loaded. So it's generated partially using the partial loading of the world, but it's just stitching different parts and making one huge NavMesh for the whole world. And normally that's the server that it's going to [AUDIO OUT] and NavMesh doesn't make a difference. But if you have a single player game and you want to stream NavMesh , I don't think it's going to be there for 5.0. But it's planned for a 5.x release. VICTOR: It's a work in progress. JEAN-FRANCOIS: Yes. VICTOR: Right. I've got one here, because this is one that I asked you, I think, back in February. Is it possible to get a Blueprint callback for the data layer has finished loading? For what we're doing in Valley of the Ancient, you'll see, is we tell the system-- we tell a data layer system, or the World Partition system to load specific data layers. And then we do a quick query based on where our player is to look for those to be finished. And then we have that set up on a timer. I think I put it to something like a quarter of a second. So that way every-- that's four times a second, it's not wholly ticking. But when it's done, it clears that timer. Is there a plan to move that into-- so it's kind of like a callback, like a Blueprint event that we can bind to? JEAN-FRANCOIS: So this is a question that has been asked several times. Yes. Yes, it's possible. So right now you have to resort to doing polling, as you just described. But yes. It's something that we plan to do. We don't know how it's going to be-- if you would tie that to a specific Actor or just broadcast an event. It's not clear. But it's something that we have on our to-do list, for sure. CHANCE: Yeah, you'd have to have some persistent object that you could bind to. One of those delegates, right? JEAN-FRANCOIS: Yes. Unless you want to broadcast something to the level script. CHANCE: Right, right, right. Which you could probably do it in code right now, if you were to dig down and write something that way, and then broadcast that up. JEAN-FRANCOIS: Yeah. VICTOR: Next question comes from Sebastian Lutz, who's wondering is it possible to mix World Partition with a regular streaming 4D interior, probably for an interior building. JEAN-FRANCOIS: Yes. If you want to write some code for that, it's still possible to stream sublevels. In fact, I'm pretty sure that if you place sublevel streaming volumes, it's going to work. The only thing is that the level window is disabled in World Partition, so you won't be able to add sublevels directly to the-- but with some custom code, it's still there. So if you have parts of your game that you need to continue using that scheme, you could probably work around. CHANCE: And you wouldn't get any of the benefits of the patching and the loading of specific stuff, if you just loaded your other level. Unless it was converted, and then it's just converted, you're not streaming it in. JEAN-FRANCOIS: Exactly. Yeah. CHANCE: OK. VICTOR: Still going through and crossing out some of the 3D and vertical. JEAN-FRANCOIS: I think that's the-- is it the most requested thing on the chat, or? VICTOR: There were definitely quite a few questions in regards to that. But I got another one from Loresh here. Can lightning be baked into data layers similarly to how they can be baked into sublevels in UE4? When it works. JEAN-FRANCOIS: Yes. Yes. So when static lighting will be working, for sure we'll have to support data layers [AUDIO OUT] VICTOR: I think we lost you, JF. CHANCE: You've gone muted on us. JEAN-FRANCOIS: Am I back? VICTOR: Yes, you are. I did not expect that to work, all right. JEAN-FRANCOIS: Great. VICTOR: Fantastic. JEAN-FRANCOIS: So yes, we would have to support data layers for static lighting, the same way we support data layers for HLODs. Yes. So if you have a dark and light version of the world [AUDIO OUT] you will need two different versions of the static lighting. Yes. VICTOR: Loresh had another question on, I think, the same forum post. How should-- and I like this one-- how should UE4 levels be built today to best prepare them for a World Partition upgrade? JEAN-FRANCOIS: Yeah so one of the main thing is to make sure that you stream level based on distance. So if you're using World Composition, that's the best scenario. And if you're using-- some games have custom code to implement distance-based streaming directly in the game. But if you're using volumes, streaming volumes, make sure that they are evenly placed in the world. Because if you rely on the fact that this part will be loaded just from that radius, and that part will be loaded from that radius, it's not going to properly port to World Partition. Yeah. The main thing is to go away from custom code that is not just distance-based screaming. And don't rely on enabling and disabling levels. Let's say that you have some part of the world that trigger loading of a sublevel, just to do a scripted sequence or something like that. This will need to ported to be using data layers. That will need to-- some custom attention during the conversion process. CHANCE: I've got one for me in here, too. It's a silly aside, but does Chance like blueberries? And sometimes. I guess blueberry muffins, maybe in a smoothie. VICTOR: I had blueberries for breakfast. CHANCE: Oh, that's good. Vic likes blueberries. VICTOR: I love blueberries. CHANCE: I like most berries. Most parents are pretty good. Some of them, looking at you, blackberry. Not a fan, you're a little outside of my taste. VICTOR: I'm allergic to blackberries. CHANCE: Oh yeah, don't eat those. VICTOR: No. I try not to. CHANCE: They stain your clothes too. That's my big thing. They taste pretty good, but they stain my clothes. I get messy. VICTOR: Moving on. JEAN-FRANCOIS: No, I would just saying that I cannot eat blueberries, because the kids always eat them. CHANCE: Yes. VICTOR: Don't have that problem in my apartment here. CHANCE: It's off topic, but a blueberry is-- the juice purple, the inside is green, but the skin is blue. They're an enigma. I don't understand. Nothing makes any sense. VICTOR: Aren't bananas also technically a berry, if you're looking at it scientifically? CHANCE: Yeah. Would they be a yellow berry then? All right, folks. VICTOR: We digress? Yes, we digress. CHANCE: That never happens. I think you've done a pretty good job so far, JF. We're-- JEAN-FRANCOIS: We still have the forums. Yeah. VICTOR: Yeah. For everyone who might have joined late, missed some questions, or if you're looking for the future livestreams, check out the Events section in our forums. That's where we announce all of them. And that's where the best part to participate in the conversation post-stream takes place. So if you have more questions for JF, or if you want us to clarify something, go ahead and we'll link that in chat right now. And you can go ahead and ask your questions there, and we'll keep an eye on that thread. CHANCE: Yeah. I was going to say anybody that's working on things in UE5, first and foremost, we've seen all kinds of stellar stuff come out of the community already, posted online on the forums, and whatnot. Show us what you're working on with World Partition and some of these new-- and data layers, one file per actor, everything we've got in there. If you're working on some crazy large sprawling map, we'd love to hear about your experience there. Some of the things you're running into, things you thought you couldn't do that you can, or vise versa. We're always looking to hear from you. So yeah, just let us know. We're excited, we're excited to get this in your hands. JF, you've been working on this for quite some time now. It's probably super cool to see a bunch of people finally poking around with it. JEAN-FRANCOIS: Yes, yes. There's a lot of YouTube videos already, like how-tos. How to set up World Partition and things like that. And it's really fun to listen to these, and see what the community will do with that. CHANCE: Yeah, for sure. VICTOR: Final question from Qwah here, from the first stream. Does World Partition still use world origin shifting? JEAN-FRANCOIS: The answer is no. There is no support for that. And that's because we have another development in flight which is to support very large worlds. So world shifting is probably going away with that development. So more news to come, I guess. VICTOR: Yeah. Had another one good here from Mayhem Mirror. Is World Partitioning supporting procedural levels at runtime. And they're clarifying, for example, streaming different sublevels per tile each time you play. JEAN-FRANCOIS DUBE: No that's not something-- that's something that was possible before because you could have set up your game using like legal tiles. And then you just set up your streaming to choose randomly a sublevel that fits with the one that you want to stitch [AUDIO OUT] and that's not something that is possible right now, because we're just taking the whole world and putting that into sublevels. But I could see some extension that could be done to support that. But out of the box, World Partition don't support that. CHANCE: Seems like you could probably be very deliberate about how you set up your cells, and do a lot of your procedural generation of content inside Blueprints. And it might be a little heavy-handed to go for callbacks every time a specific cell is loaded to generate things, but you could pre-seed a lot of that and then put them out there. And build larger procedural worlds using that way, as opposed to using levels to stream them in. JEAN-FRANCOIS DUBE: Yes, exactly. But I guess that writing a new grid type for that would be the best solution, I guess. So the grid type controls everything, how things get packed into levels, and how things get loaded. I think it's a mix of what you just said and a new grid type. CHANCE: Cool, cool. VICTOR: Well, I think that might be it then. And I know that Chance would be very happy if that was it, because he has a very important meeting to go to. CHANCE: It's all good. This has been a great pleasure chatting with you all today. JEAN-FRANCOIS: Same, same. CHANCE: Super excited about this feature. Yeah, I'm really curious to see how it changes workflows for a lot of us that have been doing things the standard way, which is patchwork, big quilt style, putting stuff out in the space, rethinking it, chopping it up, like you said. We don't fit a memory on this console, so we've got to change that a little bit, or we don't-- I can't see this thing from there, so I got to make this one piece special for some reason, and make sure that it's always there at the end of my map. But kill it by the time I get there. Some crazy stuff. JEAN-FRANCOIS DUBE: I didn't talk about having per platform grid cell size and things like that. But that's something that we have also. CHANCE: Oh, fantastic. Yeah, that'll be a huge help for games that want to deploy across numerous types or classifications of platforms. JEAN-FRANCOIS: Yes. VICTOR: And I guess it's also worth mentioning that this is early access, and the last thing the documentation team wants to do is to write documentation on things that will most certainly change. And so for 5.0, full release, and in the future expect more documentation, samples, learning projects. Everything that we have for UE4 right now will be made available for UE5 as well. It's just early days and some things are still a little bit in flight, being worked on to make sure that they're as good as possibly can be. So stay tuned for that. I did see some questions about that as well. And you can just always expect that. New feature that we know is impactful in the industry, we'll probably go ahead and try to make sure that it's easy for you to learn how to use it. All right, well, I'm going to do my little outro spiel and then I think we'll get going. Appreciate everyone hanging out with us today. JF, big special thanks to you. I'm going to do that once again as well. CHANCE: Yes, thank you for the presentation. Super informative, even to me that's used the system. So thank you. VICTOR: And I was going-- go ahead, JF. JEAN-FRANCOIS: I just said you're welcome. VICTOR: I was going to say even though-- if you're experimenting with the new world building features and you don't have anything in particular that's super visually stunning or original, go ahead and still share your experience. We are very much inclined to know what that is like, even though it might not be the most stunning Lumen, Nanite, billions and billions of polys going on. We're still curious to see what your experience is. So go ahead and post that, and tag us on the forums or Twitter. If you've been watching from the start, thank you for hanging out. If you haven't, thank you for hanging out. I should probably add that to my little thing here. Thanks to everyone. We do go ahead and transcribe the livestream every week. And so if you were curious about a particular words we were using, or you weren't able to understand what we were saying. About within seven days of the time that we go offline we do have a manual transcript that our wonderful captioneer puts together for us. It gets added to the YouTube VOD, so go ahead and head over there. You can also download that PDF and actually go ahead and see all the timestamps when we said things. And so if the timestamps that we add to YouTube are not enough, you can go ahead and do a Control-F and search for some key terms there in that document to find when we were talking about it. And that is true for all of our livestreams. If you are new to Unreal Engine and you'd like to get started, you can access it from UnrealEngine.com. If you already have Epic Games launcher installed, you have a tab right there for Unreal Engine. You can ahead and download both UE4 and UE5. Easy as said-- easy as I said it. That's not an English expression. Moving on. Our meet-up groups are still throwing virtual meetings around the world. No physical in-person meet-ups are happening during the pandemic. But you can go to communities.unrealengine.com to find those groups. Go ahead and join them. If you are curious about forming one of the meet-up groups, there's a button in the top right corner to become a leader. You can go out and fill out that form and get in touch with us, and we will get back to you. As we mentioned previously all of our-- everything that's going on in the community is exciting. If you do want to go ahead and make sure that you let us know what you're working on, the forums are a good place. We got UnrealSlackers.org is our unofficial Discord community, as well as Facebook, Reddit, Twitter. We might go ahead and pick one of your projects as one of our community spotlights that we do every week on the Livestream. If you stream on Twitch, make sure you use the Unreal Engine tag, as well as the game development tag. Those are two good ones to make sure that you can find others that are working on content that you might be interested in. And make sure you follow us on social media. Hit the notification bell on YouTube. And prepare for next week when we're going to have Jeremiah Grant, Aaron Cox, as well as Kieran Ritchie on to talk about motion warping and full-body IK. And maybe we'll go ahead and solve the mystery of what happened to the missing slope warping demo that Jeremiah Grant promised during the Control Rig livestream a couple months ago. CHANCE: I'm just learning about this. Yes. VICTOR: That's next week, make sure you tune in for that. I've been following along with some of their prep, and they're getting ready to show off and break everything down that was happening in the Valley of the Ancient, and probably a lot more. I'm going to go ahead and prep for a long stream because last time we were hanging out for quite some time. With that said, once again, thank you JF for coming on, and Chance for helping me host the series here. It's been a pleasure. Anything else you'd like to leave the audience with today? CHANCE: JF? JEAN-FRANCOIS: Well, I guess use the system and share what you do with it. And post on the forums so we can iterate on making the system better. CHANCE: Yeah. I'm just glad to be here. Good to see everybody again. It's been, what, a week now? VICTOR: Yeah. And you'll be back next week. Or hopefully, I should say. We're planning for you to be back next week. That said, thank you both again. And thank you all out there. I hope you're staying safe. Until next week, stay safe. Fire one JEAN-FRANCOIS: Bye. [OUTRO MUSIC]
Info
Channel: Unreal Engine
Views: 83,744
Rating: undefined out of 5
Keywords: Unreal Engine, Epic Games, UE4, Unreal, Game Engine, Game Dev, Game Development, ue5, valley of the ancient, early access, global illumination, world partition, one file per actor, data layers
Id: RJfqytepZ0c
Channel Id: undefined
Length: 118min 31sec (7111 seconds)
Published: Thu Jun 17 2021
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.