So basically, I'm trying to make a smooth slope moving system like Speed Run 4: https://web.roblox.com/games/183364845/Speed-Run-4

I tried it myself, but there's an issue.

The Code:

wait()

local plr = game.Players.LocalPlayer
local char = plr.Character
local human = char.Humanoid
local root = char.HumanoidRootPart

local bv = Instance.new("BodyVelocity",root)

local speed = 100

while wait() do
	local moveDir = human.MoveDirection
	
	if moveDir.Magnitude > 0 then
		local mass = 0
		
		for i,v in pairs(char:GetDescendants()) do
			if v:IsA("BasePart") then
				mass += v:GetMass()
			end
		end
		
		local rayParams = RaycastParams.new()
		
		rayParams.FilterDescendantsInstances = {char}
		rayParams.FilterType = Enum.RaycastFilterType.Blacklist
		
		local ray = workspace:Raycast(root.Position,Vector3.new(0,-4,0),rayParams)
		
		if ray then
			print("a")
			
			bv.Velocity = (moveDir * speed) * ray.Normal
		else
			bv.Velocity = moveDir * speed
		end
		
		bv.MaxForce = Vector3.new(100000,0,100000)
	else
		bv.Velocity = Vector3.new(0,0,0)
		bv.MaxForce = Vector3.new(0,0,0)
	end
end

What happens: https://gyazo.com/ad078f271d2407b4909cc9264809fd69

The problem: I'm not experienced with raycast normals and other things like cross and dot. What's happening is when I try to move, I just seem to be going downward when on the ground.

Be free to ask for more information, I really need help with this and I'd be very happy to get an answer. Thank you!