How To Build Large-Scale Game Environment In Unreal Engine 5

June 20, 2025

UV Unwrapping

One of the first challenges I faced was UV unwrapping, especially with high-poly models using Nanite in Unreal Engine. Since it was my first time working with Nanite, I quickly realized I needed a clean and reliable UV workflow to keep texturing efficient and avoid slowdowns further down the line.

To improve this process, I spent about 3 weeks learning and testing different UV workflows in Maya, RizomUV, and ZBrush. This took some time to get used to, and each software offered different strengths through experimentation. By the end of the third week, I had developed a proper workflow that gave me clean results without unnecessary manual work.

UVs Before Sculpting: I began by unwrapping the base model in Maya before bringing it into ZBrush for sculpting. Starting with clean UVs early on made it easier to transfer UV sets back onto the sculpted or decimated version later. A helpful aspect of Maya is that it can transfer UV sets between meshes as long as they share the same name. This was especially useful for models that required multiple UV sets, as it streamlined the process without needing to manually rename or manage them during the transfer.

Post-Sculpt Workflow: After sculpting and decimating the high-poly model in ZBrush, I brought it back into Maya. I used Maya’s Transfer Attributes tool to project the original UVs from the base mesh onto the decimated version. This allowed me to keep the sculpted detail while retaining the initial UV layout.

UV Cleanup: From there, I cleaned up the UVs in both Maya and RizomUV. RizomUV was especially helpful for straightening UV shells, reducing distortion, and quickly packing them for optimal texture space.

Software Comparison

During this project, I worked with Maya, RizomUV, and ZBrush to find the most efficient UV workflow for my environment. Each had strengths, but based on how I work, I relied most on Maya and RizomUV.

Maya: Maya was great for initial unwrapping and handling UV transfers. I used it to create base UVs before sculpting and later to transfer those UVs back to the decimated mesh using Transfer Attributes. A bonus was that Maya transfers UVs automatically if the meshes have the same name, which saved time when working with multiple UV sets.

RizomUV: I used RizomUV for refining and cleaning up UVs after the base work in Maya. It gave me more control over shell alignment, spacing, and packing, which is especially helpful when optimizing UVs for texturing. Its auto-packing and layout tools made this phase fast and clean.

ZBrush: ZBrush was essential for sculpting but not ideal for UVs in my pipeline. Personally, I found its UV tools harder to work with and less suited to the modular, detailed assets I was creating. It just didn’t match my preferred workflow, so I focused on Maya and Rizom for UV tasks.

Material Layer Types

For this project, I used a Material Layering workflow rather than relying solely on traditional texture maps. This allowed me to create modular, reusable materials while maintaining high visual resolution on these massive UV sets, especially when working with high-poly assets supported by Nanite.

To give myself flexibility over UV usage, I implemented a UV Switch using a TexCoord node setup. This lets me toggle between two UV sets, ideal for models that require larger or more efficient texture space, such as walls, pillars, or large structural pieces.

Regular Material Layer

This layer is driven by an RGB mask, which allows up to three different textures to be applied within a single material instance. The Red, Green, and Blue channels each represent a different region on the model’s surface. This approach is especially efficient for applying combinations like rock, metal, and trim within the same material.

  • As shown in the node graph, I used scalar and vector parameters for properties like Albedo Tint, Normal Upscale, and Tiling. These are exposed in the material instance Material Instance graph to allow real-time tweaking.
  • I also used a Multiply node with a tiling parameter to control texture scale uniformly across all material inputs.
  • Normals were processed using a Parameter for upscaling normals, then connected to a FlattenNormal function to allow better scaling of the texture’s normal overlays later.