Run it
Copy the script and paste it into your executor.
Players = :()
RunService = :()
player = Players.LocalPlayer
character = player.Character player.CharacterAdded:()
humanoid = character:()
rootPart = character:()
ACCELERATION_STEP =
NATURAL_FRICTION =
BALL_ROLL_DECEL =
RETRO_RUN_CAP =
SPINDASH_LAUNCH =
RETRO_JUMP =
currentMomentum =
isSpindashing =
isRollingBall =
spinDegrees =
humanoid.UseJumpPower =
humanoid.JumpPower = RETRO_JUMP
humanoid.WalkSpeed =
ScreenGui = .(, player:())
ScreenGui.ResetOnSpawn =
(text, pos, color)
btn = .(, ScreenGui)
btn.Text = text
btn.Position = pos
btn.Size = .(, , , )
btn.BackgroundColor3 = color
btn.TextColor3 = .(, , )
btn.Font = .Font.SourceSansBold
btn.TextSize =
.(, btn).CornerRadius = .(, )
btn
SpindashBtn = (, .(, , , ), .(, , ))
physicsMotor = rootPart:() .(, rootPart)
physicsMotor.Name =
physicsMotor.MaxForce = .(, , )
physicsMotor.Velocity = .(,,)
visualSpinSphere =
()
visualSpinSphere
visualSpinSphere:()
visualSpinSphere =
_, part (character:())
part:() part.Name ~=
part.Transparency =
character:() character.Animate.Enabled
character.Animate.Enabled =
()
()
targetColor = .(, , )
headPart = character:()
headPart headPart:() targetColor = headPart.Color
_, part (character:())
part:() part.Name ~= part.Transparency =
character:() character.Animate.Enabled character.Animate.Enabled =
sphere = .()
sphere.Name =
sphere.Size = .(, , )
sphere.Shape = .PartType.Ball
sphere.Color = targetColor
sphere.Material = .Material.Neon
sphere.CanCollide =
sphere.Parent = character
weld = .()
weld.Name =
weld.Part0 = rootPart
weld.Part1 = sphere
weld.C0 = .(, -, )
weld.Parent = sphere
visualSpinSphere = sphere
humanoid.StateChanged:((_, newState)
newState == .HumanoidStateType.Freefall newState == .HumanoidStateType.Jumping
isRollingBall =
()
newState == .HumanoidStateType.Landed
isRollingBall
isRollingBall =
()
)
RunService.Heartbeat:((deltaTime)
character rootPart humanoid physicsMotor
flatVelocity = .(rootPart.AssemblyLinearVelocity.X, , rootPart.AssemblyLinearVelocity.Z).Magnitude
isRollingBall flatVelocity < isSpindashing humanoid.FloorMaterial ~= .Material.Air
isRollingBall =
()
physicsMotor.Velocity = .(, , )
(isRollingBall isSpindashing) visualSpinSphere
weld = visualSpinSphere:()
weld
speedMultiplier = (flatVelocity < ) (flatVelocity + ) *
spinDegrees = (spinDegrees + (deltaTime * speedMultiplier)) %
weld.C0 = .(, -, ) * .(.(-spinDegrees), , )
isSpindashing
rootPart.AssemblyLinearVelocity = .(, rootPart.AssemblyLinearVelocity.Y, )
physicsMotor.Velocity = .(, , )
thumbstickInput = humanoid.MoveDirection
thumbstickInput.Magnitude >
isRollingBall
currentMomentum = .(, currentMomentum * (BALL_ROLL_DECEL ^ (deltaTime * )))
physicsMotor.Velocity = rootPart.CFrame.LookVector * currentMomentum
currentMomentum < RETRO_RUN_CAP
currentMomentum = .(RETRO_RUN_CAP, currentMomentum + (ACCELERATION_STEP * deltaTime * ))
currentMomentum = .(RETRO_RUN_CAP, currentMomentum - ( * deltaTime * ))
physicsMotor.Velocity = thumbstickInput * currentMomentum
rootPart.CFrame = .(rootPart.Position, rootPart.Position + .(thumbstickInput.X, , thumbstickInput.Z))
currentMomentum = .(, currentMomentum * (NATURAL_FRICTION ^ (deltaTime * )))
currentMomentum <=
physicsMotor.Velocity = .(, , )
driftHeading = rootPart.CFrame.LookVector
physicsMotor.Velocity = .(driftHeading.X * currentMomentum, , driftHeading.Z * currentMomentum)
)
SpindashBtn.InputBegan:((input)
input.UserInputType == .UserInputType.Touch input.UserInputType == .UserInputType.MouseButton1
flatVelocity = .(rootPart.AssemblyLinearVelocity.X, , rootPart.AssemblyLinearVelocity.Z).Magnitude
flatVelocity > humanoid.FloorMaterial ~= .Material.Air
isRollingBall = isRollingBall
isRollingBall
currentMomentum = flatVelocity
()
SpindashBtn.BackgroundColor3 = .(, , )
()
SpindashBtn.BackgroundColor3 = .(, , )
flatVelocity <=
isSpindashing =
()
SpindashBtn.BackgroundColor3 = .(, , )
)
SpindashBtn.InputEnded:((input)
input.UserInputType == .UserInputType.Touch input.UserInputType == .UserInputType.MouseButton1
isSpindashing
isSpindashing =
SpindashBtn.BackgroundColor3 = .(, , )
currentMomentum = SPINDASH_LAUNCH
launchHeading = rootPart.CFrame.LookVector
rootPart.AssemblyLinearVelocity = .(launchHeading.X * currentMomentum, rootPart.AssemblyLinearVelocity.Y, launchHeading.Z * currentMomentum)
physicsMotor.Velocity = .(launchHeading.X * currentMomentum, , launchHeading.Z * currentMomentum)
isRollingBall =
)
humanoid.Died:(()
()
physicsMotor physicsMotor:()
ScreenGui:()
)
this is a cool sonic script i made featchures:sonic movement and spindash

Universal