強火で進め

このブログではプログラム関連の記事を中心に書いてます。

RigidBodyにAddForce()を行った場合のForceModeによる動作の違い


rigidbody.AddForce() で使用出来るフォースのタイプは以下。

意味
Force その質量を使用して、rigidbodyへの継続的な力を追加します。
Acceleration その質量を無視して、rigidbodyへの継続的な加速を追加します。
Impulse その質量を使用して、rigidbodyに瞬時に速度変化を追加します。
VelocityChange その質量を無視して、rigidbodyに瞬時に速度変化を追加します。

主なプログラムはこちら。

	var dir: Vector3 = Vector3.right;
	if (GUILayout.Button("Force")) {
		bigCube.rigidbody.AddForce(dir.normalized * 200.0, ForceMode.Force);
		smallCube.rigidbody.AddForce(dir.normalized * 200.0, ForceMode.Force);
	}
	if (GUILayout.Button("Acceleration")) {
		bigCube.rigidbody.AddForce(dir.normalized * 200.0, ForceMode.Acceleration);
		smallCube.rigidbody.AddForce(dir.normalized * 200.0, ForceMode.Acceleration);
	}
	if (GUILayout.Button("Impulse")) {
		bigCube.rigidbody.AddForce(dir.normalized * 10.0, ForceMode.Impulse);
		smallCube.rigidbody.AddForce(dir.normalized * 10.0, ForceMode.Impulse);
	}
	if (GUILayout.Button("VelocityChange")) {
		bigCube.rigidbody.AddForce(dir.normalized * 10.0, ForceMode.VelocityChange);
		smallCube.rigidbody.AddForce(dir.normalized * 10.0, ForceMode.VelocityChange);
	}

瞬発的に力が加わるImpulseやVelocityChangeに比べ、ForceやAccelerationはより大きな力で連続的に力を加えないとオブジェクトが動かない。

実際に動作させた動画はこちら大きいCubeのmassは3、小さいCubeのmassは1に設定。

プログラム全体はこちら。

#pragma strict

var bigCube: GameObject;
var bigCubeStartPos: Vector3;
var bigCubeStartRot: Quaternion;
var smallCube: GameObject;
var smallCubeStartPos: Vector3;
var smallCubeStartRot: Quaternion;

function Start () {
	bigCubeStartPos = bigCube.transform.position;
	smallCubeStartPos = smallCube.transform.position;
	bigCubeStartRot = bigCube.transform.rotation;
	smallCubeStartRot = smallCube.transform.rotation;
	bigCube.rigidbody.Sleep();
	smallCube.rigidbody.Sleep();
}

function OnGUI () {
	if (GUILayout.Button("Reset")) {
		bigCube.rigidbody.Sleep();
		smallCube.rigidbody.Sleep();
		bigCube.transform.position = bigCubeStartPos;
		smallCube.transform.position = smallCubeStartPos;
		bigCube.transform.rotation = bigCubeStartRot;
		smallCube.transform.rotation = smallCubeStartRot;
	}
	
	var dir: Vector3 = Vector3.right;
	if (GUILayout.Button("Force")) {
		bigCube.rigidbody.AddForce(dir.normalized * 200.0, ForceMode.Force);
		smallCube.rigidbody.AddForce(dir.normalized * 200.0, ForceMode.Force);
	}
	if (GUILayout.Button("Acceleration")) {
		bigCube.rigidbody.AddForce(dir.normalized * 200.0, ForceMode.Acceleration);
		smallCube.rigidbody.AddForce(dir.normalized * 200.0, ForceMode.Acceleration);
	}
	if (GUILayout.Button("Impulse")) {
		bigCube.rigidbody.AddForce(dir.normalized * 10.0, ForceMode.Impulse);
		smallCube.rigidbody.AddForce(dir.normalized * 10.0, ForceMode.Impulse);
	}
	if (GUILayout.Button("VelocityChange")) {
		bigCube.rigidbody.AddForce(dir.normalized * 10.0, ForceMode.VelocityChange);
		smallCube.rigidbody.AddForce(dir.normalized * 10.0, ForceMode.VelocityChange);
	}
}