Summary
An FText property overridden per-instance on an actor placed in a level is not applied when the level is loaded outside the editor. The object silently keeps the FText from its archetype — and not just the same string: it keeps the archetype’s text identity (namespace/key).
An override of any other property type, made on the very same component at the same time, is applied correctly: a float (World Size) and an object reference both survive, only the FText is dropped. The override is present in the saved level data, so nothing is lost at save time.
Play In Editor does not reproduce it, because PIE duplicates the in-memory editor world instead of loading the level from disk. Only Standalone Game and packaged builds are affected, which makes the bug easy to miss until a build ships with the wrong strings.
What Type of Bug are you experiencing?
Foundation (C++ Tools, Profiling, & Pipeline)
Steps to Reproduce
- Create a new Blank project.
- Create a Blueprint actor BP_Sign with a TextRenderComponent.
- In the Blueprint defaults, set the component’s Text to “ArchetypeText” and World Size to 26. World Size is a control value: a plain non-text property on the same component.
- Place one instance of BP_Sign in the level, in view of the Player Start.
- On that instance, override Text to “InstanceText” and World Size to 20. Save all.
- Press Play (Play In Editor) and look at the sign.
- Play → Standalone Game and look at the sign.
- Optional, for exact values: in the Standalone window press ~ and run: getall TextRenderComponent Text
Expected Result
Both Play In Editor and Standalone Game show “InstanceText” at the overridden World Size of 20, matching what the Details panel shows for that instance.
Observed Result
Play In Editor is correct: “InstanceText”, small.
Standalone Game shows “ArchetypeText”, still at the overridden small size. The size override is applied and the text override is not, even though both were set on the same component at the same time. Packaged builds behave like Standalone.
getall TextRenderComponent Text shows the instance holding the archetype’s localization key, not its own:
Loaded in an editor process: :PersistentLevel.BP_Sign_C_.TextRender.Text = NSLOCTEXT(“[]”, “”, “InstanceText”)
Loaded in a game process, from the very same files: :PersistentLevel.BP_Sign_C_.TextRender.Text = NSLOCTEXT(“”, “”, “ArchetypeText”)
The saved level data on disk does contain the override, so nothing is lost at save time.
Affects Versions
5.8
Platform(s)
Windows
Upload an image
Additional Notes
Scope of the problem, each line verified by loading one unchanged set of files twice, once in an editor process and once in a game process:
FText overridden per-instance on a placed actor’s component: LOST, the archetype value is used.
Same, with World Partition streaming enabled and with it disabled: lost in both.
Same, with One File Per Actor enabled and with it disabled: lost in both. So it depends on neither World Partition nor external actor packages.
FText set in the Blueprint defaults: correct.
FText stored in a Data Asset: correct, localization keys intact.
Non-FText override on the same component (float World Size): correct.
Object reference override on another component of the same actor: correct.
Nothing is special about the property declaration. It is the same as its working neighbours in the same component:
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category=Text, meta=(MultiLine=true)) FText Text;
The only type-specific difference I could find in the property system is that FTextProperty is the one property type whose equality — the basis of instance-override/delta handling — branches on GIsEditor:
TextProperty.cpp, FTextProperty::Identical_Implementation: // We compare the display strings in editor (as we author in the native language) return Identical_Implementation(ValueA, ValueB, PortFlags, GIsEditor ? EIdenticalLexicalCompareMethod::DisplayString : EIdenticalLexicalCompareMethod::None);
I did not trace the exact frame in the load path that drops the value, so treat the above as a pointer rather than a diagnosis. What is certain is that the same files loaded by an editor process and by a game process give different results.
Workaround: turn off localization for the text field in the Blueprint defaults, making it culture invariant. A culture-invariant FText is serialized as a plain string with no namespace/key and bypasses the localization path entirely (FText::SerializeText: bSerializeHistory = !Value.IsEmpty() && !Value.IsCultureInvariant()), after which per-instance overrides do reach the game. The cost is that such text is no longer gathered for localization, so this is not a solution for translatable strings.
Reproducing the two loads without launching the game window, if that is more convenient (the editor may stay open):
UnrealEditor-Cmd.exe .uproject -game -unattended -nosplash -nullrhi -NoSound -abslog=game.log -ExecCmds=“getall TextRenderComponent Text, quit”
The same command without -game loads the map in an editor process and prints the correct values.
Related but different:
UE-213566: also “correct in PIE, wrong in Standalone”, but it is about an outdated component hierarchy for a Level Instance at cook time. No Level Instance and no cook are needed here.
UE-219732 and UE-222390: per-instance values reset by a Blueprint or component recompile. Different trigger: nothing is compiled here, the value survives in the editor and is dropped only when the level is loaded outside it.
