<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Unreal Engine Issues - Latest Fixes]]></title><description><![CDATA[Latest Bug Fixes For Unreal Engine.]]></description><link>https://issues.unrealengine.com</link><image><url>https://issues.unrealengine.com/favicon.png</url><title>Unreal Engine Issues - Latest Fixes</title><link>https://issues.unrealengine.com</link></image><generator>RSS for Node</generator><lastBuildDate>Mon, 12 Oct 2026 22:19:45 GMT</lastBuildDate><atom:link href="https://issues.unrealengine.com/fixes" rel="self" type="application/rss+xml"/><item><title><![CDATA[Niagara Data Interface "Errors and Warning" section on Module Details not updating when error messages change]]></title><description><![CDATA[<p>This is a regression: it worked correctly up to UE 5.5, but not in 5.6 or mainline latest. Possibly caused by CL 40093049.</p>

<p>Class UNiagaraDataInterface provides virtual method GetFeedback(), which allows the implementation to fill arrays containing errors, warnings, and information messages based on validation checks. When an error or warning is produced, the Details Panel for the Niagara Module that makes use of the Data Interface will display a generic section "Object has errors" (or "Object has warnings"), plus a customized section "Errors and Warnings" that list the detected issues and possibly contains "fix" buttons.</p>

<p>The validation checks performed by GetFeedback() can depend on data external to the Data Interface itself. For example, a Static Mesh Interface often needs to check if the linked static mesh asset has "allow cpu access" enabled. Up to UE 5.5, changing such external data caused the "Errors and Warnings" section to be updated correctly. Beginning on UE 5.6, however, the section seems to only be updated when a property of the Data Interface itself changes. This can lead to errors still appearing when they were already resolved (e.g. allow cpu access was already turned on but the error did not go away), or to error explanations not appearing at all when a condition triggers an issue (e.g. allow cpu access was turned off, section "object has errors" appeared, but section "Errors and Warnings" did not appear with the explanation and fix button).</p>

<p>(more info on the "callstack" field)</p>
<h3><a name="%C2%A0"></a> </h3>]]></description><link>https://issues.unrealengine.com/issue/UE-313704</link><guid isPermaLink="false">UE-313704</guid><pubDate>Fri, 09 Oct 2026 22:16:56 GMT</pubDate></item><item><title><![CDATA[Renamed controls creating duplicate curves in sequencer that once fixed up cause selection issues.]]></title><description><![CDATA[<p>When a control is renamed after it has already been animated in a sequence, the control curve name map needs to be fixed up. Once it is fixed, selecting the control in the world will not map the selection to the sequencer correctly.</p>]]></description><link>https://issues.unrealengine.com/issue/UE-371413</link><guid isPermaLink="false">UE-371413</guid><pubDate>Fri, 09 Oct 2026 20:01:46 GMT</pubDate></item><item><title><![CDATA[Deploy device not saved in Project Launcher]]></title><description><![CDATA[<p>The deploy device selected in project launcher custom profile does not get saved. After restarting the editor, all selections are cleared, and have to be re-selected in the deploy device every time.</p>

<p>This issue does not happen in 5.3.</p>

<p>This issue happens after CL 27589933, and the direct cause is <span class="error">&#91;Launcher.DeviceGroups&#93;</span> section not saved in <span class="error">&#91;Project&#93;</span>\Saved\Config\WindowsEditor\Engine.ini .</p>]]></description><link>https://issues.unrealengine.com/issue/UE-217944</link><guid isPermaLink="false">UE-217944</guid><pubDate>Fri, 09 Oct 2026 15:39:12 GMT</pubDate></item><item><title><![CDATA[Particle Random Value is the same for all particles with a Niagara Mesh Renderer]]></title><description><![CDATA[<p>A material using the Particle Random Value node returns the same value for every particle<br>
drawn by a Niagara Mesh Renderer. Particle transforms are not affected, only the random value.</p>

<p>This happens when Nanite is disabled for the project and a SceneCapture2D using<br>
"Use ShowOnly List" is present in the level.</p>

