- Home /
Make player walk on sphere planet
Hi, I'd like to create a walkable 3D planet. Is there an easy way to make the player's model walk around like if the center of gravity was the center of the planet? The player should move by clicking somewhere on the surface of the sphere. If I turn on "IsKinematic" it'll ignore any force I apply to it, but if I keep it a normal rigid body it'll eventually fall.
Any adivce? Thanks!
Answer by Eno-Khaon · Jul 20, 2020 at 09:09 PM
If you turn off gravity for your Rigidbody, then replace that gravity with your own manually-applied force, you can get the effect you're aiming for:
Rigidbody rb; // The GameObject's attached Rigidbody
float gravityMag; // The magnitude of the Physics.gravity vector
public Transform gravityTarget;
void Start()
{
rb = GetComponent<Rigidbody>();
// Turn off gravity for the Rigidbody
rb.useGravity = false;
// Get the gravity vector's magnitude only when needed, for efficiency
gravityMag = Physics.gravity.magnitude;
}
void FixedUpdate()
{
if(gravityTarget != null)
{
// An unavoidable Square Root calculation when gravity is a fixed magnitude
Vector3 gravityDirection = (gravityTarget.position - transform.position).normalized;
// Apply the replacement gravity to the Rigidbody
rb.AddForce(gravityDirection * gravityMag, ForceMode.Acceleration);
}
}
This doesn't include a lot of other related factors (rotation/orientation, input, camera, etc.), but should help you get started.
Yes, that's pretty much how far I got. But the model starts rolling down the planet. Any way to make it behave like I would normally do when just walking on a normal plane? Also I guess Navigation/navmeshagent won't work right?

If your planet has a Sphere Collider on it, then the natural physics interaction of an imbalanced capsule collider (or similar oblong shape) would cause it to fall over.
If your planet is using a $$anonymous$$esh Collider, then it would also be the result of a large number of uneven surfaces at that scale.
Fair enough. I managed to make the model stand straight by not applying any force. I found a snippet online:
Vector3 up = rb.transform.position - transform.position;
Vector3 LookAt = Vector3.Cross(up, -transform.right) + up;
rb.transform.LookAt(LookAt, up);
At this point I think I can turn on IsKinematic and animate as needed. The only thing pending would be the navigation which at this point is probably easier to achieve via some complex formula since the navigation isn't suitable.
Answer by unity_AHujZ_Vk5fccTw · Jul 20, 2020 at 11:32 PM
Thank you very much for your help! I'll try to give this a go tomorrow. This thing is much harder than I thought!
Your answer
Follow this Question
Related Questions
I have a planetary gravity script; how do I make the object speed up? 1 Answer
Tranform Animation Curve ruins Gravity 1 Answer
Rigidbody velocity disables gravity 1 Answer
Trying to walk on a wall 0 Answers
Calculating trajectory of Spaceship 0 Answers