(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

Rigidbody2DがSleepして衝突しなくなる問題【Unity】


このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 5.5.0p1


はじめに

Rigidbody2Dはデフォルトの状態だと、

一定時間動かない場合はSleep状態となり、衝突を判定しなくなります。

なお、Sleep状態となると以下のようにCollider2Dの色が薄くなります。


f:id:kan_kikuchi:20170115145003g:plain


上記の例では二つのオブジェクトにRigidbody2DとCollider2Dを付け、

右のオブジェクトに以下のようなに衝突時にログを出すようなコンポーネントを付けています。

private void OnTriggerStay2D (Collider2D other){
   Debug.Log(other.gameObject.name);
}



Sleeping Mode

単純に一切Sleepしないようにするには、

Rigidbody2DのSleepingModeをNever SleepにすればOKです。


f:id:kan_kikuchi:20170115145431j:plain
f:id:kan_kikuchi:20170115145353g:plain


なお、上記の例では両オブジェクトともNever Sleepにしていますが、

どちらか一つが起きていれば衝突を感知する事が可能です。


WakeUp, Sleep

Sleeping ModeをNever Sleepにしてしまうと、

動いていなくても常に衝突判定を行っているので、無駄に処理が重くなってしまいます。


なので、起こす必要がある時にWakeUpを使ってRigidbody2Dを起こすのが効率的かと思います。

なお、IsSleepingでSleep状態かの判定を行う事ができます。

//寝ていれば起こす
if(GetComponent<Rigidbody2D>().IsSleeping){
  GetComponent<Rigidbody2D>().WakeUp();
}

f:id:kan_kikuchi:20170115145448g:plain


また、Sleeping Modeが何であっても、Sleepを使えば、強制的にSleep状態にする事も可能です。

GetComponent<Rigidbody2D>().Sleep();