You’ve effectively given your spatial hp. The fact that you’ve put it in a child object doesn’t matter. The spatial is still the game object.
Proper separation, you’d have a separate Unit object. It would have hp, position, rotation, etc… every frame you’d move your loaded models to the position of your units. Your game logic would operate on the Unit objects.
Presumably you are not actually pointing a gun at your screen and shooting the objects. I imagine there is a mouse click and then scene picking involved, etc… already half a dozen layers of abstraction. So why operate directly on the Spatial instead of getting the game object for the spatial and operating on that?
What if one of your units wants to shoot another unit? Is it also going to do mouse picking?
But anyway, if you want to continue down the road you are on (until it all collapses under its own weight and you rewrite from scratch and can address all of these issues) then there are other ways to do what you want that don’t require extending Spatial/Node.
UnitStats could have been a control, for example.
Of if you just want to shove values onto your spatial then there us setUserData()/getUserData().
I will note that in my own games, usually the only user data I have is the object ID so I can find the game object for the spatial in those cases I need it. (100% of the time because of user interaction.)