ぱふの自由帳

週2更新目指す技術ブログ。メインはUnity。最近、Railsかじり始めましたー!良ければフォローお願いします(`・ω・´)

【Unity2017.1】OnTriggerStay2Dが機能しない?!という現象を解決出来る(かもしれない)方法

はじめに

「あれっ...OnTriggerStay2D呼ばれない...。Rigidbody2Dは付いてる。そもそもOnTriggerEnter2Dは呼ばれてるじゃん!もう無理ぽ(´;ω;`)」
という現象を解決出来るきっかけになる記事かもしれません。

解決スタート

現象が発生する条件

以下の二つが同時に生じるとOnTriggerStay2Dが機能しなくなります。

・isTriggerがTrue
・Collider2Dを持つ双方のオブジェクトがどちらも動いてない

なぜ?

isTriggerがTrueになっているオブジェクトは動かないと(処理を軽くするために)sleep状態に入って物理演算対象から外れるようです。OnTriggerStay2Dは物理演算によって判定されているらしいので、双方のオブジェクトがsleep状態に入ってしまうとどちらも物理演算対象から外れてしまい、OnTriggerStay2Dの判定が行われなくなってしまうようです。

解決方法

「isTriggerを解除する!」という方法はあまりにも乱暴なので...他の方法を。

というわけで、Rigidbody2Dコンポーネント内のSleeping ModeをNever Sleepに変更してください。
f:id:PafuOfDuck:20171129072048p:plain

これでsleep状態に入らなくなるので機能してくれるようになるはずです。その代わり、デメリットとして計算量が増えてしまうので重くなる可能性があります。

おわり

この現象に出会う→解決までに6,7時間程度格闘してしまいました(´・ω・`。)
ちゃんとUnityは内部で計算量をカットするために色々してくれているんですねー。ありがたやー。

そういえば、2Dの内容になっていますが3Dでも一緒だと思いますよ...多分 (┐「ε:)