テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】Rigidbody2Dがスリープになったかどうか確認する

f:id:tsubaki_t1:20160809224420g:plain

物理演算はスリープしてCPUを節約する

物理演算は複雑な当たり判定と物理的な動作のシミュレーション(再現)を行います。ただゲームのCPUにも限度という物があるため、物理演算はたいてい接触しない・動かないオブジェクトはスリープ状態へ移行する機能を持っています。

http://tsubakit1.sakura.ne.jp/images/201401200211573c3.gif

スリープしているオブジェクトは当たり判定の処理や物理演算による計算をスキップするため、動いている時と比べてかなりCPU負荷が下がります。

f:id:tsubaki_t1:20160809232843j:plain

物理演算の状態をシーンビューに表示する

気づいたら、Rigidbody2Dの設定に、物理演算がスリープに入ったかどうかを確認するGizmoを表示する機能が追加されていました。
設定すると、オブジェクトが現在スリープ状態なのか、アクティブなのかを確認することが出来ます。

f:id:tsubaki_t1:20160809225900j:plain

また同時に、物理演算の接点を矢印で表示してくれます。力の強さに応じて矢印を伸ばしてくれる訳ではないので少し分かりにくいですが。

f:id:tsubaki_t1:20160809230155j:plain

スリープを知るための設定方法

  1. まずEdit > PlayerSettings > Physics2DでPhysics2D Settingsを開きます。
  2. Gizmosを開きます。
  3. Always Show Colliders(常にコライダーの範囲を表示)
    Show Collider Sleep(コライダーが寝てるかを表示)
    Show Collider Contacts(当たり判定の接点を表示)にチェックを入れます。

f:id:tsubaki_t1:20160809231108j:plain

なお、Gizmosの線が細いので、背景と一緒に表示するようなケースの場合かなり見分けにくくなるかもしれません。その辺りは、スリープやコライダーの色を調整する等で何とかする必要がある気がします。

f:id:tsubaki_t1:20160809232005j:plain

物理演算は積極的に寝かせるが吉

物理演算的に言えばこのスリープ処理は非常に重要で、例えばBox(四角形)とCircle(円)の当たり判定を単純に比較した場合、スリープしやすいBoxの方が平均的なFPSは稼ぎやすかったりします。

f:id:tsubaki_t1:20160809231247g:plain
逆に、寝るタイミングが寝ない・もしくはスリープしない物理演算の場合、BOXよりCircleの方が計算が単純な分高速で動作します。その辺りは、当たり判定の形状に合わせるだけでなく、用途によって使い分けた方が良さそうです。

Rigibody(3D)については

テスト版の機能として公開されてるみたいです。

blogs.unity3d.com

関連

tsubakit1.hateblo.jp