I’ve not experimented much with wall climbing, but recently I have been trying to learn how to do it.
I find walls by raycasting. When a valid wall is found, I position the character’s primary part CFrame to the intersection point of the ray + the surface normal. Then, I change the humanoid state to PlatformStanding, zero the HumanoidRootPart’s velocity, and parent the necessary BodyMovers or constraints.
To align characters to walls, I usually use a BodyGyro. I set the CFrame property to the LookAt matrix constructed from the position of the HumanoidRootPart and the surface normal of the wall.
I handle movement using a BodyVelocity object. You can use different BodyMovers or Constraint objects depending on what exactly you are doing. To find the axes for movement for a BodyVelocity object, I find two vectors orthogonal to the surface normal of the wall. Then, based on value of the humanoid’s MoveDirection property I update the BodyVelocity to move the character accordingly along the wall.
If you want to keep them directly against the wall even with resistance, you can change the BodyVelocity for something like an AlignPosition object or something else, but if my character is getting pushed out of their state by an external force (like a moving part or other player), I cancel the state instead of trying to force them to remain aligned.