This is a question that I think is best to explain visually, so I will do my best to be succinct here.
What I am trying to do:
Allow the player to run about a world that is spherical, not a flat object. The intended result is going to be much like navigating a planet in super mario galaxy.
My attempt at solving this problem:
Conceptually it is simple. I create a vector from the player to the origin of the planet/world, and use it as the gravity vector. This works great, I know the direction I need to fall towards.
The problem:
When trying to use unity's transform.forward vector, everything is fine until I move slightly off to the side and attempt to circle the planet. At about the south pole, the forward vector points to random places. I believe this is because of how unity calculates the forward vector, but I don't know how it is done so I can't say.
Should I attempt to calculate it myself? Or should I just store a matrix for my object and do everything manually?
Below are images that hopefully shed some light.
In this image, the forward vector (red ray) points correctly in front. This is at the starting position of the object. The blue ray is the vector toward the planet center 
After circling to the bottom of the planet, I just need to move slightly to the side, and the forward vector begins to circle about the blue vector 
EDIT for code:
BaseObject class for objects that will react to planet gravity
public class BaseObject : MonoBehaviour { public GameObject planet; private float gravityConstant; public Vector3 TowardOrigin { get; set; } void Awake () { /// Store the gravity constant gravityConstant = Physics.gravity.magnitude; } void FixedUpdate() { /// Manually set the force of gravity to point towards the center of the planet TowardOrigin = transform.position - planet.transform.position; TowardOrigin.Normalize(); Physics.gravity = -gravityConstant * TowardOrigin; transform.up = TowardOrigin; ChildFixedUpdate(); } /// <summary> /// To be inherited and overriden by child objects /// </summary> public virtual void ChildFixedUpdate() { } } PlayerController class:
public class PlayerController : BaseObject { public float speed; Rigidbody body; void Start() { body = GetComponent<Rigidbody>(); } public override void ChildFixedUpdate() { if (Input.GetAxis("Vertical") != 0 || Input.GetAxis("Horizontal") != 0) { Vector3 forwardMomentum = (transform.forward) * (Input.GetAxis("Vertical") * speed); Vector3 sideMomentum = (transform.right) * (Input.GetAxis("Horizontal") * speed); body.AddForce(forwardMomentum); body.AddForce(sideMomentum); } else { body.velocity = Vector3.zero; } } }