GOSUKE FACTORY

何かの記録

2021/07/12 - 
MSC



 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)





  • Youtube Twitter


     当サイトはPC版ゲームのMODを中心に取り扱うなか、私gosukeのたわ言をつらつらと記録しています。(MODとはModification、元のゲームに様々な要素を追加・改変する事で、オリジナルのゲームよりさらに楽しめる幅が広がります。)

     また、リンクフリーではありますが、ファイルへの直リンクは出来ればご遠慮お願い致します。バナーでリンクする場合は下にあるバナーを使用して下さい。

    管理者:gosuke

    banner

    意見、要望、感想、叱咤、激励、などなどありましたら下の意見箱または X(旧Twitter) までメッセージをどうぞ。
    意見箱