<p>It does not reproduce in 5.7. Setting r.GPUScene.UseReservedResources=0, which is the 5.7<br>
default, avoids the issue.</p>]]></description><link>https://issues.unrealengine.com/issue/UE-399300</link><guid isPermaLink="false">UE-399300</guid><pubDate>Fri, 09 Oct 2026 09:24:24 GMT</pubDate></item><item><title><![CDATA[Uploading of the SBT via copy queue is not guaranteed to be synced with async compute queue but only direct queue in d3d12 ]]></title><description><![CDATA[<p>When HitLighting is enabled, SBT commit is running on the Graphic Queue, and the pass "LumenSceneLighting-&gt;offscreenshadows-&gt;LumenDirectLightingHardwareRayTracingRGS" that uses SBT could run on the AsyncCompute Queue, so the fence Context.BatchedSyncPoints.ToWait.Emplace(Buffer-&gt;UploadResourceDataViaCopyQueue(Context, &amp;Data))  is not guaranteed that the LumenDirectLightingHardwareRayTracingRGS runs after the copy queue.</p>]]></description><link>https://issues.unrealengine.com/issue/UE-351043</link><guid isPermaLink="false">UE-351043</guid><pubDate>Thu, 08 Oct 2026 18:36:18 GMT</pubDate></item><item><title><![CDATA[GameplayTagEventMap is cleared on clients when "AbilitySystem.Fix.ReplicateTagCountContainerWithIris" is enabled]]></title><link>https://issues.unrealengine.com/issue/UE-381939</link><guid isPermaLink="false">UE-381939</guid><pubDate>Thu, 08 Oct 2026 16:27:30 GMT</pubDate></item><item><title><![CDATA[FGameplayTagCountContainer::Reset() leaves explicit tag state and causes counts to accumulate]]></title><description><![CDATA[<p><b><span class="error">&#91;Summary&#93;</span></b></p>

<p>In UE 5.7 and later, if a tag is added once to an <b>FGameplayTagCountContainer</b>, the container is reset, and the same tag is added once more, <b>GetExplicitTagCount()</b> returns 2 instead of the expected value of 1.</p>

<p><b>Reset()</b> clears only the hierarchical <b>GameplayTagCountMap</b>. It does not clear <b>Items</b>, which stores explicit tag counts, or <b>ExplicitTags</b>. Consequently, explicit state from before the reset survives and is accumulated by subsequent updates.</p>

<p>The <b>TagCountReset</b> sample project linked below calls the reproduction function automatically from the default Character's <b>BeginPlay ()</b>. The issue can therefore be reproduced by opening the project and starting PIE.</p>




<p><b><span class="error">&#91;Description&#93;</span></b></p>

<p>In UE 5.6.1, <b>FGameplayTagCountContainer:: Reset()</b> clears all three state containers:</p>

<p>1 <b>GameplayTagCountMap. Reset()</b>;</p>

<p>2 <b>ExplicitTagCountMap.Reset()</b>;</p>

<p>3 <b>ExplicitTags.Reset()</b>;</p>




<p>In UE 5.7, explicit count storage was changed from <b>TMap&lt;FGameplayTag, int32&gt;</b> <b>ExplicitTagCountMap</b> to <b>TArray&lt;FGameplayTagCountItem&gt;</b> <b>Items</b>. The updated <b>Reset()</b> implementation, however, clears only <b>GameplayTagCountMap</b>.</p>

<p><b>GetExplicitTagCount()</b> and <b>UpdateExplicitTags()</b> read and update <b>Items</b>, while <b>GetExplicitGameplayTags()</b> returns the separate <b>ExplicitTags</b> container. Because neither is cleared by <b>Reset()</b>, the old explicit count and tag remain. A subsequent <b>+1</b> update increments the stale count from 1 to 2.</p>

<p>At the same time, <b>GameplayTagCountMap</b> starts again from zero, leaving the hierarchical and explicit counts inconsistent within the same container.</p>




<p><b><span class="error">&#91;Results&#93;</span></b></p>

<p>UE 5.8.1 prints:</p>

<p>1 Tag Count: 1</p>

<p>2 Tag Count: 2</p>




<p>Immediately after the first update and <b>Reset()</b>, the observable state is inconsistent:</p>

<p><b>GetTagCount(Tag)</b>: 0</p>

<p><b>GetExplicitTagCount (Tag)</b>: 1</p>

<p><b>GetExplicitGameplay Tags(). HasTagExact(Tag)</b>: true</p>




<p><b><span class="error">&#91;Expected&#93;</span></b></p>

