強火で進め このページをアンテナに追加 RSSフィード

整理された情報は こちら へどうぞ。

2012年03月20日

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

f:id:nakamura001:20120320151611p:image

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に設定。

D

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

#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);
	}
}

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト

コメントを書くには、なぞなぞ認証に回答する必要があります。

トラックバック - http://d.hatena.ne.jp/nakamura001/20120320/1332224186