Run it
Copy the script and paste it into your executor.
Players = :()
RunService = :()
player = Players.LocalPlayer
(char)
.()
hum = char:()
root = char:()
root:() root.SonicRoot:()
topSpeed =
accel =
friction =
currentVel =
sprites = {
idle = ,
walk = {, , },
run = {, , , },
jump = {, , }
}
()
_, v (char:())
(v:() v.Name ~= ) v:()
v.Transparency =
()
char.DescendantAdded:(hide)
main = .()
main.Name =
main.Size = .(, , , )
main.Adornee = root
main.AlwaysOnTop =
main.ExtentsOffset = .(, , )
img = .()
img.Size = .(, , , )
img.BackgroundTransparency =
img.ResampleMode = .ResamplerMode.Pixelated
img.ScaleType = .ScaleType.Fit
img.Parent = main
main.Parent = root
frame =
timer =
fps =
RunService.Heartbeat:((dt)
char.Parent
timer = timer + dt
timer >= (/fps)
timer =
frame = frame +
move = hum.MoveDirection
move.Magnitude >
currentVel = .(currentVel + (accel * dt), topSpeed)
currentVel = .(currentVel - (friction * dt), )
hum.WalkSpeed = currentVel
state = hum:()
airborne = (state == .HumanoidStateType.Jumping state == .HumanoidStateType.Freefall)
airborne
fps =
frame > #sprites.jump frame =
img.Image = sprites.jump[frame]
currentVel >
fps =
frame > #sprites.run frame =
img.Image = sprites.run[frame]
currentVel >
fps =
frame > #sprites.walk frame =
img.Image = sprites.walk[frame]
img.Image = sprites.idle
frame =
move.X >
img.Size = .(-, , , )
move.X < -
img.Size = .(, , , )
)
player.Character .(initSonic, player.Character)
player.CharacterAdded:(initSonic)
he sonic!

Universal