最近、ブロックを動かすパズルゲームを開発しているのですが、オブジェクトが衝突した際にすり抜けてしまう問題が発生しました。色々と試した結果、どうにか解決できたので、今後のために対処法をメモしておきます。
Unityでオブジェクトをすり抜けないようにする一般的な方法
まず、Unityでオブジェクトの進行を妨げる壁を作る方法に関してまとめておくと、
壁の方にRigidbodyとBox Coliderのコンポーネントを追加して、
移動するオブジェクトの方はBox Coliderのコンポーネントを追加すれば、壁にぶつかるとその先にはいけないようにできます。
ただ、これだけだとオブジェクトの移動速度が速い場合に壁をすり抜けてしまう場合があるようです。
Unityでオブジェクトをすり抜けないようにする対処法① RigitbodyのColision Detectionを「Continuos」にする
まず、すり抜け問題を調べるとよくでてくる対処法として、RigitbodyのColision DetectionをContinuosにするという方法があります。
この方法では、衝突を判定する頻度を多くすることで、より衝突を判定しやすくなるというものですが、僕の環境では、ある一定の範囲まではこの方法でOKでしたが、それ以上の速度で動かすとすり抜けてしまうという現象が発生してしまったので、他の方法を見つけることにしました。
Unityでオブジェクトをすり抜けないようにする対処法② Timeの取得間隔を速くする
UnityのProjectSettingsにてTimeの取得間隔を変更できるらしいので、こちらのFixed Timestepの値を小さくしてみました。この方法だと①同様、小さくすればするほど一定の速さまではすり抜けしないようにできますが、ある一定の速さを超えるとやっぱりすり抜けてしまいました。
Unityでオブジェクトをすり抜けないようにする対処法③ オブジェクトの移動速度に制限を加える
①も②も、一定の速度を超えると対応しきれないということがわかったので、オブジェクトの移動速度に制限を加えることにしました。どのくらいの速度ですり抜けるか色々と検証しながら、すり抜けない値を決めていった結果、無事壁のすり抜け問題を解決することができました。
ちなみに、上記の方法を使用した場合に発生した問題として、オブジェクトが移動できない領域に達した場合に、新しい座標に移動する動きと、移動できない場所から元の場所に戻す動きが発生してしまい、オブジェクトが震えてしまう問題が発生しました。
このオブジェクトが震える問題は、FixedUpdateを使用したら解決できました。おそらく、FixedUpdateを使用することでTimeの間隔が一定になり動作が安定するのかなと思われます。
今後同様の問題が発生した場合は上記のようなアプローチで対処したいと思います。
お知らせ
ミステリー推理ゲーム「リアル捜査ゲーム」を最近リリースしました!
もしよろしければダウンロードお願い致します!