So I’ve set up a basic health initialization code:
UPROPERTY(Category = Gameplay, EditAnywhere, BlueprintReadWrite)
in the constructor I check if a default value has been set, if not, default to 1.
//Start with max health
if (MaxHealth == 0) MaxHealth = 1;
Health = MaxHealth;
In the BP, I have set MaxHealth variable of the player to 3.
Yet when I start the game, it’s still at 1. If I set it to 3 in C++, it starts at 3.
The ints used to be int16 but are now just normal ints, and I’ve had problems before with existing blueprints not updating with certain c++ changes and having to be entirely recreated and hoping that this is not the case. (Edit: I’ve tested this, new blueprints are also stuck with 1 HP)
The C++ constructor is the first thing ever that runs for a class. At the time the system knows that there is a default value in Blueprint, the constructor run is long past. Use BeginPlay in C++
When you say you’ve set it to 3 in the BP, what do you mean? Are you setting the property value in the editor or are you setting it via a blueprint call?
Thanks, it was indeed just an issue with the order of things!
Note that the C++ class is different from the “blueprint class” that is derived from the C++ class.
Thus, if you “spawn/construct object” and pass in the C++ class as the class reference, you get the C++ defaults.
If you “spawn/construct object” and pass in the blueprint class you make from this C++ class, you get the Blueprint defaults.
When exactly values form blueprint are assigned to variables?
Because UObjects don’t have BeginPlay.