UnityUnityで衝突と言えばCollider。Unity世界の常識レベルで大事なコンポーネントです。今回はこのコンポーネントを使って、爆発的な力をオブジェクトに与える実験を行います。ここ最近Colliderをいじって遊んでいた中で気付いたのですが、Collider同士を重ねると、Colliderが重ならない位置までオブジェクトが移動するんです。これを応用して、AddForceを使わずにオブジェクトにぶっ飛び力を与えます。Colliderのパラメータの紹介と、衝突を使った遊びhttps://ekulabo.com/box-collider衝突を表現するのに必要なコンポーネントであるColliderを扱っています。Colliderについてパラメータの説明を行なっています。Colliderを使って衝突時の力が伝播する様子も紹介しています。Colliderのパラメータを紹介する記事を書いていたのですが、その中でColliderを使った遊びで、フレイザードの氷炎爆花散ごっこをしていたんです。氷炎爆花散!これらのCubeは、Colliderの大きさをメッシュより大きくして、お互いに重なるようにしています。Prefabからインスタンス化しただけで力を加えていなかったのですが、これだけ派手に吹き飛ぶのが楽しかったので、Collider同士の重なりでどの程度の力が生まれるのか気になって以下の実験をしました。user【Unity】重なっているColliderの斥力を観測する実験https://ekulabo.com/collider-repulsionColliderでは衝突を扱いますが、Colliderコンポーネントがアタッチされているオブジェクトの占有領域が重複している場合は、お互いのColliderが重ならない位置に移動させられます。その時の移動速度はオブジェクトの運動にも影響を与えるため、実験をしてみました。Colliderをアタッチしたオブジェクトを2つ使って斥力を確認したのですが、上記のGIFほどの勢いはありませんでした。距離が大きいほど斥力が大きく働いたとみなす3つのオブジェクトにRigidbodyをアタッチする3つのオブジェクト(プリンターのインクみたい)氷炎爆花散の様子から、Colliderの重複を解消しようとする斥力によってオブジェクトが移動する先にさらにColliderがいれば、より遠くにオブジェクトを移動させようとするように見えます。黄色と青のCollider重複では、黄色は画像の左側に、青は画像の右側に移動させられます。青が移動した先にはまた別のColliderが。今度は青とピンクが重ならない位置に移動しなくてはなりませんが、青が左側に行くと黄色とまたぶつかってしまいます。今度は2つのオブジェクト間だけではなく黄色も含めて位置を計算することに。黄色は青がいられるスペースを作るためにさらに左に移動させられます。結果として短いフレーム数でより長い距離を移動することになるので、速度が大きくなり、遠くへ飛ぶようになるはず。言葉で説明するより、実際にやってみる方が分かりやすいですね。ぶっ飛ぶ間に挟まれた青はそんなに飛んでいませんが、ピンクの勢いがすごいことになっています。user【Unity】重なっているColliderの斥力を観測する実験https://ekulabo.com/collider-repulsionColliderでは衝突を扱いますが、Colliderコンポーネントがアタッチされているオブジェクトの占有領域が重複している場合は、お互いのColliderが重ならない位置に移動させられます。その時の移動速度はオブジェクトの運動にも影響を与えるため、実験をしてみました。飛距離は95.172m。上の記事で、黄色とピンクの間隔を2mにした時には14.650mでした。6.5倍くらい?あいだにColliderがいるだけで飛距離が一気に伸びますね。Colliderの重複は何フレームで解消されるのか実験するhttps://ekulabo.com/collider-duplicationここ最近BoxColliderを使って遊んで......じゃなくて各種動作の実験を行なっているのですが、今回はColliderが重複した時、それらのオブジェクトが重ならない位置まで移動させるのにどれくらいの時間がかかるのかを検証しました。個人的に1フレームで移動完了だと思って...上の記事で、黄色とピンクの2つのオブジェクトでColliderの重複が解消されるまでの時間(フレーム数)を計測しました。結果はRigidbodyがアタッチされてから4フレーム目での重複解消でした。これに対してあいだに青を挟んだ場合を見てみましょ。ゲーム開始直後は処理が立て込んでいるので、ゲーム開始から11フレーム目に3つのオブジェクトに対してRigidbodyをアタッチしています。画像はちょうどRigidbodyがアタッチされたフレーム。Rigidbodyをアタッチ次の12フレーム目になると、青のオブジェクトが他を押しのけているような感じ。黄色とピンクの移動距離は1.6mなので、青色がいないときに比べて2倍の移動距離となっています。12フレーム目13フレーム目では黄色は既にColliderの重複が解消されました。Rigidbodyがアタッチされてから2フレーム目でこうなったので、青がいない時に比べて時間的にも早いです。後からRigidbodyをアタッチしているせいか、上のGIFと比べると、黄色とピンクの動きが逆になっていますね。GIFではピンクが先にぶっ飛んで行きましたが、ここでは黄色がぶっ飛んでいます。スクリプトの実行順を指定していないので、Rigidbodyがアタッチされるタイミングも変わってるように見えます。13フレーム目でもう離れたなお、Colliderが離れたことはOnTriggerExit()で検知しています。デバッグ文を入れておいたので、以下のように表示されました。黄色とピンクは面が接しているだけだったので、Rigidbodyのアタッチ後すぐ離れているのも納得。黄色と青は2フレーム目で衝突解消。青とピンクはRigidbodyアタッチ後の5フレーム目に離れています。デバッグ文の出力オブジェクトが2つだった場合に比べて、短時間かつ移動距離も長く、速度を計算するとかなり大きくなります。具体的な数字を使って速度を出して行くと泥沼にハマりそうなので避けますが、Colliderをいっぱい重ねれば大きな力を得られそう。増やすこうなったらあとはどんどん増やすだけ。オブジェクトを4つ重ねたらこんな感じ。あ、Collider自体を重ねるというよりは、Colliderの退避先を塞ぐイメージね。4つだと270.663mでした。