Details Editor not editing individual data of UObjects inheriting from same base class

Hello, we’re encountering an issue with the Details Editor. I’ve created a simplified sample project to illustrate it.

The basic structure is something like this:

BasePass

- C++ Class deriving from UObject

- Has a single UPROPERTY “bIsEnabled”

BP_Pass_Test1, BP_Pass_Test2

- Blueprints inheriting from the BasePass class

- These are empty in the test project but mimics our real setup

BasePassGroup

- Another C++ class that inherits from BasePass

- Has an additional UPROPERTY “Passes” which is a TArray<TObjectPtr<UBasePass>>

BP_PassGroup_TestGroup

- A Blueprint inheriting from BasePassGroup

- It’s Passes property contains references to BP_Pass_Test1 and BP_Pass_Test2

For the issue: if you open the “BP_PassGroup_TestGroup” and change any of the “Is Enabled” checkboxes, they will all change simultaneously.

Debugging into it a bit, it appears that the PropertyNodes / DetailItemNodes all match the code structure as expected.

However, the DetailItemRows that get created seem to reference only the bIsEnabled property in BasePassGroup so they are all pointing to the same data.

This also means that the data of the BP_Pass_Tests are unaffected.

Is there something I’m missing with the data setup, or is this potentially a Details Editor issue?

Steps to Reproduce

  1. Open the DetailsEditorChild project
  2. Open the “BP_PassGroup_TestGroup” asset
  3. Attempt to toggle any of the “Is Enabled” check marks
  4. Note how all change at once

Hi Michael,

Unfortunately, this is indeed a known issue with the Details Editor for properties of instanced subobjects. The problem arises when an owner object contains an instanced subobject, and both of them have members assigned to the same category and subcategory. In that situation, the Details Editor will incorrectly show the subcategory of the owner object inside the instanced subobject. For example:

// === Example 1 ===
 
UCLASS(EditInlineNew)
class UTestSubObject : public UObject
{
	GENERATED_BODY()
public:
	UPROPERTY(EditAnywhere, Category = "A|B")
	int32 MySubInt;
};
 
UCLASS(Blueprintable)
class UTestOwner : public UObject
{
	GENERATED_BODY()
public:
	UPROPERTY(EditAnywhere, Category = "A|B")
	float MyOwnerFloat;
  
	UPROPERTY(EditAnywhere, Instanced)
	UTestSubObject* InstancedSubobject;
};

On Example 1, the Details Panel for TestOwner.InstancedSubobject will show MyOwnerFloat instead of MySubInt inside category A|B.

// === Example 2 ===
 
UCLASS(EditInlineNew)
class UTestBase : public UObject
{
	GENERATED_BODY()
public:
	UPROPERTY(EditAnywhere, Category = "A|B")
	int32 MyBaseInt;
};
 
UCLASS(Blueprintable)
class UTestDerived : public UTestBase
{
	GENERATED_BODY()
public:
	UPROPERTY(EditAnywhere, Instanced)
	UTestBase* SubObject;
};

On Example 2, which mimics your usage, category A|B also exists on both UTestDerived (via inheritance) and its internal SubObject, so the same problem occurs, although more subtle because A.B.MyBaseInt has the same name on both objects.

You can find another thread on this issue [Content removed] The bug’s tracking number is UE-230168, and although it was not made public by the engine devs, I can see here that it has been backlogged, so it might take a while until a fix is available. Meanwhile, as a workaround, I suggest simply dropping subcategories on UBasePass class (a single top-level category should work correctly).

I hope this is helpful. Please let me know if you need any further assistance.

Best regards,

Vitor

Hi Vitor,

Thanks for the reply. It’s good to know it’s a known issue.

We’ll attempt to avoid it in how we setup our data now and in the future.

Thanks,

Michael