<p>After <b>Reset()</b>, the hierarchical count, explicit count, and explicit tag list should all be empty.</p>

<p>Adding the same tag once more should make the second <b>GetExplicitTagCount()</b> return 1.</p>

<p>1 Tag Count: 1</p>

<p>2 Tag Count: 1</p>




<p><b><span class="error">&#91;Suggested Fix&#93;</span></b></p>

<p>Clear <b>Items</b> and <b>ExplicitTags</b> together with <b>GameplayTagCountMap</b>, preserving the complete-reset behavior from UE 5.6.</p>

<p><span class="image-wrap" style="">[Image Removed]</span></p>]]></description><link>https://issues.unrealengine.com/issue/UE-389901</link><guid isPermaLink="false">UE-389901</guid><pubDate>Thu, 08 Oct 2026 16:25:02 GMT</pubDate></item><item><title><![CDATA[In 5.6, bWarningsAsErrors does not work with clang]]></title><description><![CDATA[<p>In 5.6, many warnings and errors specify their command line arguments to the compiler with these new C# attributes:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">    [WarningsClangToolChain([<span class="code-quote">"-Wno-date-time"</span>], [<span class="code-quote">"-Wdate-time"</span>, <span class="code-quote">"-Wno-error=date-time"</span>], [<span class="code-quote">"-Wdate-time"</span>], [nameof(StandardFilters.DeterministcFlagSetFilter)])]  
    [WarningsMSCV([<span class="code-quote">"/wd5048"</span>], <span class="code-keyword">null</span>, [<span class="code-quote">"/we5048"</span>], [nameof(StandardFilters.DeterministcFlagSetFilter)])]  
    [WarningLevelDefault(WarningLevel.Off)]  
    <span class="code-keyword">public</span> WarningLevel DeterministicWarningLevel  
</pre>
</div></div>

<p>However, there is a bug that these don&#39;t behave the same way in MSVC and clang.  Using this one as an example, warningArgs for MSVC is null because this defaults to warning level 1 already, but if you wanted it to be warning level 4, it would be <span class="error">&#91;&quot;/w45048&quot;&#93;</span>.  Let&#39;s say also that I change the warning level default to WarningLevel.Warning and purposely write code that causes it.  When MSVC receives both &quot;/Wx&quot; for warnings as errors and &quot;/w45048&quot;, that warning still becomes an error.  But when clang receives &quot;-Werror&quot; for warnings as errors and &quot;-Wdate-time -Wno-error=date-time&quot; in an attempt to enable the error and downgrade it to a warning, &quot;-Werror&quot; does <em>not</em> take precedence.  It is indeed downgraded to a warning, and the build succeeds.</p>

<p>I was able to fix this locally by changing ApplyWarningsToArgumentsInternal to check (toolChainContext._compileEnvironment.bWarningsAsErrors &amp;&amp; level == WarningLevel.Warning), and increasing level to WarningLevel.Error if so.  I&#39;m not sure if this is the same solution you would use, as there are probably other ways to handle this.</p>]]></description><link>https://issues.unrealengine.com/issue/UE-330663</link><guid isPermaLink="false">UE-330663</guid><pubDate>Thu, 08 Oct 2026 10:04:59 GMT</pubDate></item><item><title><![CDATA[Preview rendering does not update when slider is moved below 0.0 in timeline on in Niagara Editor.]]></title><description><![CDATA[<p><b>Workaround in UE5.3:</b></p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">
 UNiagaraComponent::TickComponent

            <span class="code-keyword">if</span> (AgeDiff &lt; 0.0f)
            {
                SystemInstanceController-&gt;Reset(FNiagaraSystemInstance::EResetMode::ResetAll);
<span class="code-comment">// modifier add
</span>                SystemInstanceController-&gt;ManualTick(UE_KINDA_SMALL_NUMBER, nullptr);
<span class="code-comment">// modifier add 
</span>                AgeDiff = DesiredAge - SystemInstanceController-&gt;GetAge();
            } </pre>
</div></div>]]></description><link>https://issues.unrealengine.com/issue/UE-191191</link><guid isPermaLink="false">UE-191191</guid><pubDate>Wed, 07 Oct 2026 16:23:32 GMT</pubDate></item><item><title><![CDATA[Substrate: FPrimitiveViewRelevance::operator|= bitwise-ORs SubstrateUintPerPixel, inflating the per-pixel byte count and asserting under the blendable GBuffer]]></title><description><![CDATA[<p>A crash can occur due to this check in Substrate.cpp when a material with 2 units and a material with 5 (20 bpp) uints are combined triggering :</p>

