Update I actually discovered more cases where Instanced falls short here is how to reproduce it:
Create new Actor class (in code!) and new UObject class.
In new UObject class call UMyClass add something like this:
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(ExposeOnSpawn)
TSubclassOf SomeClass;
Also make sure that UObject have
UCLASS(Blueprintable, BlueprintType, DefaultToInstanced, EditInlineNew)
Then In Actor class add this:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced)
TArray> MyClassesArray;
Then for testing pruposes override BeginPlay in actor and add this code:
for(TSubclassOf<UMyClass> item : MyClassessArray)
{
UMyClass* spawnedClass = ConstructObject<UMyClass>(item, this);
int32 SomethingToStopBreakPoint = 1;
}
Now, start editor, look for our actor, create blueprint out it (don’t change anything in blueprint defaults!), and place it on level.
Here is first thing.
Add new elements to MyClassesArray. They should have properly expose SomeClass property. Now change it. And voila, it changed for all elements in array! I’m not sure if that intended behaviour, but certainly not expected.
Ok. Now add breakpoint somewhere in BeginPlay() of our actor code, and play from editor.
Look at spawnedClass, SomeClass property. It will be null even though we have set some classes in editor. Again not sure if that is intended, but certainly not expected.
Edit.
Prooblem with
UPROPERT(EditAnywhere, BlueprintReadWrite, Instanced)
USomething* property;
Not being properly saved in actor component is also present in recent 4.7 branch.