Last Week in Unreal: UE5 Stopped Counting (September 14 to September 20, 2026)

Unreal Engine Weekly: UE5 Stopped Counting
Week of September 14 to September 20, 2026 | 963 commits on ue6-main, 172 on ue5-main | Branch: ue6-main
Overview
The most consequential commit this week edits one file and changes no behavior. EUnrealEngineObjectUE5Version is now frozen: a static_assert makes any further append to the enum fail to compile, the global package version is edited only from //UE6/Main from here, and EUnrealEngineObjectUE6Version continues the same numbering in the same serialized slot (802d4310). The commit says that if a UE5-only global version bump is ever unavoidable, use the UE4 enum’s slot instead. That is a line being drawn, in code, about which branch the engine’s version number comes from.
The rest of the week reads like the same decision playing out. Four months of cook and DDC determinism work was gathered into //UE5/Main as a single changelist listing 34 incorporated CLs, which is the largest thing to happen to the 5.x stream in weeks and includes fixes this briefing covered on ue6-main back in August. Epic’s implementation of Adaptive Voxel-Based Order Independent Transparency landed on both branches inside the same window. And the AutoRTFM migration that last week’s build-file groundwork promised arrived, rewriting every build file in the tree that set the legacy flags.
At 963 commits the week sits at the top of the band this branch has held since June, three clear of two earlier weeks, so read it as a busy week rather than a record. Build is the top subsystem at 116, followed by rendering at 71, editor at 69, and core at 60.
Development Trends
The UE5 and UE6 boundary stopped being implicit
Pattern: three separate commits this week define the relationship between the two branches rather than just reflecting it. The UE5 object version enum froze with a compile-time guard and handed numbering to UE6 in the same serialized slot (802d4310, with the identical change landing on the maintenance branch the same day). Four months of determinism fixes were gathered into //UE5/Main in one changelist. AVBOIT landed on ue5-main and on ue6-main the same day (4402e92a). The ue5-main commits behind all three are cited in the 5.8 section below.
Interpretation: for three months this briefing has described ue5-main as maintenance and ue6-main as where the engine is going. That framing is now too simple. Traffic moves in both directions, and the version freeze is the clearest statement yet of what the split actually means: UE6 owns the format’s forward motion, UE5 keeps a frozen slot and receives backports. If you maintain a fork, the freeze commit is the one to read, because it tells you where your own custom version entries should now live.
Who cares: engine-fork maintainers, anyone carrying custom object versions, technical directors planning a UE6 merge.
Signal strength: Strong.
Agent tooling grew by half and gained its own engine module
Pattern: commits touching the toolset registry, the AI Assistant plugin, the experimental toolsets, and the new async tool-call module came to 30 this week, against 20 in each of the two prior weeks measured the same way, a half-again increase on a cluster that had been flat. The work has moved past capability and permissions into module structure and editor integration: the async tool call result was split into its own engine module, AsyncFunctionResult (3cbf8b56), toolsets backed by a function library are now tracked for validity and retired when their backing class unloads (9adf873e), and an editor-side prompt provider lets tools contribute AI Assistant menu entries without depending on the plugin, first consumer being a right-click “Analyze Crash” on Crash Diagnostics rows (d7b1a871).
Interpretation: a feature that needs its own engine module has stopped being a plugin. The Crash Diagnostics integration is the more telling half. Epic is not just exposing the editor to an agent, it is wiring the agent into the editor’s own diagnostic surfaces as a default affordance, behind a provider interface so the plugin can stay off by default and the menu entry still appear when it is loaded.
Who cares: tools programmers, pipeline and automation teams, anyone evaluating model-driven editor automation.
Signal strength: Strong.
UnrealBuildAccelerator’s single-author concentration has genuinely broken
Pattern: we have tracked this for six weeks. Counting commits touching UnrealBuildAccelerator the same way each week: Aug 31 to Sep 6 was 39 commits with 38 from one engineer; Sep 7 to 13 was 37 with 29 from that engineer and 7 from a second; this week is 19 commits with 10 from the second engineer, 7 from the original, and 2 from a third. Total volume also roughly halved.
Interpretation: the primary author is no longer the majority of UBA’s commit log, and that took three weeks to happen rather than one, which reads as a real handoff of ownership rather than a week of holiday cover. The work that came with it is not maintenance either. The memory watchdog rework (dd25c6ac) is the week’s most substantial UBA commit by some distance, and it comes from the newer engineer.
Who cares: build and CI engineers, anyone whose build farm depends on UBA.
Signal strength: Moderate.
The cook-determinism campaign reached the branch people ship from
Pattern: every week since early August has carried cook or cache determinism work on ue6-main. This week it crossed over. The gather changelist lists 34 incorporated CLs spanning May to September 2026, including the Blueprint RNG fix this briefing covered on ue6-main in the August 10 to 16 edition, material slot name derivation, static mesh lighting GUIDs, audio derived-data keys, and two numbered entries from a seven-part cook-metadata determinism series.
Interpretation: the campaign has been readable as UE6 hygiene for two months. Its arrival in //UE5/Main changes who it is for. If you ship on 5.8 and your incremental cooks have been invalidating more than they should, this is the changelist that addresses it, and the fixes have had months of soak time on the other branch before getting here.
Who cares: build and CI engineers on 5.8, anyone running incremental cooks on a farm.
Signal strength: Strong.
TL;DR
EUnrealEngineObjectUE5Versionis frozen behind astatic_assert, and the engine’s global package version is edited only from//UE6/Mainfrom now on, withEUnrealEngineObjectUE6Versioncontinuing the numbering in the same serialized slot (802d4310). If you carry custom object versions in a fork, read this commit.- If you ship on 5.8: four months of cook and DDC determinism work landed on
ue5-mainin one changelist listing 34 incorporated CLs, covered with its commit reference in the 5.8 section below. This is the week’s most actionable item for anyone still on 5.x. - UBA’s memory watchdog was comparing both of its thresholds against the commit limit, so on a 274 GB machine the kill threshold sat at 100.9% of physical RAM and could not fire before the machine paged (
dd25c6ac). The new modes default to the old behavior, so nothing changes until you configure it. - AutoRTFM’s migration reached the build files (
3a3da019), and the legacy module properties were marked obsolete three days later (83b47050). Out-of-tree modules get the deprecation warning now and the removal later. - Adaptive Voxel-Based Order Independent Transparency landed on both branches (
4402e92a, and onue5-mainas cited in the 5.8 section).r.OIT.Methoddefaults to it, but the shader permutations are a project opt-in that is off by default, so nothing changes in your project until you turn it on. - Horde’s Mongo index creation no longer blocks server startup, and a failed build no longer faults a collection for the process lifetime (
394690eb). Act now if you self-host Horde. - Ness became something you can switch on:
UE_WITH_NESS=1now enables it for any project without editing the target, and Lyra runs in its test job by default (708358b4).
Highlights
The UE5 object version enum is frozen
What changed
EUnrealEngineObjectUE5Version can no longer be appended to. The commit adds a static_assert so any further entry fails to compile, plus matching comments, and states the rule directly: the global package version is now edited only from //UE6/Main, and EUnrealEngineObjectUE6Version continues this numbering in the same serialized slot. If a UE5-only global version bump is ever unavoidable, the instruction is to use the EUnrealEngineObjectUE4Version slot instead. No code or format change, and the commit notes the added lines are byte-identical to //UE6/Main so the merge is conflict-free (802d4310). The same change landed on ue5-main the same day.
Why this is important
The object version enum is how the engine decides what a serialized package means. Freezing it is the moment the two branches stop being two lines of development that happen to share a format and start being one format with a defined owner. For anyone maintaining a fork, the practical consequence is immediate: a custom entry appended to the UE5 enum will now fail to compile, and the commit tells you where to put it instead. The instruction to fall back to the UE4 slot is also worth reading carefully, because it implies the UE5 slot is considered closed rather than merely full.
This is the kind of change that produces no release note and no behavioral difference, and then explains a class of merge conflict six months later.
Who should care
Engine-fork maintainers, anyone carrying custom object versions or serialization changes, technical directors planning a UE6 merge.
Urgency
Act now if you maintain a fork. Track otherwise.
UBA was throttling builds against a number the machine was not holding
What changed
The memory watchdog applied both of its percentage thresholds to the commit limit rather than to the quantity each threshold came from. The commit gives the consequence precisely: on a 274 GB machine the kill threshold sat at 100.9% of physical RAM and could not fire before the machine paged, and under MSVC, where commit peaks at 256 GB while resident never passes 147 GB, the build was throttled on a number 1.75 times what the machine was actually holding (dd25c6ac).
MemThresholdMode now selects how thresholds are derived and defaults to Legacy, so omitting every new key changes nothing. Split gives physical and commit their own wait and kill pairs compared against their own measured quantity, and Headroom uses the same two axes with each threshold set to its base minus a reserve in bytes. The commit states Headroom ships, with wait reserves of 0, meaning measured per tick from how far usage ran past the last published estimate, and kill reserves of 4 GB capped at 10% of their own axis so a fixed few gigabytes cannot become a quarter of a small machine. Dropping the busy-state sample interval from 1000 ms to 250 ms took p99 overshoot from 13.60 GB to 2.10 GB.
The measured result on a large game module against Legacy: clang went from 401.9s to 365.3s at 61.4 to 87.1 mean concurrency with no kills, and MSVC from 431.5s to 392.8s at 50.1 to 63.9 with 8 kills. Structurally, every throttle and kill decision now lives in MemoryWatchdog and reaches the scheduler through callbacks, so the scheduler keeps no memory state and takes no memory lock, and the racing check moved to its own thread, which means enabling the watchdog no longer disables racing.
Why this is important
A kill threshold above physical RAM is a safety mechanism that cannot engage, and the failure it was supposed to prevent shows up as a machine paging rather than as an error anyone attributes to the watchdog. The concurrency numbers are the part to note: the win is not primarily wall clock, it is that the build stops throttling itself on a number that was never the constraint. If you run UBA on machines with large amounts of memory, this is worth measuring rather than assuming.
The MSVC row still reports 8 kills after the fix, which is honest reporting rather than a clean result, and worth knowing before you attribute a killed action to your own configuration.
Who should care
Build engineers, CI and infrastructure teams, anyone running distributed compiles on high-memory agents.
Urgency
Act now if you run UBA on large-memory machines. The defaults are unchanged, so this is an opt-in you have to make.
AutoRTFM’s migration reached every build file
What changed
Across 90 build files, every bDisableAutoRTFMInstrumentation and bInjectAutoRTFMAttributeDisables assignment was replaced with AutoRTFM.DefaultMode, and every AutoRTFMExternalMappingFiles.Add call with AutoRTFM.ExternalMappingFiles.Add. The commit titles itself a migration of every .Build.cs, which in practice means every one that set those properties (3a3da019). The commit is explicit that it does not change behavior, that the legacy properties still exist and still work, and that they would be deprecated by the next changelist. Three days later they were: ModuleRules.bDisableAutoRTFMInstrumentation, ModuleRules.bInjectAutoRTFMAttributeDisables, and ModuleRules.AutoRTFMExternalMappingFiles are marked [Obsolete] naming their replacements, with the commit noting nothing in the tree uses them so the build is unaffected, and that they keep working for anything outside the tree until a final step removes them (83b47050).
Why this is important
Last week this was a prediction. The commit that added the ModuleRules.AutoRTFM property kept the legacy flags as facades and explicitly changed no build files, and we said the migration commit it promised was the one that would reach your build files. It did, in the same shape, one week later.
The sequencing is the useful part for anyone maintaining out-of-tree modules. The three steps so far are introduce, migrate in-tree, deprecate, and Epic has stated the fourth is removal. You are currently in the window where your build files still compile and now produce a deprecation warning. That window closes on Epic’s schedule, not yours, and the warning is the only notice you get.
Who should care
Anyone maintaining out-of-tree modules or a plugin distributed as source, build engineers, engine-fork maintainers.
Urgency
Act now. The change is mechanical and the deprecation is already live.
Order-independent transparency landed, and it is off by default
What changed
Epic implemented Adaptive Voxel-Based Order Independent Transparency, citing Drobot 2025 from Advances in Real-Time Rendering at SIGGRAPH 2025, covering both Nanite and non-Nanite translucency. It landed on ue5-main first and on ue6-main the same day, the latter with follow-up fixes squashed in (4402e92a). The ue5-main commits are cited in the 5.8 section below.
The technique approximates, for each event at depth z, the transmittance integral of everything in front of it, using a camera-aligned froxel volume. Occupancy of virtual slices is marked from the view-space depth ranges of visible translucent geometry and a prefix sum compacts them into physical slices, producing a depth-warp lookup table built on the GPU with no CPU readback. Translucent draws then splat extinction into that volume at reduced resolution, 1/8th by default, using InterlockedAdd. The commit is specific that no raster-ordered views are used anywhere and that the whole thing is built on plain UAV atomics, which is what distinguishes it from the existing r.OIT.SortedPixels MLAB path. Fully extinct 16×16 tiles emit depth-write quads so HiZ kills translucent pixels behind fully opaque smoke.
The switches matter more than the algorithm for most readers. r.OIT.Method selects at runtime, with 0 for none, 1 for AVBOIT as the default, and 2 for MLAB, and each falls back to standard sorted translucency where project or platform support is missing. The AVBOIT shader permutations are a project opt-in through r.AVBOIT.Support, which is read-only and defaults to off. Alongside it, r.Nanite.AllowTranslucentMaterials became a runtime toggle with a render state recreate sink, mirroring r.Nanite.AllowMaskedMaterials, where the previous r.Nanite.AllowTranslucency was read-only and needed a restart (ef4c92f9), and shader compile and stability fixes followed the same week (d4125ecf).
Why this is important
Read the two defaults together before you conclude anything shipped. The method selector defaults to AVBOIT, and the shader permutations that make it possible are off unless a project turns them on, so the practical default is unchanged and the fallback is ordinary sorted translucency. This is a feature made available, not a feature switched on.
There is also a content constraint stated plainly in the commit, and it is the sort of thing that costs a week if you find it by experiment: translucent materials must output their own luminance only. Materials that sample scene color self-composite the background, which the resolve then adds again. The commit calls this inherent to every transmittance-integral OIT, and says refraction and distortion are future work. If your translucent materials read scene color, evaluate that before evaluating performance.
Who should care
Graphics programmers, technical artists working on translucency-heavy content, anyone who has been maintaining a bespoke sorted-translucency workaround.
Urgency
Track, and read the content constraint before you schedule an evaluation.
Horde’s Mongo index creation stopped blocking startup
What changed
Index creation previously blocked server startup. The collection wrapper gated every operation on its index build, builds serialized behind a cluster-wide lock, and a build that failed three times faulted the wrapper, failing every subsequent operation on that collection for the process lifetime. Indexes are now built by a background MongoMaintenanceService registered ahead of all other hosted services. Operations are never gated on non-unique indexes; collections with unique indexes wait only until those are confirmed, bounded by a 30 second default. Only worker-mode writable instances build, others poll, and failures retry with capped exponential backoff. A unique build failing on duplicates moves all but the newest duplicate per key into a sibling .DuplicateQuarantine collection, copying before deleting, then retries (394690eb). Follow-ups reported build progress to the database audit log (9c51e0dd) and reordered things so unique indexes build first with the gate confirming them itself (19578c7b).
The same changelist added a diagnostics layer: operations issued during a request are stamped with a comment naming the caller, route template, and trace id, and an operation tracker retains the slowest of the last hour aggregated per user, route, collection, and command, surfaced through new admin-only endpoints and a Database Insights view.
Why this is important
The faulted-wrapper behavior is the one to internalize. A transient index build failure turning into permanent per-collection failure for the lifetime of the process is the kind of bug that presents as “Horde is broken, restart it,” which works, which means nobody diagnoses it. If you self-host Horde, this is a real availability fix, and the new diagnostics are the first time the server will tell you which caller is responsible for database load.
Who should care
Anyone self-hosting Horde, build infrastructure teams, studios running their own CI backplane.
Urgency
Act now if you self-host Horde.
The agent surface grew a module and a menu
What changed
The async tool call result was split into its own engine module, AsyncFunctionResult. It landed, was backed out, and relanded inside the window, and the relanded version reaches further, into the modular test runner (3cbf8b56). Around it, toolsets backed by a function library are now tracked for validity and retired when the backing class unloads, rather than lingering as registrations pointing at nothing (9adf873e).
The integration that matters is smaller. IEditorAIPromptProvider is a new editor-side interface in EditorFramework that lets tools contribute AI Assistant menu entries without depending on the AI Assistant plugin, which is off by default. The AI Assistant editor module implements it, so the section appears only while the plugin is loaded. The first consumer is Crash Diagnostics, which gained a right-click menu on crash rows with Copy Full Path, Open Containing Folder, and an Analyze Crash entry that opens a conversation about the crash under the cursor (d7b1a871).
Why this is important
A capability that needs its own engine module is no longer a plugin experiment, and a provider interface designed so the menu entry appears only when an off-by-default plugin is loaded is the shape of something Epic expects to be on for a lot of people later. The Crash Diagnostics choice is a deliberate one: it is the editor surface where a developer is already stuck, already has structured data in front of them, and has the least to lose from a model’s first answer being wrong.
Who should care
Tools programmers, pipeline and automation teams, anyone evaluating model-driven editor automation.
Urgency
Track.
Worth Tracking
Ness became something you can turn on. Twelve commits this week, down from last week’s twenty-one, but the shape changed. UE_WITH_NESS=1 is now a compile argument that enables Ness for any project without modifying the target directly, and Lyra is enabled by default in the Ness Test job (708358b4). Last week we said the commit messages do not explain what it is for and we were not going to guess. That is still true, and we still are not. What changed is that it now has an opt-in switch and a real game running through its test job, which is what a serialization layer does immediately before people outside the team are expected to try it. Keep it on the list.
A devirtualization option appeared with no discussion attached. bDevirtualizeFunctionCalls is a new target option enabling C++ virtual call devirtualization on the clang toolchain via -fwhole-program-vtables and -fforce-emit-vtables (7929ed04). The commit body is the title, and it carries four reviewers, which is more than most build options get. Whole-program vtables require link-time optimization to be meaningful, so this reads as connected to the distributed ThinLTO work that has been landing since early September rather than as a standalone flag. No measurements were published with it, which is the reason it is here rather than in the highlights.
What We Ignored
This week we ignored roughly 750 commits: localization automation, binary manifest drops for internal content pipelines, documentation generation, test-only fixes, editor UI polish, and the usual run of small cleanups. There were 17 commits tagged [Backout], inside the normal band for this branch and not a story on its own. Most relanded in-window, including the AsyncFunctionResult module split covered above and a fix making RigVM function libraries cook deterministically (a39dcf65, relanded at 3e145d8a).
Two that did not come back are worth naming, because both are cook-determinism work and this post spends a section arguing that campaign is going well. A cooker change serializing a null SoftObjectPath for paths pointing at objects found not to need cooking was reverted because it produced errors in AssetManager, which expects an array of FSoftObjectPath not to be empty (51aadf70). And a change skipping the GeometryCollectionComponent RestTransforms mismatch reset during cook, so that cooked output would stop depending on whether component registration ran before the save, was backed out on the last day of the window with no reland (46c3e48d). Both were still out of the tree when the week closed.
Of 963 commits, 210 worth reading. Scene graph and typed element work was the largest identifiable feature cluster at 65 commits, almost none of it individually notable, which is the same pattern that cluster has shown since August. Vulkan took a round of structural work including removal of the legacy VULKAN_ENABLE_DUMP_LAYER and VULKAN_ENABLE_WRAP_LAYER paths (2c1455fe) and buffer defragmentation support (cca2d1a4). Android fatal signal handling was reworked so the original faulting context is preserved and handed to the OS crash handler after engine reporting completes, times out, or the forwarded handler itself faults (ad9c3864). And a run of Clang 23 analyzer findings was addressed across the Win64 editor (d97fe6fc), which is worth knowing about if your own static analysis is about to get noisier for the same reason.
For teams shipping on 5.8
ue5-main ran 172 commits with 2 backouts, and this was not a maintenance week. Several items are worth a cherry-pick, and the first is the largest thing to reach this branch in weeks.
- Four months of cook and DDC determinism work arrived in one changelist. One changelist gathered cook, cook-metadata, and DDC determinism fixes from May through September 2026 into
//UE5/Main, listing 34 incorporated CLs (d360778e). The list is worth reading in full, because the fixes are individually small and collectively describe every way a cook can be a function of something other than its inputs: derived-data key collisions between sound waves sharing aCompressedDataGuid, non-deterministic texture coordinate data in cooked static mesh data, owner-derived shaderFriendlyNamevalues baked into content-addressed shader map values for both ComputeKernel and OpenColorIO, an uninitialized padding field serialized into cooked cloth render data, a randomStyleRuleRuleId minted during cook saves,UBodySetup::BodySetupGuidas a random bumped GUID rather than a content hash,UStaticMesh::LightingGuid, material slot names, hlslcc transcendental constant folding that was not cross-machine deterministic, and Blueprint RNG nodes routed throughFCookRand. That last one is the fix this briefing covered onue6-mainin the August 10 to 16 edition. Two of the entries are numbered parts of a seven-part “cook metadata determinism” series, so that series arrives only partially. The expensive cache bugs are the ones that produce correct output, and a cook that invalidates too often is indistinguishable from a project that is simply large. Expect invalidation on the first cook after taking it, for the same reason every determinism fix in this campaign has carried that cost. This is the week’s most actionable item for anyone on 5.x. - The UE5 object version enum froze here too (
93cb7201), the same change described in the highlights above. If you carry custom object versions on 5.x, the UE4 slot is now where the commit tells you to put them. - HLOD bakes could produce black virtual texture pages that never regenerated. HLOD captures rendered a fixed number of warmup frames back to back, so virtual texture feedback was rarely read back in time, tile production stayed throttled, and adaptive RVTs refined only one grid cell per frame, meaning textures were captured before the RVT had converged. Separately, in the editor, shaders compile on demand from the first draws that need them and the RVT page pass falls back to the default material until then, so the first bake of a session produced black pages that were never re-produced. Capture view families now disable VT throttling, warmup waits for the GPU, tiles covering the captured bounds are requested explicitly at the captured resolution, and a warmup that triggers shader compilation now finishes it and warms up again. It also fixes a crash when force-building several HLOD actors from the details panel, where the render state recreate context held raw pointers to garbage-collected components (
eaf526fb). - Depth of field mixed colors across depth layers. Tiles containing both foreground and background pixels selected higher mip levels, so heavily out-of-focus areas bled colors from different depth layers into neighboring pixels. Tiles with both now select mip 0. The same commit fixes Diaphragm DOF sampling NaNs during
CocFlattenMainCSon some platforms, and a recombine pass whose CoC radius disagreed with earlier passes when internal resolution was reduced, which produced blocky artifacts when upscaling (4676caf0). - Global distance field recaching during streaming was excessive. Deferred update flags are now cleared after any recache, only one streaming clipmap recapture is allowed per frame, and mesh SDFs too small to meaningfully affect the result no longer trigger a streaming recapture (
0a80d473). - Two landscape crashes, both in code paths you hit by accident. Loading an old landscape that predates edit layers crashed semi-randomly (
e26aa9a4), and a race condition crashed the landscape editor following an undo (448bfbab). - PCG crashed iterating destroyed execution sources in the tracking manager octree. Entries now hold a weak pointer and skip destroyed sources, and unregister from the owning world subsystem on
BeginDestroy(ae2a64d1). - Control Rig crashed when switching the control type of a spawned control, fixed and then improved in the same week (
ff852c4d,0599fff5). - Two UAF crashes: parallel module ticks resolving the same variable reference (
5ff5b1a4), andVariableReferencePropertyCustomizationused in a context providing no valid property utilities (74168ccd). - Sequencer leaked on level removal. Removing a level containing a level sequence actor leaked through GC (
340ec52c), and dropping an animation asset with the Anim Mixer plugin enabled asserted (906de4c1). - Editor crashed reopening a docked asset editor after reloading the editor layout (
5d4d8082), and Movie Render Pipeline crashed in the graph when rendering a sequence without audio while audio was enabled as an output (a37314fe). - AVBOIT is on this branch too (
a3f91409,669b3d63,a86b5948), with the same project opt-in default described above. Worth knowing it exists on 5.x before someone on your team reads about it and assumes it is UE6-only.
Closing
The commit that mattered most this week changes one file, adds a static_assert, and alters no behavior at all. It just decides, permanently, which branch the engine’s version number comes from. Those are the ones worth reading the log for: the changes that cost nothing today and constrain everything afterwards, and that no release note will ever mention because, strictly speaking, nothing happened.
Commit SHAs are cited inline, in parentheses, next to each claim. They reference the ue6-main branch of EpicGames/UnrealEngine unless the claim is in the “For teams shipping on 5.8” section, which references ue5-main. Many of the highest-interest entries resolve to Commit.gitdeps.xml binary-manifest blobs: the commit message is real, but the code lives in Epic’s internal binaries, which we cannot see.
Never miss a ue5-main update.
Get them delivered straight to your inbox.


