So after searching around today trying to implement this in my game and not finding any really great examples, I worked out somewhat of a solution. So far it seems to work well and allows for a threshold to kind of mimic the way it works in Unity. It's written considering you're using a RayCast3D node as a child of the CharacterBody3D(in this case, Pivot is child of CharacterBody3D to handle camera rotation, StairRaycasts is a container Node3D child of Pivot to add additional raycast checks if needed after more testing, and then HeightCheck is the RayCast3D). The parent StairRaycasts is positioned a hair forward from the CharacterBody3D's CollisionShape3D and it's Y Position is set to 1, only reason I'm noting all of this is due to the way the code works basing it off of being at that height. My character controller script uses playerMovementVelocity that is just a variable that gets passed into Velocity for MoveAndSlide() so this is simply increasing it's Y value for the distanceTo between the RayCast3D's position and whatever "floor" it's hitting, if anyone thinks it can help them out but need the full script to make sense of it I can post that but this should be pretty easy to make sense of just looking at the code. Keep in mind this is just something I'm playing with but so far it's handling little differences in terrain quite well and also worked great on a little set of test steps I made, also doesn't seem to cause any negative effect to how the CharacterBody3D handles slopes by default.
// **** TEST CODE FOR STAIR RAYCAST
RayCast3D testray = GetNode<Node3D>("Pivot").GetNode<Node3D>("StairRaycasts").GetNode<RayCast3D>("HeightCheck");
Vector3 testraycollisionpoint = testray.GetCollisionPoint();
float distanceto = testray.GlobalPosition.DistanceTo(testraycollisionpoint);
var collidedwith = testray.GetCollider();
GD.Print("distance to ray collision " + distanceto);
GD.Print("collided with " + collidedwith);
// 1 seems to be a solid value when walking on moveable ground, goes to 0.78 when running into step that can't be climbed
// will need to add threshold to compare 1(normal value) to (how far below 1 to allow step up)
// USING 1 FOR THE Y POSITION OF RAYCAST PARENT HITS GROUND AT 1.00XX, THRESHOLD SHOULD BE IN 0.XX VALUE
float threshold = 0.5f;
//if (distanceto < threshold)
if (distanceto < 1f && distanceto > threshold)
{
GD.Print("should climb step here");
// SHOWS THAT STEP SHOULD BE CLIMBED
// ***** WILL PROBABLY NEED TO ADD CODE TO PREVENT THIS FROM RUNNING WHEN MOVING SMOOTHLY UP A SLOPE ****
playerMovementVelocity.Y = distanceto;
}