Question: UObject created in constructor goes null afterward, but is fine in BeginPlay... why?

To best illustrate my issue - I have a class that I created that is a UObject called UCrosshairs. I created this as a utility class because I do not like monolithic massive main classes, and my character class was getting huge - so I broke it out into smaller sub-classes that control certain aspects of the character to better keep the class sizes smaller.

It was defined in my character h file:

UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Combat, meta = (AllowPrivateAccess = "true"))
	class UCrosshairs* UICrosshairs;

Then in the constructor of my character object I would instantiate my helper classes:

UICrosshairs = NewObject<UCrosshairs>();
UICrosshairs->Initialize(this);

Initialize is a method on UICrosshairs that takes in the character reference.

I could then pass in pointer to this object and everything was fine. Fast forward a few months and today I’m in my character class Blueprint.

I make a change to my camera boom in blueprint and that at that point breaks my code forever until I rollback my change.

Tracing the issue I discover that after the constructor finishes and I try to use UICrosshairs - it is now null automagically. Revert the blueprint change and it all works fine again.

I finally got this to work by placing the instantiation in BeginPlay instead of the constructor.

So question #1 is:
Why do I have to put this call in the BeginPlay portion instead of the constructor? What causes a UPROPERTY to suddenly go null after the constructor when it worked fine before and I made a change to a blueprint’s camera property?

Question #2
I have a scene component I’m instantiating:

ReloadHandSceneComponent = CreateDefaultSubobject<USceneComponent>(TEXT("HandSceneComponent"));

Now this one HAS to be done in the constructor. If you try to put this code in BeginPlay, you get a fatal error.

Why do some objects need instantiated in a constructor and others BeginPlay?

I’m coming from a lengthy 20+year C# background, but my C++ is intermediate. The fact that we have several ways to create objects in Unreal is something I’m trying to get tighter with and understand these apparent gotcha pitfalls that are a black hole of development time trying to figure out.

Thank you.

Seems like this may shed some light?

That it used to work before i made a change to the blueprint that used this class is still curious. The blueprint change was to a camera object’s boom arm length and had nothing to do with the crosshairs, but that stopped it from being instantiating in a constructor.