NSR50 を組み立て分解できるように作業をしています。Fredrik さんの PartMagnet System を改良して使ってたのですが、負荷がかかった時のパーツが外れる動作で問題が発生したので、Joint を使わない方法でやってみました。上記の動画は、Joint を使ってパーツ同士を接続した方の動画です。
Joint で接続しているので各パーツに Rigidbody があるわけですが、これのせいで各パーツのコリジョンが重なっていると、オブジェクト同士が反発しあってふっとんでいったりしてしまいます。Rigidbody の is Kinematic を 変更してみたりしても変わらず、レイヤーで除外すればすんなり解決しそうですが、MOD でそれをいじると他で影響がでそうなのでいじれません。Unity Editor 上ではコリジョンが重なってても問題ないのになぁ、なんでだろう。
そういうわけで Joint を使わないで外部からの衝撃でパーツがちゃんと外れるようにしてみましたが、これができるまで結構大変でした。
親に Rigidbody をつけて、子に各パーツを配置してそれにコリジョンをつけるわけですが、子に OnCollisionEnter をつけて当たり判定をとると、その子を取得するのではなく親が取得されるという仕様。OnTriggerEnter こちらの方はちゃんと子を取得できますが、どれくらいの力で互いに衝突したのかが必要なのでこちらは使えません。子のパーツに Rigidbody をつければちゃんとその子が取得されますが、そうするとコリジョンが重なっていると挙動が不安定になってしまう。
そこでどうしたものかと調べたら、Collision.contacts なるもの使うといいらしく
foreach (ContactPoint col in collision.contacts)
{
ModConsole.Print(col);
}
collision.contacts[0].thisCollider.transform.gameObject
こんな感じで取得できるそうで、下の方がすっきりしてるのでそちらを使う事にしました。ぶつかった時の衝撃力の取得方法は下記の通り。共に、OnCollisionEnter 内に書きます。
collision.relativeVelocity.magnitude
参考リンク
onCollisionEnter does not work on a child colider - Unity Forum (Unity Forum)
Unity: how to detect collision occuring on child object, from a parent script? - Game Development Stack Exchange (Game Development Stack Exchange)