<div class="preformatted panel" style="border-width: 1px;"><div class="preformattedContent panelContent">
<pre>check(CurrentMaxBytesPerPixel &lt;= PlatformSettingsBytesPerPixel);</pre>
</div></div>



<p>This can happen with Niagara vfx that has two or more emitters whose materials compile to Substrate uint counts that bitwise OR above the maximum, with blendable Substrate enabled and r.Substrate.ProjectGBufferFormat=0.  The base class FMaterialRelevance operator|= function applies Max() to SubstrateUintPerPixel but the derived class FPrimitiveViewRelevance operator|= does not. When a material with 2 units and a material with 5 (20 bpp) uints are combined with | it results in 7 (28 bpp) which triggers the check().  A potential workaround is to add the missing Max():</p>

<div class="preformatted panel" style="border-width: 1px;"><div class="preformattedContent panelContent">
<pre>	/** Bitwise OR operator. Sets any relevance bits which are present in either. */
	FPrimitiveViewRelevance&amp; operator|=(const FPrimitiveViewRelevance&amp; B)
	{
	 const uint32 LocalSubstrateUintPerPixel = SubstrateUintPerPixel;
     
	 // the class is only storing bits, the following avoids code redundancy
	 const uint8 * RESTRICT s = (const uint8*)&amp;B;
	 uint8 * RESTRICT d = (uint8*)this;
	 for(uint32 i = 0; i &lt; sizeof(*this); ++i)
	 {
	 *d = *d | *s; 
	 ++s;++d;
	 }

	 SubstrateUintPerPixel = FMath::Max(LocalSubstrateUintPerPixel, B.SubstrateUintPerPixel);
	 return *this;
	}</pre>
</div></div>

]]></description><link>https://issues.unrealengine.com/issue/UE-400816</link><guid isPermaLink="false">UE-400816</guid><pubDate>Wed, 07 Oct 2026 11:45:41 GMT</pubDate></item><item><title><![CDATA[[Niagara][5.8] Data Channel Read and Write register with an identical type hash when fx.Niagara.DataChannels.Enabled is set from ini, hitting checkf in FNiagaraTypeRegistry::RegisterTypeInternal]]></title><description><![CDATA[<p><b>Affects:</b> 5.8 (verified on Release-5.8), Windows, Editor</p>

<h2><a name="Summary"></a>Summary</h2>

<p>Adding <tt>fx.Niagara.DataChannels.Enabled=true</tt> to an ini file makes the Niagara editor assert when a Data Channel Read is created. The same operation does not assert when the cvar is left untouched.</p>

<h2><a name="StepstoReproduce"></a>Steps to Reproduce</h2>

<p>Add the following to <tt>&lt;Project&gt;/Config/DefaultEngine.ini</tt>:</p>

<div class="preformatted panel" style="border-width: 1px;"><div class="preformattedContent panelContent">
<pre>[ConsoleVariables]
fx.Niagara.DataChannels.Enabled=true</pre>
</div></div>

<p>Then:</p>

<ol>
	<li>Launch the editor and open (or create) a Niagara System / Emitter.</li>
	<li>Create a Data Channel Read.</li>
	<li>The editor hits the checkf described below.</li>
</ol>


<h2><a name="ObservedResult"></a>Observed Result</h2>

<p>Assertion at <tt>Engine/Plugins/FX/Niagara/Source/Niagara/Private/NiagaraTypeRegistry.cpp:331</tt>:</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-cpp">bNeedsRegistration = !OldType.IsValid();
checkf(bNeedsRegistration || (NewType == OldType),
    TEXT(<span class="code-quote-red">"bNeedsRegistration: %d, NewType: %s, OldType: %s NewTypeHash: %x OldTypeHash: %x"</span>), ...);</pre>
</div></div>

<p><tt>NewType</tt> and <tt>OldType</tt> are two different types that resolved to the same <tt>RegisteredTypeDefIndex</tt>, and the <tt>NewTypeHash</tt> / <tt>OldTypeHash</tt> values printed by the assert are identical.</p>

