This is where you learn the systems behind big-budget visuals and worlds. You won’t master each in an afternoon, but you’ll know what they are, when to reach for them, and how to start.
Up to now WISP works but looks like a programmer art prototype: an orb, some boxes, a flat light. This part is the cosmetic-but-load-bearing pass — the wow moment. Each headline system below gets a short, runnable lab that plugs straight into the Hollow you already built. Do them in order or cherry-pick; the conceptual sections stay so you understand why before the how. Everything assumes the canonical Wisp project with L_Hollow_3D open and content living under Content/_Wisp/.
Before you start: Niagara ships enabled by default. World Partition is on for any map created from a World Partition template. MetaHuman, MetaHuman Animator, and the in-editor MetaHuman Creator are plugins you may need to enable under Edit → Plugins (search “MetaHuman”, tick, restart). Commit a clean L_Hollow_3D first — every lab below is reversible, but a commit is your real undo button.
7.1 Nanite + Lumen + MegaLights (the visual trinity)
Covered in Part 4 — in production you combine them: Nanite for film-grade geometry, Lumen for dynamic GI/reflections (or Lumen Lite on weaker targets), MegaLights (production-ready in 5.8) for many dynamic shadowed lights at 60 fps — ideally paired with Lumen Hardware Ray Tracing. Add Virtual Shadow Maps (high-res shadows designed for Nanite) and Temporal Super Resolution (TSR) upscaling for the modern UE5 look.
For WISP these three are not decoration — they are the game. Every relit beacon should visibly bounce light into the Hollow (Lumen GI), cast crisp ray-traced shadows from its mesh, and stay cheap even when all five beacons are lit at once (MegaLights). The labs in 7.1a–7.1c turn those words into project settings you can toggle and see.
7.1a Lab — turn on the trinity for the Hollow
Project-wide render settings live in one place. Open Edit → Project Settings and search the left-hand filter for each term:
- Lumen: under
Engine → Rendering → Global Illuminationset Dynamic Global Illumination Method toLumen; underReflectionsset Reflection Method toLumen. (The Third Person template already defaults to Lumen on a desktop target — confirm rather than assume.) - Virtual Shadow Maps: under
Engine → Rendering → Shadowsset Shadow Map Method toVirtual Shadow Maps (Beta). VSMs are what make Nanite shadows sharp. Note that VSM is not something MegaLights and Lumen build on — for a MegaLights light it is just one optional per-light shadow method (the alternative, and default, being ray-traced shadows), and Lumen is a separate indirect-lighting system. - TSR: under
Engine → Rendering → Default Settingsset Anti-Aliasing Method toTemporal Super Resolution. This is the UE5 default and gives the soft, stable, upscaled image. - MegaLights: under
Engine → Rendering → Direct Lightingtick Enable MegaLights (production-ready in 5.8) — it will prompt to also enable Support Hardware Ray Tracing; accept. Then select each beacon’s light component and confirm its Allow MegaLights property is ticked so the light routes through the many-lights path. Each light also exposes a MegaLights Shadow Method property —Ray Tracing (Default)orVirtual Shadow Maps; ray-traced shadows are the default. To disable MegaLights per scalability level or device, use the console variabler.MegaLights.Allow 0(notr.MegaLights.Enabled).
Most settings prompt for an editor restart — allow it. To make Nanite obvious, select any Starter Content static mesh you use for a beacon plinth, and in its Static Mesh Editor tick Nanite → Enable Nanite Support, then Apply. Use the viewport View Mode dropdown (top-left of the viewport, default “Lit”) → Nanite Visualization and Lumen overlays to confirm each is actually running.
Test it: Play L_Hollow_3D in a darkened state, walk to a beacon, and relight it (your Part 5 interaction). The light should switch on and spill colored bounce light onto nearby walls and the floor — that secondary bounce is Lumen GI, not the direct light. Now duplicate the beacon four times so five lights are on at once and watch stat unit (Part 9): with MegaLights enabled the GPU cost should barely move compared to one light.
7.2 World Partition (open worlds)
- World Partition auto-divides a large level into a grid of cells that stream in/out based on distance, so you can build huge open worlds that don’t load all at once.
- Data Layers toggle sets of actors (day/night, story states).
- HLODs (Hierarchical Level of Detail) render distant cells as cheap merged proxies.
- One File Per Actor (OFPA) stores each actor as its own file so a whole team can edit the same giant level without merge conflicts — directly relevant to source control (Part 10).
- New in 5.8: experimental Mesh Terrain, a true-3D-mesh terrain system (caves, overhangs, floating islands) beyond the classic heightmap Landscape; and enhanced PCG (Procedural Content Generation) that lets artists hand-edit on top of procedural results.
Scope reality check — read before doing 7.2a. Converting WISP’s 5–10 minute zone to World Partition is optional and mostly educational. World Partition earns its keep only when the world is large enough that loading it all at once hurts — square kilometers, not one playable room. The Hollow is tiny, so streaming will rarely trigger and HLODs save you nothing. Do the lab to learn the workflow (you’ll need it on a real open world and for the OFPA/source-control story in Part 10), then keep the non-partitioned L_Hollow_3D as your shipping map.
7.2a Lab — a World Partition copy of the Hollow
Do this on a copy so your working level is untouched.
- In the Content Browser, right-click
Content/_Wisp/Maps/L_Hollow_3D→Duplicate, name itL_Hollow_WP. Open it. - Run the converter:
Tools → Convert Level(the World Partition convert commandlet is also exposed here). Accept the defaults; it rebuilds the level as a World Partition map and moves actors to OFPA. For a fresh open world you’d instead useFile → New Level → Open World, which is World-Partition-enabled out of the box. - Open the minimap:
Window → World Partition → World Partition Editor(sometimes shown as the World Partition tab). You’ll see the cell grid over a top-down minimap; clickBuild Minimapif it’s blank. - Add a Data Layer: open
Window → World Partition → Data Layers Outliner. Click+to create a Data Layer Asset — name itDL_Beacons, save it toContent/_Wisp/Data/. Select your beacon actors in the Outliner, right-click →Data Layers → Add Selected Actors to Selected Data Layer. Now toggle the eye icon onDL_Beaconsto show/hide the whole set — that is the day/night, story-state switch. - Build HLODs (optional on a zone this small):
Build → Build HLODs. On a tiny map you’ll see almost no proxies generated — that’s the point of the scope note above.
One File Per Actor (OFPA): after conversion, look in Content/_Wisp/Maps/L_Hollow_WP/ — the engine now creates an __ExternalActors__ folder where each actor is its own file. That is what lets two people edit the same level without a merge conflict; it also means your git status (Part 10) shows many small files instead of one giant .umap. Git LFS (set up in Part 0) handles these binary actor files.
Test it — in the editor (manual loading): The editor does not automatically stream cells as you fly the camera. Open Window → World Partition → World Partition Editor, drag-select a region of the cell grid, then right-click → Load Region from Selection; the actors in those cells load into the viewport. Right-click → Unload Region (the Unload equivalent) to send them back out. That manual load/unload is how you inspect cells while building.
Test it — at runtime (true streaming): Enable streaming, then Play (PIE) and move the player around the map. To watch cells stream in and out as the player moves, open the console (~) and run wp.Runtime.ToggleDrawRuntimeHash2D — it overlays the runtime cell grid so you can see tiles loading and unloading around the player. On a zone this small streaming will rarely trigger, which is exactly the empirical evidence that the Hollow is too small to need World Partition.
7.3 Niagara (VFX)
- Niagara is the particle/VFX system: fire, smoke, magic, weather, fluids. It’s node/stack-based and can read from and write to the scene, run on the GPU for millions of particles, and react to gameplay.
- Start from the template emitters, then customize. VFX is a deep specialty — learn enough to use existing systems and make simple ones.
WISP needs exactly three small effects and no more: a trail behind the wisp, a sparkle on each mote, and a flame on each lit beacon. None require authoring particles from scratch — you start from a template emitter and trim it down. Niagara terms: a Niagara System (NS_ asset) contains one or more Emitters; each emitter is a stack of modules (Spawn, Initialize, Update, Render). You attach a system to an actor via a Niagara Component.
7.3a Lab — NS_WispTrail (a small glowing ribbon)
- In
Content/_Wisp/VFX/right-click →FX → Niagara System. In the wizard choose New system from selected emitter(s) and pick a template close to a stream — the Fountain sprite emitter is a fine starting point (a continuous emitter you’ll shrink). Name the assetNS_WispTrail. - Open it. In the System Overview select the emitter, then trim it to a tiny glow:
- Emitter Update → Spawn Rate: lower to roughly
40. - Particle Spawn → Initialize Particle: set Lifetime to
~0.4s, Sprite Size small (e.g.6–10), and Color to a bright cyan with a high value (e.g. RGB0,4,5) so it reads as emissive/glowing. - Particle Update: add a
Scale ColororColor → Curvemodule that fades alpha to0over life so the trail dissolves. - Remove or zero any Gravity Force and Add Velocity so particles linger where the wisp was rather than spraying.
- Render: keep the Sprite Renderer; optionally swap to a Ribbon Renderer for a continuous streak (add a
Ribbonrenderer, then add theInitialize Ribbonmodule the editor prompts for).
- Emitter Update → Spawn Rate: lower to roughly
- Attach it to the wisp: open
BP_Wisp, in the Components panel+ Add → Niagara Particle System Component, name itWispTrailFX, parent it under the root/mesh, and set its Niagara System Asset toNS_WispTrail. Tick Auto Activate.
Test it: Play L_Hollow_3D and move. A short cyan glow should trail the wisp and fade out behind it. If it sprays outward, you missed a velocity module; if it never appears, check Auto Activate and that the component is positioned at the wisp’s center.
7.3b Lab — NS_MoteSparkle and NS_BeaconFlame
Same pattern, different feel:
- NS_MoteSparkle: new Niagara System from the Fountain/Sprite template. Lower spawn rate (
~10), short lifetime, tiny bright white-gold sprites, and add a small upward/outward velocity so it twinkles. OpenBP_Mote, add a Niagara Particle System Component set toNS_MoteSparkle, Auto Activate on. (On collect, your existing pickup logic destroys the mote, which stops the effect automatically.) - NS_BeaconFlame: start from the Niagara Embers or a smoke/fire template if Starter Content’s Niagara content is enabled; otherwise build from Sprite with an upward velocity, warm orange color, and a turbulence/curl-noise force for flicker. Open
BP_Beaconand add a Niagara Particle System Component namedFlameFXset toNS_BeaconFlame, but untick Auto Activate.
Gate the flame on relight. In BP_Beacon’s relight logic (the same event that turns the light on, from Part 5), add a node sequence:
Event Relight (Custom Event / your existing relight trigger)
-> (existing) PointLight: Set Visibility (New Visibility = true)
-> Get FlameFX (Niagara Component)
-> FlameFX -> Activate (Reset = true)
Test it: Motes should twinkle on the floor before you grab them. A dark beacon shows no flame; the instant you relight it, the flame ignites and the light turns on together. If the flame is always on, you left Auto Activate ticked or wired Activate to BeginPlay instead of Relight.
7.4 MetaHuman (realistic characters)
- MetaHuman creates fully rigged, photoreal digital humans. As of recent releases the creator is integrated inside the editor (no separate cloud app), and you can convert an existing mesh into a MetaHuman.
- 5.8 adds experimental MetaHuman Crowd — populate scenes with hundreds (mobile) to thousands (high-end) of crowd MetaHumans, orchestrated via Mass and rendered with Nanite, smoothly swapping between full Actors up close and cheap instanced meshes at distance.
- This is how you get AAA characters without a full character-art team — though rigging custom animation, faces, and clothing to a high bar is still real work.
7.4a Lab — BP_Keeper by the first beacon
The Keeper is the optional NPC guide from the capstone entity plan. Goal: a recognizable human standing by the first beacon with an idle animation — not a cutscene.
- Enable the plugin if needed:
Edit → Plugins, search “MetaHuman”, tick the MetaHuman Creator plugin (and MetaHuman Animator if present), restart. This also requires that MetaHuman Creator Core Data was selected when you installed the engine; if it wasn’t, modify the engine install to add it. - Create a character: right-click in the Content Browser →
MetaHuman → MetaHuman Character, name it (save it underContent/_Wisp/Characters/), then double-click it to open MetaHuman Creator inside Unreal — the whole workflow is in-editor now, with no “Send to Unreal” cloud step. Customize a preset face/body, then click Assemble to produce the game-ready assets — a Blueprint, a skeletal mesh, grooms, and materials. - Make it WISP-canonical: use the assembled Blueprint as your Keeper, or duplicate it within
Content/_Wisp/Characters/and rename itBP_Keeper(keep the referenced MetaHuman mesh/groom assets where they were generated; just re-point if the editor asks). - Give it an idle: open
BP_Keeper, select the Body (or the MetaHuman’s skeletal mesh component), set its Animation Mode toUse Animation Asset, and pick an idle from the MetaHuman/UE mannequin idle set (or any compatible idle anim sequence). For a one-shot guide that’s enough — no Anim Blueprint required. - Place it: drag
BP_KeeperintoL_Hollow_3Dnext to the first beacon, facing the player’s likely approach.
Caveat: MetaHuman gives you a rigged photoreal human in minutes, but bespoke animation, facial performance, and custom clothing are still real character-art work — budget accordingly. MetaHuman Crowd (the crowd system driven by Mass) is experimental in 5.8; do not put a crowd on WISP’s critical path. One Keeper is plenty for the slice.
Test it: Walk up to the first beacon. The Keeper stands there with a subtle breathing idle and reads as a real human against the dark Hollow. Frame rate should hold; if it tanks, confirm Nanite is on for the scene and you placed exactly one MetaHuman, not several.
7.5 Animation at scale
- Control Rig — build rigs and do procedural animation (IK, foot placement) in-engine.
- Motion Matching — data-driven locomotion that picks animation poses from a large database matching the character’s motion; far more natural than hand-built state machines. Epic ships a free Game Animation Sample project to learn from.
- Sequencer — Unreal’s cinematic/timeline editor for cutscenes, scripted moments, and (with the Movie Render Queue / Movie Render Graph, production-ready and graph-based in 5.8) film-quality rendered output. This is the same pipeline Hollywood uses for virtual production on LED volume stages.
7.5a Lab (optional) — a rigged Wisp via the Game Animation Sample
WISP ships fine as an orb. But if you want to see production locomotion, the cheapest path is to borrow Epic’s free Game Animation Sample, which is built entirely around Motion Matching.
- Get it: in the Epic Games Launcher → Unreal Engine → Samples, find Game Animation Sample and add it to a (separate) project on UE 5.8.
- Study, then migrate: open the sample, locate its Motion-Matching character Blueprint, the Pose Search Database, the Pose Search Schema, and the locomotion Anim Blueprint. These four assets are the heart of Motion Matching.
- Bring them across: right-click the sample’s character Blueprint →
Asset Actions → Migrate, and migrate it (it pulls the database, schema, animations, and skeleton as dependencies) into yourWispproject’sContent/_Wisp/Characters/. - Swap WISP’s pawn: in
BP_HollowGameModeset Default Pawn Class to the migrated rigged character (or re-parentBP_Wispand replace its mesh + Anim Blueprint). Keep your Glow/interaction logic; you’re only changing the body and locomotion.
Caveat: this is a genuine fork in WISP’s design — a rigged hero brings skeletal animation, retargeting, and collision-capsule tuning back as real work, which is exactly the burden the orb design avoided. Treat 7.5a as a learning detour on a branch (commit first), not a required milestone. Motion Matching itself is production-ready, but the integration effort is non-trivial.
Test it: Play and move/strafe/stop. With Motion Matching the character’s feet plant and the gait blends naturally with no visible state-machine snapping — compare that to the orb’s frictionless glide to feel why studios adopt it.
7.6 Production rendering & virtual production (context)
Unreal isn’t only a game engine — it’s the dominant real-time renderer for film/TV LED-volume stages (the Mandalorian technique). The cinematic tools (Sequencer, Movie Render Graph, nDisplay, Live Link mocap) overlap heavily with game cinematics. Worth knowing the path exists even if you only make games. For WISP you might one day record a 10-second “all beacons lit” flythrough in Sequencer and export it through the Movie Render Graph as a trailer clip — the same pipeline, scaled to a hobby slice.
7.7 New in 5.8 worth a look
- Toon Shader (experimental) — a Substrate-based shading model for 2D/anime/cartoon/hand-drawn looks across all platforms. Relevant if your “2D” ambitions are really stylized 3D.
- Unreal MCP plugin (experimental) — an open-standard gateway connecting LLM agents (Claude Code, etc.) to your Unreal project so they can drive the editor — covered in full in Part 8.
- Chaos destruction/cloth improvements and the node-based Dataflow system going production-ready.
7.8 Which lab should you actually do?
Use this to pick the one that buys WISP the most for the least effort:
| Lab | Effort | Payoff for WISP | WISP-canonical asset |
|---|---|---|---|
| 7.1a Trinity settings | Low | Highest — this is the “relight transforms the room” moment | Project settings + per-beacon lights |
| 7.3 Niagara FX | Low–Med | High — trail/sparkle/flame make it read as a real game | NS_WispTrail, NS_MoteSparkle, NS_BeaconFlame |
| 7.4a MetaHuman Keeper | Medium | Medium — one striking NPC; mostly “wow” not gameplay | BP_Keeper |
| 7.2a World Partition | Medium | Low for this size — workflow practice only | L_Hollow_WP, DL_Beacons |
| 7.5a Motion Matching | High | Optional — changes the whole hero design | Migrated rigged character |
Apply one to the Hollow this weekend, and commit it as its own milestone. Recommended first pick: 7.1a the visual trinity plus 7.3 Niagara, since together they create WISP’s wow moment for the least effort. Otherwise choose: (a) convert L_Hollow_3D to a small World Partition zone (L_Hollow_WP) and watch cells stream as you fly across it — remembering it’s optional and only earns its keep on a large zone; (b) build the Niagara wisp trail + mote sparkle + beacon flame (NS_WispTrail / NS_MoteSparkle / NS_BeaconFlame) and hook them to those actors; (c) add a MetaHuman Keeper (BP_Keeper) standing by the first beacon with an idle; or (d) replace the orb Wisp with a rigged character via the Game Animation Sample/Motion Matching. Lean on Lumen + MegaLights + Virtual Shadow Maps so each relit beacon visibly transforms the dark zone — that transformation is WISP’s wow moment.