Hey devs! 
I want to know what to use to make a rail grinding system, just like in Sonic the Hedgehog.
Here is an example of it:

I really don’t need scripts, i just need someone to tell me what i should use to make this.
thanks for replying on this post!
talk to ya’ soon!
For the effects behind the character, you could create a ParticleEmitter and then CFrame the character in the correct direction down the rail until they jump off of it (you can decide what to do for that.)
You could also look into Tweening the character down the rail and then stopping the tween when they get to the bottom. Hope this helps!
2 Likes
i might try this out later, thanks for the reply!
heres a cookie! 
1 Like
Thank you that cookie was delish. 
1 Like
it came out well! i might make a V2, but this is the result of the rail grinding right now…
robloxapp-20210719-2155006.wmv (3.3 MB)
Thank you so much, I am glad it helped you! 
It looks great! I am curious to see exactly what you did and maybe I could give a few pointers, but could you share with me the rail grinding file or the code you used?
1 Like
sorry for responding late, but sure.
this is what i did:
local character = script.Parent
local humanoid = character:WaitForChild("Humanoid")
local rightgrind = humanoid:LoadAnimation(script:WaitForChild("Grind1"))
local leftgrind = humanoid:LoadAnimation(script:WaitForChild("Grind2"))
local cf1 = CFrame.new(workspace.Parts.Part1.Position)
local cf2 = CFrame.new(workspace.Parts.Part2.Position)
local cf3 = CFrame.new(workspace.Parts.Part3.Position)
local cf4 = CFrame.new(workspace.Parts.Part4.Position)
local cf5 = CFrame.new(workspace.Parts.Part5.Position)
local cf6 = CFrame.new(workspace.Parts.Part6.Position)
local cf7 = CFrame.new(workspace.Parts.Part7.Position)
humanoid.Touched:Connect(function(part)
if part.Name == "PartTouch1" then
if humanoid then
humanoid.WalkSpeed = 0
rightgrind:Play()
character:WaitForChild("HumanoidRootPart").CFrame = cf1
wait(.2)
character:WaitForChild("HumanoidRootPart").CFrame = cf2
wait(.2)
character:WaitForChild("HumanoidRootPart").CFrame = cf3
wait(.2)
character:WaitForChild("HumanoidRootPart").CFrame = cf4
wait(.1)
character:WaitForChild("HumanoidRootPart").CFrame = cf5
wait(.1)
character:WaitForChild("HumanoidRootPart").CFrame = cf7
wait(.1)
character:WaitForChild("HumanoidRootPart").CFrame = cf6
rightgrind:Stop()
humanoid.WalkSpeed = 1
end
end
end)
humanoid.Touched:Connect(function(part)
if part.Name == "PartTouch2" then
if humanoid then
humanoid.WalkSpeed = 0
leftgrind:Play()
character:WaitForChild("HumanoidRootPart").CFrame = cf6
wait(.2)
character:WaitForChild("HumanoidRootPart").CFrame = cf7
wait(.2)
character:WaitForChild("HumanoidRootPart").CFrame = cf5
wait(.2)
character:WaitForChild("HumanoidRootPart").CFrame = cf4
wait(.1)
character:WaitForChild("HumanoidRootPart").CFrame = cf3
wait(.1)
character:WaitForChild("HumanoidRootPart").CFrame = cf2
wait(.1)
character:WaitForChild("HumanoidRootPart").CFrame = cf1
leftgrind:Stop()
humanoid.WalkSpeed = 1
end
end
end)