<h2><a name="ExpectedResult"></a>Expected Result</h2>

<p>Creating a Data Channel Read does not assert, regardless of whether the cvar was set from an ini file.</p>

<h2><a name="Analysis"></a>Analysis</h2>

<h3><a name="1.RegistrationofthetwoNDCdatainterfaceshappensonlyinsidethecvarchangecallback"></a>1. Registration of the two NDC data interfaces happens only inside the cvar change callback</h3>

<p><tt>Engine/Plugins/FX/Niagara/Source/Niagara/Private/NiagaraModule.cpp:168</tt></p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-cpp"><span class="code-keyword"><span class="code-object">void</span></span> INiagaraModule::OnDataChannelsEnabledChanged(IConsoleVariable* Variable)
{
    ...
    FNiagaraTypeRegistry::Register(UNiagaraDataInterfaceDataChannelWrite::StaticClass(), Flags);
    FNiagaraTypeRegistry::Register(UNiagaraDataInterfaceDataChannelRead::StaticClass(), Flags);</pre>
</div></div>

<p>These are the only <tt>FNiagaraTypeRegistry::Register</tt> call sites for these two classes in the engine — there is no registration in <tt>StartupModule</tt> or anywhere else.</p>

<p>The cvar default is already <tt>true</tt> (<tt>bool INiagaraModule::bDataChannelsEnabled = true;</tt>), so writing <tt>=true</tt> in ini does not change the value, but the ini apply path still calls <tt>Set()</tt> and fires the change callback. The callback therefore runs during early startup, at a point where the <tt>UClass</tt> objects are not yet fully initialized and <tt>StaticClass()-&gt;GetFName()</tt> returns <tt>NAME_None</tt>.</p>

<h3><a name="2.TheruntimetypehashisderivedpurelyfromtheFNamechain"></a>2. The runtime type hash is derived purely from the FName chain</h3>

<p><tt>Engine/Plugins/FX/Niagara/Source/Niagara/Private/NiagaraModule.cpp:1659</tt></p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-cpp"><span class="code-keyword"><span class="code-object">void</span></span> FNiagaraTypeDefinition::GeneratePathNameHash()
{
    if (ClassStructOrEnum)
    {
        UnderlyingTypePathNameHash = GetTypeHash(ClassStructOrEnum-&gt;GetFName());
        <span class="code-keyword">const</span> UObject* Parent = ClassStructOrEnum;
        <span class="code-keyword">while</span> ((Parent = Parent-&gt;GetOuter()) != <span class="code-keyword">nullptr</span>)
        {
            UnderlyingTypePathNameHash = HashCombineFast(UnderlyingTypePathNameHash, GetTypeHash(Parent-&gt;GetFName()));
        }
    }
    <span class="code-keyword">else</span>
    {
        UnderlyingTypePathNameHash = GetTypeHash(NAME_None);
    }
}</pre>
</div></div>

<p><tt>Engine/Plugins/FX/Niagara/Source/Niagara/Public/NiagaraTypes.h:1195</tt></p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-cpp"><span class="code-keyword">friend</span> <span class="code-keyword">inline</span> uint32 GetTypeHash(<span class="code-keyword">const</span> FNiagaraTypeDefinition&amp; Type)
{
    <span class="code-keyword">return</span> HashCombine(HashCombine(Type.UnderlyingTypePathNameHash, GetTypeHash(Type.UnderlyingType)), GetTypeHash(Type.GetFlags()));
}</pre>
</div></div>

<p>The hash has only three inputs. When <tt>GetFName()</tt> returns <tt>NAME_None</tt> the name chain contributes nothing distinguishing, and <tt>UnderlyingType</tt> and <tt>Flags</tt> are identical for the two data interfaces (the same <tt>Flags</tt> value is passed at both call sites). All three inputs therefore match, so <tt>UNiagaraDataInterfaceDataChannelRead</tt> and <tt>UNiagaraDataInterfaceDataChannelWrite</tt> produce the <b>same</b> type hash.</p>

<h3><a name="3.Theregistrydedupesonthathash%2Csothesecondregistrationsilentlyaliasesontothefirst"></a>3. The registry dedupes on that hash, so the second registration silently aliases onto the first</h3>

<p><tt>Engine/Plugins/FX/Niagara/Source/Niagara/Private/NiagaraTypeRegistry.cpp:290</tt></p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-cpp"><span class="code-keyword">const</span> uint32 TypeHash = GetTypeHash(NewType);
...
if (<span class="code-keyword">const</span> int32* ExistingIndex = RegisteredTypeIndexMap.Find(TypeHash))
{
    NewType.RegisteredTypeDefIndex = *ExistingIndex;
}</pre>
</div></div>

<p>Both classes end up sharing a single <tt>RegisteredTypeDefIndex</tt>, i.e. a single entry in <tt>RegisteredTypes</tt>.</p>

<h3><a name="4.Theassertfireswhenacorrectlynamedtypelaterreachesthesharedindex"></a>4. The assert fires when a correctly-named type later reaches the shared index</h3>

<p>When a properly initialized Data Channel Read type reaches <tt>RegisterTypeInternal</tt>, it resolves onto that shared/stale index. <tt>OldType</tt> is valid so <tt>bNeedsRegistration</tt> is false, <tt>NewType != OldType</tt>, and the checkf at <tt>NiagaraTypeRegistry.cpp:331</tt> fires.</p>

<h2><a name="AdditionalNotes"></a>Additional Notes</h2>

<ul>
	<li><tt>GetPersistentTypeHash()</tt> in the same header uses <tt>GetPathNameSafe(Type.ClassStructOrEnum)</tt> rather than <tt>GetFName()</tt>, so it does not degrade to <tt>NAME_None</tt>. The runtime <tt>GetTypeHash()</tt> does.</li>
	<li>The checkf message already prints <tt>NewTypeHash</tt> / <tt>OldTypeHash</tt>, which makes the collision directly visible in the assert output.</li>
	<li>The same callback additionally runs {{FNiagaraWorldManager::ForAllWorldManagers([](FNiagaraWorldManager&amp; WorldMan)
{ WorldMan.GetDataChannelManager().Init(); }
<p>)}} and <tt>FNiagaraSystemUpdateContext Context; Context.AddAll(true);</tt> (commented "Re-init everything for now") during this early startup invocation, even though the cvar value did not actually change.</p></li>
</ul>
]]></description><link>https://issues.unrealengine.com/issue/UE-399252</link><guid isPermaLink="false">UE-399252</guid><pubDate>Tue, 06 Oct 2026 11:58:52 GMT</pubDate></item><item><title><![CDATA[Scrubbing the timeline in Sequencer can hang the editor when operating on constrained actors with complex control rigs]]></title><description><![CDATA[<p>The issue is caused by UAnimDetailsProxyManager::ForceUpdateProxyValue triggering evaluation of constraints that are attached to control rigs.  When scrubbing, requests to ForceUpdateProxyValue are repeatedly queued during the scrub action and then executed when the scrub stops.  This means we then call ForceUpdateProxyValue many times, evaluating whatever the constraint is attached to many times, which can cause frame rate issues or hangs when it’s a complex control rig.</p>]]></description><link>https://issues.unrealengine.com/issue/UE-396133</link><guid isPermaLink="false">UE-396133</guid><pubDate>Tue, 29 Sep 2026 19:25:58 GMT</pubDate></item><item><title><![CDATA[Chaos Mover crash in standalone editor client]]></title><description><![CDATA[<p>When using the Chaos Mover with resimulation enabled, standalone editor processes running as a client will crash around 80% of the time upon startup. </p>]]></description><link>https://issues.unrealengine.com/issue/UE-392454</link><guid isPermaLink="false">UE-392454</guid><pubDate>Tue, 29 Sep 2026 18:51:48 GMT</pubDate></item><item><title><![CDATA[Unexpected offset when using attach tracks with scene root components]]></title><description><![CDATA[<p>We noticed an inconsistency when using attach tracks, depending on whether or not the parent actor has a default scene root. This creates an unintuitive behaviour for animators.</p>

