月別アーカイブ: 2014年6月

[Unity]:Vector3.Distance()のパフォーマンス

以前どこかで「Vector3のDistanceは平方根演算を行うため計算コストが高いので、距離の比較だけならsqrMagnitudeを用いる方が良い」というのを見かけ、気になっていたので実際にパフォーマンスを比較してみた。

結果は、パフォーマンスに違いは見られず。
むしろsqr〜じゃない方のmagnitudeが若干遅い。
値の条件が悪いのか、何通りか変えてやってみたが、ほぼ同じ結果となった。
にしても「MacBookPro 2011 earlier」で1億回実行して約3秒なので、そこまで重くなさそう。

単純な繰り返し計算なので、どこかで意図せずコンパイル時の最適化みたいなのがかかってしまったのか。
何か間違ってるようで心配なので、気付いたことがあれば@mokusanまでお願いします。

const int REPEAT_NUM = 100000000; // 1億回
Vector3 p1 = new Vector3(1, 5, 10);
Vector3 p2 = new Vector3(100, 50, 70);

DateTime startTime;

startTime = DateTime.Now;
for (int i = 0; i < REPEAT_NUM; i++) {
	float distance = Vector3.Distance(p1, p2);
}
Debug.Log(DateTime.Now - startTime);

startTime = DateTime.Now;
for (int i = 0; i < REPEAT_NUM; i++) {
	float distance = (p2 - p1).magnitude;
}
Debug.Log(DateTime.Now - startTime);

startTime = DateTime.Now;
for (int i = 0; i < REPEAT_NUM; i++) {
	float distance = (p2 - p1).sqrMagnitude;
}
Debug.Log(DateTime.Now - startTime);
00:00:03.2123430 <- Distance()
00:00:04.0998070 <- magnitude
00:00:03.1908280 <- sqrMagnitude

[Unity]:Detonator Explosion Frameworkで爆風の影響範囲を限定する

Unityで爆風を表現するのに以下の無料アセットが使える。

Detonator Explosion Framework

炎や煙などの見た目だけでなく、爆風によって周りのオブジェクトを吹き飛ばすことが出来るのだが、爆風の範囲内にあるRigidbodyを持つオブジェクトが全て吹き飛ばされてしまうので、レイヤーの指定により爆風の影響を受けるオブジェクトを限定できるように改造する。

使用バージョン:
Unity 4.5.1f3
Detonator Explosion Framework 1.04

	//tweak the position such that the explosion center is related to the explosion's direction
	_explosionPosition = transform.position; //- Vector3.Normalize(MyDetonator().direction);
//	_colliders = Physics.OverlapSphere (_explosionPosition, radius);
	_colliders = Physics.OverlapSphere (_explosionPosition, radius, -1 - (1 << 4 | 1 << 8));

55行目:Physics.OverlapSphereの第3引数のレイヤーマスクを指定する。
レイヤーマスクの指定は若干複雑だが、

-1 : Everything
0〜 : Tags & Layersで指定した順番

をビット演算して指定する。
上のサンプルコードではEverythingから4番と8番のレイヤーを除外している。

実行速度を考慮するならば、Awake()などであらかじめ計算した値をメンバ変数に保持しておくと良い。

実行結果:左側の球がレイヤー4、右側の球がレイヤー8、キューブはデフォルトレイヤー
Detonator Explosion Framework