MRが楽しい

MRやVRについて学習したことを書き残す

スクリプトからメッシュのバウンド情報を取得してコライダーに反映する

本日は Unity の小ネタ枠です。
スクリプトからメッシュのバウンド情報を取得してコライダーに反映する手順を記事にします。

コライダー追加時の自動調整

Mesh 情報を保持するコンポーネントを持つゲームオブジェクトに BoxCollider や CapsuleCollider などのコライダーを設定します。
すると以下の通り、自動でコライダーの領域がメッシュに合わせて調整されます。
f:id:bluebirdofoz:20201031093112j:plain

調整はコライダーの追加時にメッシュ情報を参照して行われます。
このため、メッシュをランタイム中に更新したい場合などはこの調整をスクリプト側から実施する必要があります。

メッシュのバウンド情報

SkinnedMeshRenderer や MeshFilter など Mesh を保持するコンポーネントからは立方体でのメッシュ領域を示すバウンド情報が Mesh.bounds または bounds 変数で取得できます。
docs.unity3d.com
docs.unity3d.com
docs.unity3d.com

スクリプト

Mesh から取得したバウンド情報を元に CapsuleCollider の中央位置とサイズを調整します。
以下のようなスクリプトを作成しました。
・ChangeBoundCapsuleCollider.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ChangeBoundCapsuleCollider : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        // スキンメッシュレンダラーを取得する
        SkinnedMeshRenderer skinnedMeshRenderer = this.gameObject.GetComponent<SkinnedMeshRenderer>();

        // カプセルコライダーを取得する
        CapsuleCollider capsuleCollider = this.gameObject.GetComponent<CapsuleCollider>();

        // バウンドボックスを取得する
        Bounds meshBounds = skinnedMeshRenderer.sharedMesh.bounds;

        // メッシュのバンドボックスに合わせてコライダーの中央位置を変更する
        capsuleCollider.center = meshBounds.center;

        // カプセルコライダーの軸方向を設定する(0 = X軸, 1 = Y軸, 2 = Z軸)
        capsuleCollider.direction = 1;

        // カプセルコライダーの高さを設定する
        capsuleCollider.height = meshBounds.size.y;

        // カプセルコライダーの半径を設定する
        if (meshBounds.size.x > meshBounds.size.z)
        {
            capsuleCollider.radius = meshBounds.size.x / 2.0f;
        }
        else
        {
            capsuleCollider.radius = meshBounds.size.z / 2.0f;
        }
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

以下の通り、デフォルト値で設定された CapsuleCollider と SkinnedMeshRenderer を保持するゲームオブジェクトにスクリプトをアタッチします。
f:id:bluebirdofoz:20201031093125j:plain

プレイボタンをクリックしてシーンを再生します。
CapsuleCollider がメッシュの大きさに合わせて調整されれば成功です。
コライダー追加時の自動調整と異なり、ゲーム開始時のアニメーションポーズのメッシュサイズに合わせて調整されています。
f:id:bluebirdofoz:20201031093136j:plain