多くのUnityユーザーを「壁抜け」で悩ませている
『Collision Detection』について
オブジェクトの速度が速くなったときにオブジェクトをすり抜けてしまう
といった方は、当記事を読めば1分とかからず解決できることでしょう。
通常の「当たり(衝突)判定」がうまくいっていない方は、こちらをどうぞ。
⇒ 「『当たり判定』の設定方法を詳しく解説!」
では、解説を始めます。
何はともあれ、最初に対処法をお話しします。
オブジェクトの「すり抜け」対処法
「すり抜け」が発生するオブジェクトには、『Rigidbody』がアタッチされていますね?
Rigidbodyの「Collision Detection」の項目を「Continuous」に設定します。
これで解決できるはずです。
もしこれで解決できない場合は、申し訳ありませんが当記事ではお役に立てません。
それでは、
「Collision Detection」について解説していきます。
まずはRigidbodyの説明から。
『Rigidbody』とは
Rigidbodyとは、オブジェクトの物理挙動を可能にするためのコンポーネントです。
Rigidbodyをつけることで、重力の影響を受けるようになったり、
オブジェクトとの衝突時に衝突の影響により動く、といった物理挙動が可能になります。
『Collision Detection』とは
Rigidbodyの設定に『Collision Detection』という項目があります。
この設定は「Collision(衝突)」と名前に入っている通り、
「当たり判定」に大きく関わってくる設定項目となっています。
Unityでゲームを作っていて、「オブジェクトの速度が速いと壁をすり抜けてしまう」
なんて現象に悩まされたことがある方もいるのではないでしょうか。
この「速度が速いと壁をすり抜ける」という部分に大きく関わっているのが
Rigidbodyの『Collision Detection』という設定なのです。
オブジェクトが高速で動いていると、物理計算が行われている間に、
オブジェクトが壁をすり抜け、通り越してしまうということが起こってしまいます。
そんなときにどういった処理を行うのかということが、
この『Collision Detection』により決定されます。
「Collision Detection」には、
「Discrete」と「Continuous」の2つの設定があります。
Discrete(不連続): 最も新しい位置で接触判定を行う
Continuous(連続): 最初に衝突が発生した位置で接触判定を行う
「Discrete」では “最も新しい位置” で接触判定が行われるので、
壁をすり抜けてしまった場合、そのすり抜けた位置で接触判定が行われます。
一方「Continuous」では “最初に衝突が発生した位置” で接触判定が行われるので、
たとえ壁をすり抜けたとして、壁との最初の接触位置で接触判定が行われます。
要約すると、
「Discrete」に設定していると壁抜けが起こり得て、
「Continuous」に設定していると壁抜けの心配がなくなる
ということですね。
ゲームにおいて高速に動くオブジェクトが存在せず、壁抜けの心配がないのであれば、
「Discrete」に設定しておくのがよいでしょう。こちらの方が処理速度が速いですから。
すべてのRigidbodyを「Continuous」に設定しておくのはナンセンスです。
というわけで、
壁抜けにお困りの方は、この「Collision Detection」の設定を見直して見てください。
※当記事では、オブジェクトをすり抜けることを、便宜上「壁抜け」や「壁のすり抜け」と表現させていただいておりますことをご了承ください。