Run it
Copy the script and paste it into your executor.
--// Smooth Wall + Edge Transition Script
--// LocalScript in StarterPlayerScripts
local Players = game:GetService("Players")
local UserInputService = game:GetService()
RunService = :()
player = Players.LocalPlayer
char = player.Character player.CharacterAdded:()
hum = char:()
root = char:()
wallMode =
wallCheckDist =
floorCheckDist =
climbSpeed =
stickForce =
rotateSpeed =
UserInputService.InputBegan:((input, gpe)
gpe
input.KeyCode == .KeyCode.X
wallMode = wallMode
(wallMode )
wallMode
hum:(.HumanoidStateType.Freefall)
)
RunService.Heartbeat:((dt)
wallMode
root hum
rayParams = RaycastParams.()
rayParams.FilterDescendantsInstances = {char}
rayParams.FilterType = .RaycastFilterType.Exclude
forwardRay = :(root.Position, root.CFrame.LookVector * wallCheckDist, rayParams)
downRay = :(root.Position, -root.CFrame.UpVector * floorCheckDist, rayParams)
surfaceHit = forwardRay downRay
surfaceHit
normal = surfaceHit.Normal
moveDir = hum.MoveDirection
forward = -normal
up = .(, , )
right = forward:(up)
up = right:(forward)
.(normal.Y) >
uprightCF = .(root.Position, right, .(,,))
root.CFrame = root.CFrame:(uprightCF, rotateSpeed)
wallCF = .(root.Position, right, up)
root.CFrame = root.CFrame:(wallCF, rotateSpeed)
moveDir.Magnitude >
surfaceMove = (moveDir - normal * moveDir:(normal)).Unit
climbVel = surfaceMove * climbSpeed
normal.Y <
climbVel += up * (climbSpeed * )
root.AssemblyLinearVelocity = climbVel - normal * stickForce
root.AssemblyLinearVelocity *=
hum:(.HumanoidStateType.Freefall)
)
you can now walk on walls (i will edit this later)

Universal