I was able to fix this (or at least get to a place where it works) by looking at the official platformer demo. I set the platforms in my game to use a different collision layer and mask. Then I placed a
RayCast on my character which checks for these platform layers (I had the
RayCast point downward from the character). When the character lands on these platforms, it flips a variable to true. In the
move_and_slide_with_snap() function for the character, it changes that variable to false. In the demo, it looks like this:
var is_on_platform = platform_detector.is_colliding()
_velocity = move_and_slide_with_snap(
_velocity, snap_vector, FLOOR_NORMAL, not is_on_platform, 4, 0.9, false
This will work for what I have right now. Hopefully that's all I need for my character to move on platforms.