I made a post a while back that splits text up into individual text labels, using GetTextSize and some basic math.
That post demonstrates how to make the text shake, but you could easily make it snake up and down by using TweenService, and the Quad, Quint, or Quart EasingStyle.
local TweenService = game:GetService("TweenService")
local tweenInfo = TweenInfo.new(
1, -- Time
Enum.EasingStyle.Quint, -- EasingStyle
Enum.EasingDirection.InOut, -- EasingDirection
-1, -- RepeatCount (when less than zero the tween will loop indefinitely)
true, -- Reverses (tween will reverse once reaching it's goal)
0 -- DelayTime
)
for _, TextLabel in pairs(TextLabels) do
local tween1 = TweenService:Create(TextLabel, tweenInfo, {Position = TextLabel.Position + UDim2.new(0,0,0,50)}) --50 is amount of pixels to snake up
tween1:Play()
wait(0.5)
end