Was trying to diagnose this problem for like 3 hours before realizing I was making a really simple mistake, was even in the process of making a different post about this problem before I figured it out. So using the animation player and animated sprite nodes in godot allows you to update animations in Process and PhysicsProcess as animations wont be reapplied on the next frame if it's the same animation. This doesn't seem to be the case with the SetAnimation method however since animations seem to keep reapplying every frame and will start at frame 0 of the animation even if it's the same animation, in other words pausing the animation in real time which confused the heck out of me.

I'm not sure if there's a better method than SetAnimation to use in Process or if you can use it in a way where it doesn't have to be protected in an If statement or something so it isn't being processed/reapplied every frame. If there's not I think this is a pretty important detail to include in the Godot runtimes documentation and it might save other users a little bit of a headache.

Related Discussions
...

I'm sorry, I can't follow. Are you calling set_animation() on the SpineSprite in process() all the time? Then yes, that will set the animation over and over again and your skeleton won't move past frame 0.

Gotcha, I was confused because the methods used for playing animations for the Godot Animation Player/Animated Sprite Nodes don't have this problem as they aren't reapplied every frame if it's the same animation playing, because of this you're able to switch between animations using logic that needs to be processed every frame. I figured spine's set_animation would work the same way so I spent like 3 hours testing and trying figure out why my animations were paused most of the time and I just figured I was using the wrong spine method or my code was messing something up. I realized later that it was just how the method worked and was intended so I think this information should be included in the method's description and maybe in the documentation for godot. Also is do you think there any way I could have set_animation work under process() / physicsprocess()?

Ah, gotcha. The spine-godot documentation does link to the general runtimes guide, which describes the animation state API in more detail, which should clear up the confusion. I can see now though that this might be confusing for someone who's coming from the Godot APIs.

Our API has been like this since 2013, and I'm afraid we can't change it to work more like what you are used from Godot, as that would break all projects using our runtime. However, it should be easy to add such a method yourself to a node deriving from SpineSprite. That method would take all the same arguments as set_animation but would first check if the animation that's currently being played back has the same name as the name passed to your set_animation "wrapper".

You can get the name of the currently playing animation on track 0 like this:

get_animation_state().get_current(0).get_animation().get_name()

Just replace the 0 with whatever track you are interested in. Also note that get_current() can return nil in case no animation has been queued on that track.

oh awesome, yeah that should work just fine, thanks for the quick response c:

I apologize for the stupid questions but my coding knowledge is kinda limited, so am I extending the SetAnimation method by changing the logic in it (I'm not sure how I would do that since I can't see source code for SetAnimation directly). or am I making a totally different method to replace SetAnimation, or am I making a method that first checks the current animation in an if statement, then uses the normal SetAnimation method? I'm guessing the second but knowing the logic already in SetAnimation would be helpful to make my own. Am I instead using the apply and update methods, I'm not sure where the current animation check should go.

Oh wait nvm I figured it out, I was being silly and not using my own string in the comparison check against get_animation_state().get_current(0).get_animation().get_name(). Not sure how to delete a post so uh ignore the silly question I guess lol.

There are no stupid questions when it comes to programming! Glad you figured it out.