If you want to check if a node exists, you need a way to identify it. Without that, the question doesn’t make sense.
You can identify a node by having a reference to it, and then use
is_instance_valid(node). If your script is the one adding its child, then you may keep a reference to the node in a member variable so that it will be accessible by all functions of your script as long as your parent node exists, like so:
child = SomeScene.instance()
I have noticed that you have edited your answer from your original one, they are both very helpful and insightful, thank you for taking the time and efforts to answer my question. The method works, now my instanced scene works nicely.
Idleman | 2020-09-12 06:55
One more question, not sure what the problem is, but if I instanced a few enemies. Some times the
is_instance_valid(node)returns false when there are still enemies node on the tree. Have you encounter instances like this? Thank you.
Idleman | 2020-09-13 00:21
is_instance_valid(node) will check if the
node in particular still exists. It obviously does not check if other instances of the same scenes exist, it only does one at a time. A variable can only contain one reference so if you re-use it when instancing more enemies, it will only contain whatever enemy you created last.
If you want to check if any instances of the enemy scene are present in the scene, you have several options:
Instead of keeping one in a variable, keep them all in an array, and check for the existence of all of them using a
for loop. However, it’s quite a clunky solution.
A better idea is to put your enemies in a group,
"enemies" for example. This way, at runtime, you can get the list of present enemies with
get_tree().get_nodes_in_group("enemies"), and check if it’s empty. I could not find a dedicated section of the doc, but it mentions one usage of them within a tutorial: https://docs.godotengine.org/en/stable/getting_started/step_by_step/your_first_game.html#removing-old-creeps
Another more complicated way is to iterate over all nodes of the scene and count the nodes that have their
filename property equal to
Zylann | 2020-09-13 00:32
I have tested it and you are right, the
is_instance_valid(node) only check the last instanced, and that is why sometimes it works and sometime it does not. Thank for providing ways to solve the problem, I think I will try to make the enemies send a destroyed signal from the enemy script, and use the signal to trigger following actions. Thank you again for the help.
Idleman | 2020-09-13 01:50