Подобные способы взятия узлов ($AnimatedSprite, $Timer и прочие $...) стоит кэшировать, например: onready var this_sprite = $AnimatedSprite
onready var for_timer = $Timer
чтобы обращаться к ним так: this_sprite.play(«show») вместо $AnimatedSprite.play(«show»)
Становится менее наглядно, но следует помнить, что каждый такой $… аналогичен вызову get_node() и при использовании в цикле потери времени на это могут стать заметными. Попутно от подобного кэширования дополнительная польза на будущее, если целевой узел вдруг сместится в иерархии, то не надо будет править пути к нему по всему коду.
А так, вне циклов, обращения через $… более оправданы, в том плане, что так проще/нагляднее и потери могут быть почти неощутимы.
Просто в различных примерах, да и в исходниках, любят писать наглядным образом, везде используя $… Но есть вот такие нюансы, малозаметные пока подобных обращений в коде немного и они не начинают массово скапливаться в цикле.
Механики ловушек и интерактивных объектов в Godot Engine. Часть 2