バーチャル3Dクリエイター神部まゆみです(*^_^*)
この記事はUnityでアニメーションにコライダーが追従せずズレる時の対処法メモです。
似たような現象では、アニメーションプレビュー中にキャラの位置がズレる問題については↓の記事を参照。
動作確認した最新バージョンは Unity 6000.0.32 です。
症状:モデルのアニメーション中にコライダーが初期位置のまま動かない
↓こんな感じにメッシュコライダーを設定したんだけど、


↓のように、実行中にシーンを見るとコライダーが初期位置のまま置きざりになっていることに気づいた。


↓ObiFluidをいじっていて気づいたのだけど、ObiFluidはコライダーを元に当たり判定をするので、これだとダメですね…。
対処法1:シェイプキーで動かしてる場合はトランスフォームで動かす
これは以前なったことあるけど、もしシェイプキーで動かしている場合はメッシュが動いているだけなのでコライダーは動かない。
VRChatワールドを作っている時に、ドアを開けるシェイプキーを作ったらすり抜けたことがあったので、結局トランスフォームで動かした。
しかし今回の場合はこれには当てはまらないですね…トランスフォームはちゃんと動いています。
「ルートモーションを適用」は今回は関係ないかな?
よくあるのが「ルートモーションを適用」にチェックを入れてないってことだけど、普通にチェック入れてある。


この場合はアニメーションで動かした場合にルートが適用されなくなるって話なので、今回の話では関係ないですね。
対処法2:ボーンのあるオブジェクトにコライダーを設定する
よくよく考えてみたら、コライダーを設定したFace Hair BodyはただのメッシュでボーンがなかったΣ(゚Д゚)
アニメーションはRootから始まるボーンで動かしているので、少なくともRoot以下にコライダーを設定しないとピクリともしません。


FaceとHairはHeadにメッシュコライダーを設定すればいけるかと思ったけど…
メッシュコライダーって位置調整ができないため、Rootの子に設置すると位置がおかしくなるっぽい?Headに設定したら遥か上空にメッシュコライダーがありますΣ(゚Д゚)


これたぶん、Root~HeadまでのボーンのTransform位置が0,0,0になっていないので、そのぶんの総和が累積してズレてるのかな?




メッシュコライダーはダメっぽいから、スフィアコライダーを細かく配置して位置調整していくしかないかなぁ。
細かくスフィアコライダーを設置したら良い感じになった
とりあえずHips~Headにスフィアコライダーを入れてみたらちゃんと追従しました。


まぁしかしめんどくさいけどw
ざっくりコライダーがあればいいだけなら、Rootにカプセルコライダー一つだけでもいいが…
これゲームのダメージ当たり判定とかで、「だいたいこの範囲に当たったらダメージ」でいいならRootにカプセルコライダー一つだけでもあまり問題ないと思います。
しかしパンチやキックを実装する場合とか、部位ダメージを実装する場合などは細かくボーンごとにコライダーを設定する必要がありますね。
以前やったけど↓みたいな感じになる。
VRoidモデルはボーン構造がほぼ同じなので、一度設定したコライダーの情報を保存して、次やる時はスクリプトで自動でいけるかも?
これ毎回モデルごとに設定するのめんどくさいと思うので、VRoidなどボーン構造や体型が同じようなモデルを使いまわす場合は、一つだけ作りこんでスクリプトで自動で設定してくれるようにできそう。
まぁせいぜいスフィアコライダーの半径や位置くらいかな、それらをプロンプトで指定してChatGPTに投げればコード書いてくれそうな気がする。
↓なんとなく聞いたら「できますよ、余裕っすよw」みたいなノリで回答してくれたため(笑)、たぶんできるんだろうと思います。
しかしChatGPTパイセンはどんどん馴れ馴れしくなっていくなあ(^_^;)こちらは毎回敬語で接しているのにちょいちょいタメ口をはさんでくるw




以前やったScriptableObjectとかいうやつで保存できるっぽい。
まぁ後でやれたら記事にしてコードを載せておこうかな。
私はおおむねVRoidのデフォルト体型に近いと思うので(胸以外w)、設定を引き継げばたぶん体型が同じようなモデルにはそのまま設定できるような気がする。
おわりに
案外すぐ解決して良かった。
しかしモデルごとに設定するのはめんどくさいので、後ですぐ設定できるようにしておいたほうがいいかな。
また何かあれば追記します(*^_^*)