<p>It can be reproduced in 5.7 and 5.8.</p>]]></description><link>https://issues.unrealengine.com/issue/UE-396912</link><guid isPermaLink="false">UE-396912</guid><pubDate>Fri, 25 Sep 2026 03:06:28 GMT</pubDate></item><item><title><![CDATA[ObjectScale node in the material editor does not work with decals]]></title><description><![CDATA[<p>The ObjectScale node does not output the correct values in the material editor.<br>
This method works to tile images with a Surface Material Domain on a basic plane, but does not work when using it with the Deferred Decal Material Domain, and the decal stretches instead.</p>

<p>Reported in version 4.25.3 (CL-13942748); tested in version 4.25.3 and version 4.24.3 (CL-11590370)</p>]]></description><link>https://issues.unrealengine.com/issue/UE-97213</link><guid isPermaLink="false">UE-97213</guid><pubDate>Thu, 24 Sep 2026 20:09:41 GMT</pubDate></item><item><title><![CDATA[SceneCaptureComponent2D destroys shared Lumen Radiosity atlases every frame, breaking temporal accumulation in the main view]]></title><description><![CDATA[<p>A <tt>USceneCaptureComponent2D</tt> with <tt>bCaptureEveryFrame = true</tt> and <b>default post process settings</b> causes <tt>FLumenSceneData::IndirectLightingAtlas</tt> and <tt>RadiosityNumFramesAccumulatedAtlas</tt> on the <b>shared</b> <tt>Scene-&gt;DefaultLumenSceneData</tt> to be set to <tt>nullptr</tt> every frame.</p>

