まだまだ改善点は多いですが、球体の上を移動するゲームオブジェクトを作ることができたのでその方法を書き残しておきます。
使用したUnityのバージョン:2020.3.30f1
下のgifのように、Cubeが下に落ちることなく球体の上を移動することが出来るようにしました。
まず、使用するゲームオブジェクトを準備していきます。
下の画像のようにSphereとCubeを配置します。
この時、CubeとSphereのx座標とz座標が同じになるようにしてください。(同じにしないと正しい挙動をしなくなる時があります。)
ScaleはCubeが全て1、Sphereは全て10にしています。CubeにはRigidbodyをつけて、Use Gravityにチェックをつけてください。
下のコードのスクリプトをCubeにアタッチしてください。
public GameObject planet;
float speed = 10f;
void Start()
{
}
void Update()
{
if (Input.GetKey(KeyCode.UpArrow)) {
this.transform.position += transform.forward * speed * Time.deltaTime;
}
if (Input.GetKey(KeyCode.DownArrow)) {
this.transform.position -= transform.forward * speed * Time.deltaTime;
}
if (Input.GetKey(KeyCode.LeftArrow)) {
this.transform.Rotate(0,-1f,0);
}
if (Input.GetKey(KeyCode.RightArrow)) {
this.transform.Rotate(0,1f,0);
}
Vector3 ground = planet.transform.position - this.transform.position;
Physics.gravity = ground * 9.81f;
}
30行目で重力の向きが球体になるように変えています。
スクリプトをアタッチしたら、下の画像のように、PlanetにSphereを選択します。
上手くいけば、上にあったgif画像のようになるはずです。
ぱっと見は、問題がなさそうですがこの方法には問題点があります。例えば、Cubeが移動するスピードを早くするとどこかへ飛んで行ってしまったり、ゲーム開始時の位置を変えるとCubeが思ったように動かなかったりします。
他にも、CapsuleなどのCube以外のゲームオブジェクトに対応できていないなど多くの問題点を抱えています。