Walk always on the ground

Hello guys.

i’m looking to make able my player to stay always on the ground, for example i have a cube and my player walk on it, when is on the edge of the cube it will just to walk on the other face of it, without fall down…

there is anyway to do something like this with unity Rigidbody?
i have this code

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
     private bool IsRotated = false;
     private bool jumping   = false;
     private const string IdleAnimName = "Idle";
     private const string WalkingAnimName = "Move";
     private Animator myAnim;
     private float speedRation = 2.0f;
     private Vector3 surfaceNormal;
     public Vector3 personalNormal;
     private float personalGravity = 9.8f;
     private float normalSwitchRange = 5.0f;
     private Rigidbody rigidbody;
     [SerializeField]
     private Transform penguin;
     // Start is called before the first frame update
     void Start()
     {
         if(myAnim == null)
         {
             myAnim = GetComponent<Animator>();
         }
         if(rigidbody == null)
         {
             rigidbody = GetComponent<Rigidbody>();
         }
         personalNormal = transform.up;
         rigidbody.freezeRotation = true;
     }
     // Update is called once per frame
     void Update()
     {
         float deltatime = Time.deltaTime;
         InMoviment(deltatime);
         if(!jumping)
         {
             UpdatePersonalNormal();
         }
     }
     private void InMoviment(float deltatime)
     {
         float x = Input.GetAxis("Horizontal");
         float y = Input.GetAxis("Vertical");
         UpdatePlayerYrotation();
         UpdateRottationBool(x);
         UpdateMovement(x,y,deltatime);
         if(IsRotated) {return;}
         UpdateRotation(x,y);
     }
     void FixedUpdate()
     {
         rigidbody.AddForce(-personalGravity * rigidbody.mass * personalNormal);
     }
     private void UpdateRotation(float x, float y)
     {
         const float targetX= 0.1f;
         const float targetXN = -0.1f;
         if(x >= targetX)
         {
             transform.Rotate(Vector3.up,90.0f);
             IsRotated = true;
         }
         if(x <= targetXN)
         {
             transform.Rotate(Vector3.up,-90.0f);
             IsRotated = true;
         }
     }
     private void UpdateRottationBool(float x)
     {
         const float target = 0.0f;
         if(x == target)
         {
             IsRotated = false;
         }
     }
     private void UpdateMovement(float x, float y,float deltatime)
     {
         float t = deltatime;
         const float targetX= 0.1f;
         //const float targetXN = -0.1f;
         if(y >= targetX)
         {
             myAnim.Play(WalkingAnimName);           
             Vector3 newPos = transform.forward * y * t;
             Vector3 lerpedPos = Vector3.Lerp( transform.position,newPos,t);
             transform.position += newPos;
         }
         else if(y < targetX)
         {
            myAnim.Play(IdleAnimName);
         }
     }
     public void UpdatePersonalNormal()
     {
         RaycastHit hit;
         Vector3[] rays =
             {
                 Vector3.up, Vector3.down,
                 Vector3.left, Vector3.right,
                 Vector3.forward, Vector3.back
             };
         foreach(Vector3 rayDirection in rays)
         {
             if(Physics.Raycast(this.transform.position , rayDirection, out hit,normalSwitchRange))
             {
                 personalNormal = hit.normal;
             }
         }
     }
     private void UpdatePlayerYrotation()
     {
         const float costante = 0.0f;
         Vector3 newRot;
         if(personalNormal.x > costante)
         {
             newRot = new Vector3(0,90.0f,0.0f);
             penguin.localRotation = Quaternion.Euler(newRot);
         }
     }
}

i’m able to change my gravity based on cube face but i have also to rotate my Character of 90 degrees when it switch cube faces, right now it will be freeze;

Hi, my asset does exactly that (one of its “abilities”),see this video:

https://www.youtube.com/watch?v=ViS2BVFs1DA

0:00 and 0:14 (the red characters, rectangular and triangular shapes):

It is very simple to implement and works with any shape (really nice effect), you would have to fire a ray (raycast) in order to check the next walkable face of the ground (in your case a cube). If the collision happens move and rotate the character based on the collision info (normal and point).

if( positiveWalkSpeed  )
     RaycastFromTheBottomLeftDirLeft
else if( negativeWalkSpeed  )
     RaycastFromTheBottomRightDirRight