<p>This permanently resets Lumen Radiosity temporal accumulation for the main view, producing severe indirect-lighting flicker — most visibly in Lumen Reflections on water. Direct lighting is unaffected, which makes the issue look like Radiosity noise rather than a resource-lifetime bug.</p>]]></description><link>https://issues.unrealengine.com/issue/UE-396764</link><guid isPermaLink="false">UE-396764</guid><pubDate>Thu, 24 Sep 2026 17:59:17 GMT</pubDate></item><item><title><![CDATA[Occlusion Queries for Static Meshes with ERuntimeVirtualTextureMainPassType::Exclusive]]></title><description><![CDATA[<p>Static Meshes that draw into RVTs and have "Draw In Main Pass" is set to "From Virtual Texture" (ERuntimeVirtualTextureMainPassType::Exclusive) will still draw in Occlusion Queries. </p>

<p>This can be traced to `FStaticMeshSceneProxy::CanBeOccluded()`, which uses the function "FPrimitiveSceneProxy::IsRuntimeVirtualTextureOnly()" to check if the primitive should only render in RVTs. </p>

<p>This function only considers `ERuntimeVirtualTextureMainPassType::Never` (via `bVirtualTextureMainPassDrawNever`), unlike the similar function `FPrimitiveSceneProxy::DrawInRuntimeVirtualTextureOnly(…)`, which is used for other passes (BasePass, ShadowDepths, etc).</p>

<p>This issue might be shared with "FLandscapeComponentSceneProxy::CanBeOccluded()" as well.</p>]]></description><link>https://issues.unrealengine.com/issue/UE-366909</link><guid isPermaLink="false">UE-366909</guid><pubDate>Thu, 24 Sep 2026 13:09:42 GMT</pubDate></item><item><title><![CDATA[Regarding TObjectPtr performance regression]]></title><description><![CDATA[








<p>This is from the linked EPS case: </p>

<p>==============================</p>

<p>When 5.0 first introduced TObjectPtr, the guidance was that it would compile down to raw pointer access in Shipping builds to ensure identical performance.</p>

<p>Evidenced by the following quote from the documentation for 5.0:</p>




<p><em>UE5 introduces TObjectPtr, a template-based, 64-bit pointer system, as an optional replacement for raw object pointers in editor builds. This system adds dynamic resolution and access tracking in editor builds, while performing identically to raw pointers in non-editor builds.</em></p>




<p>In recent versions of the engine, this guarantee seems to have been silently dropped.</p>

<p>The introduction of incremental reachability analysis adds code to call ConditionallyMarkAsReachable, regardless of whether incremental GC is turned on.</p>




<p>This causes assembly instructions comparable to the following to be generated inline every time a TObjectPtr or TSubclassOf is assigned:</p>

<p><tt>cmp byte ptr <span class="error">&#91;UE::GC::GIsIncrementalReachabilityPending&#93;</span>,r14b</tt></p>

<p><tt>je _____+16Fh</tt></p>

<p><tt>mov rcx,qword ptr <span class="error">&#91;rbx+458h&#93;</span></tt></p>

<p><tt>test rcx,rcx</tt></p>

