Description

UActorComponents don't currently allow subobjects that are UActorComponents. However, this also prevents them from having "normal" instanced UObjects.

The UObjects can be added to an ActorComponent, but they aren't properly serialized / deserialized. This causes issues in the editor where, when the object is modified through the details panel, it will immediately revert to it's default value from the CDO (which is nullptr / None unless the object is created in code).

Steps to Reproduce
  1. Create a new UObject that is EditInlineNew.
  2. Create a new UActorComponent.
  3. Add UPROPERTY(Instanced) member that is a pointer to the newly created UObject.
  4. In a new blueprint, add the ActorComponent to an Actor.
  5. Place an instance of the Actor in the level.
  6. In the details panel, try to change the value of the UObject property.

Expected: The property is changed.
Actual: The property will be reset to None.

UCLASS(EditInlineNew)
class QAGAME_API UTestProperty : public UObject
{
	GENERATED_BODY()

public:

	UTestProperty()
	{
	}

	UPROPERTY(EditAnywhere)
	int32 value;
};

UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class QAGAME_API UQAMyActorComponent_Temp : public UActorComponent
{
	GENERATED_BODY()

public:	

	// Sets default values for this component's properties
	UQAMyActorComponent_Temp()
	{
	}

	UPROPERTY(EditAnywhere, Instanced)
	UTestProperty* Property;
};

Have Comments or More Details?

There's no existing public thread on this issue, so head over toAnswerHub just mention UE-42066 in the post.

0
Login to Vote

Fixed
ComponentGameplay - Components
Affects Versions4.144.15
Target Fix4.17
Fix Commit3386615
Main Commit3431398
CreatedFeb 16, 2017
ResolvedApr 10, 2017
UpdatedDec 13, 2018