VRMなかなか楽しいっすねぇ~
VTuber的な使い方以外にも,常にモデルデータを求めているであろう個人ゲーム開発屋さんなども使いやすいのではないでしょうか??VRoidStudioでお手軽に作って,UniVRMでUnityに簡単インポートすれば,それでゲームも作れちゃいますしね~
ただ,そこで微妙にUniVRMのバグっぽい挙動なのが,VRMモデルのスケールを変更したときです.
VRMのルート(VRMMetaなどのComponentがあるGameObject)のスケールを小さくすると,髪の毛が爆発しますw

小さい方をアップでもう一度.

えらいこっちゃですね.
まぁVRMのルートのGameObjectを選択すればわかるのですが,単純にSpringBorn用のColliderのRadiusがスケール変更に対応できていないっぽいだけですね.

この記事の内容だけだとちゃんと解決できません!!
こちらにもうちょい正しい(と思われる)修正方法書いたのでこちらをどうぞ!!
解決方法
「実際に物理演算に有効なColliderのサイズ」と「Gizmoのマゼンタ球のサイズ」はそれぞれ別のところで処理されているので,その2つの処理部分に修正を入れてやれば解決できます.
まずは「実際に物理演算に有効なColliderのサイズ」の修正から.
VRM/UniVRM/Scripts/SpringBone/VRMSpringBone.csの287行目あたりからを,
以下のように修正します.
foreach (var group in ColliderGroups)
{
+ var globalScale = Mathf.Max(Mathf.Max(group.transform.lossyScale.x,
+ group.transform.lossyScale.y),
+ transform.lossyScale.z);
if (group != null)
{
foreach (var collider in group.Colliders)
{
m_colliderList.Add(new SphereCollider
{
Position = group.transform.TransformPoint(collider.Offset),
- Radius = collider.Radius,
+ Radius = collider.Radius * globalScale,
});
}
}
}
あと,「Gizmoのマゼンタ球のサイズ」の修正は,VRM/UniVRM/Scripts/SpringBone/VRMSpringBoneColliderGroup.csの33行目あたりからを,以下のように修正.
Gizmos.matrix = mat * Matrix4x4.Scale(new Vector3(
1.0f / transform.lossyScale.x,
1.0f / transform.lossyScale.y,
1.0f / transform.lossyScale.z
));
+ var globalScale = Mathf.Max(Mathf.Max(transform.lossyScale.x,
+ transform.lossyScale.y),
+ transform.lossyScale.z);
foreach (var y in Colliders)
{
- Gizmos.DrawWireSphere(y.Offset, y.Radius);
+ Gizmos.DrawWireSphere(y.Offset, y.Radius * globalScale);
}
これでOKです!
確認
上の修正を入れると,このような感じになります.

小さい方をアップで見てもだいじょーぶ.Gizmoのマゼンタ球も小さくなっていることがわかります.

最後に
この記事で使ったVRMは,僕がVRoidStudioで作ったVRMです!
あおいちゃんかわいい!!!!!!!!
見てね!!!!!!!!!!
