[Unity] 重力についてあれこれ

Unityでは、Rigidbodyをアタッチしたオブジェクトに対して剛体の物理演算が働きます。
物体が落下していく動きも物理演算です。

物体の落下動作は、物体に重力加速度g(=9.81)をy軸の負の方向に与えることによって実現しています。
重力加速度の設定はメニューの「Edit」→「Project Settings」→「Physics」でPhysicsManagerを開き、Gravityから設定できます。
デフォルトではX=0, Y=-9.81, Z=0になっていると思います。

x軸方向に0以外の値を指定すれば、横方向に物体が落下(?)していきます。
全部0にすれば無重力状態になります。
この重力加速度はスクリプトからも変更できます。

	// Use this for initialization
	void Start () {
		Physics.gravity = new Vector3(0, 9.81f, 0);
	}

上記のスクリプトを実行すると、X=0, Y=9.81, Z=0と値が上書きされて上向きに物体が落ちていきます。

このように、物体が落下するのはPhysics.gravityという加速度が常に物体にかかっているためです。
Physics.gravityの加速度を与えないようにするには、インスペクタの「Rigidbody」→「Use Gravity」のチェックをはずします。
これで自由に重力を設定したり重力発生の有無を指定できるようになりました。
しかし、物体それぞれに違う重力加速度を与えたい場合や、万有引力のように星の中心に重力加速度を発生させたい場合には対応できません。

このような場合、以下のようなRigidbodyを持つゲームオブジェクトに対して指定された加速度を継続的に発生させるスクリプトをアタッチすることで実現します。

using UnityEngine;
using System.Collections;

public class Acceleration : MonoBehaviour {
	public Vector3 acceleration;	// 加速度

	void FixedUpdate () {
		// 加速度与える
		rigidbody.AddForce(acceleration, ForceMode.Acceleration);
	}
}

上記スクリプトのaccelerationの値をPhysics.gravityと同じにすればUse Gravityを使ったときと全く同じ挙動になります。

壁に向かうように加速度を設定すれば壁を伝って歩く動作を実現できます。
小さな星の上を歩くような動作だと、星の中心に向かうように加速度を設定すれば実現できます。