Quick answer: A PackedScene is exactly what’s saved in the .tscn. Editor “test” values you tweaked got serialized. Reset them, or always initialize runtime state in _ready from data.
An enemy scene spawns with 999 HP — the value a developer typed into the Inspector while testing. Every instance carries it because it’s saved in the .tscn.
The .tscn Is the Source
instantiate() produces a copy of whatever the scene file contains. If you changed a node’s exported property in the editor and saved, that value is now the default for every instance.
Reset Inspector Tweaks
Open the scene. Right-click any property showing the “modified” revert arrow → Revert. Save. Test values gone.
Initialize From Data, Not the Editor
func _ready():
# authoritative source: a resource or spawn config
hp = enemy_data.max_hp
speed = enemy_data.speed
If runtime state always comes from a data resource or spawn parameters, editor tweaks can’t leak in — _ready overwrites them.
Separate Authoring from Runtime
Keep balance numbers in a Resource (EnemyData.tres), not in the scene’s Inspector. The scene becomes “structure only”; data lives in resources you actually manage.
Verifying
Spawn many enemies. All start with the correct HP from data. Editing the scene for testing no longer changes spawned instances’ stats.
“A scene saves everything in it, including your test values. Drive runtime state from data instead.”
A good rule: if a number affects balance, it belongs in a .tres resource, not in a scene’s Inspector.