<p><tt>je _____+16Fh</tt></p>

<p><tt>call UE::GC::MarkAsReachable</tt></p>

<p>In our game, this adds several megabytes to our compiled binary size, putting pressure on the instruction cache and branch predictor.</p>

<p>Even though incremental GC is experimental and not even supported outside of single-threaded servers, right now every game is paying for the feature even when not enabled, due to `UE_OBJECT_PTR_GC_BARRIER` being unconditionally set to `1` in `ObjectPtr.h`.</p>




<p>My questions are the following:</p>




<ul class="alternate" type="square">
	<li>It would be nice if this code was automatically compiled out when incremental GC is off, instead of us having to randomly find out about the define during profiling.</li>
</ul>





<ul class="alternate" type="square">
	<li>This seems to unconditionally apply to every TSubclassOf as well, even when used as a parameter/local variable and GC barriers are unnecessary.</li>
</ul>





<ul class="alternate" type="square">
	<li>Inlining the check to `GIsIncrementalReachabilityPending` makes sense, but it might be worth moving the null object check into `MarkAsReachable` itself, which would reduce the binary size cost of the repeatedly inlined code.</li>
</ul>
]]></description><link>https://issues.unrealengine.com/issue/UE-386406</link><guid isPermaLink="false">UE-386406</guid><pubDate>Wed, 23 Sep 2026 12:29:30 GMT</pubDate></item><item><title><![CDATA[Unable to kill UnrealBuildTool, UBT no longer propegates sigterm]]></title><description><![CDATA[

<p>When UBT is launched through one of the standard wrapper scripts, Ctrl-C no longer cancels the build. The `dotnet UnrealBuildTool.dll` process and its compile actions keep running to completion in the background. UBT prints none of its usual cancellation output, and further Ctrl-C presses have no effect — the process tree has to be killed manually.</p>
]]></description><link>https://issues.unrealengine.com/issue/UE-393319</link><guid isPermaLink="false">UE-393319</guid><pubDate>Wed, 23 Sep 2026 09:05:49 GMT</pubDate></item><item><title><![CDATA[Linux Crash Reporter can fail due to exceeding crash malloc space when generating the report]]></title><description><![CDATA[<p>On Linux a crashing process can fail to produce a crash report at all. The crash folder is created and contains CrashContext.runtime-xml and Diagnostics.txt, but the copied log file is 0 bytes, CrashReportClient is never launched, and nothing is uploaded. The process exits with code 1.</p>

<p>Two lines are written to stderr when this happens:</p>

<div class="preformatted panel" style="border-width: 1px;"><div class="preformattedContent panelContent">
<pre>MallocCrash run out of memory allocating 1048576 bytes, free 893392 bytes
Please increase LARGE_MEMORYPOOL_SIZE, exiting...</pre>
</div></div>

<p>These go to stderr rather than the log, and the process ends in _exit(1), so buffered stdout is lost. Redirect stderr to a file to capture them.</p>

<p><b>Cause.</b> Once a crash is being handled, GMalloc is replaced with FPlatformMallocCrash. Its large pool is 2MB and Free() is a no-op for that pool, so every allocation made while generating the report is permanent. Linux and Android are the only platforms that install this allocator. When the pool is exhausted the process calls RequestExit(true) and the report is lost.</p>

<p>Two allocations dominate the pool:</p>

<ul>
	<li>Copying the engine log into the crash folder goes through IPlatformFile::CopyFile, which allocates a scratch buffer of min(1MB, log size). Any log larger than 1MB therefore takes half the pool in a single allocation.</li>
	<li>The all-thread callstack dump grows with thread count and is not bounded, and the accumulated thread XML is copied rather than moved when handed to the serializer.</li>
</ul>


<p>The larger the crash context XML, the more likely this crash reporting failure becomes, so projects with many enabled plugins are affected first: the enabled plugin list is recorded in the crash context.</p>

<p><b>Workaround.</b> Set unix.CaptureAllThreadStacksOnCrash=false. This restores crash reporting in most cases, at the cost of losing the per-thread callstacks.</p>]]></description><link>https://issues.unrealengine.com/issue/UE-397073</link><guid isPermaLink="false">UE-397073</guid><pubDate>Tue, 22 Sep 2026 21:40:17 GMT</pubDate></item></channel></rss>