本日はUnityの小ネタ枠です。
Unityで3Dモデルの見た目に合わせてBoxColliderを設定する方法です。
3Dモデルの見た目に合わせてBoxColliderを設定する
MeshRendererコンポーネントのbounds変数から3Dモデルの見た目のバウンディングボックスを取得することができます。
docs.unity3d.com
docs.unity3d.com
// MeshRendererコンポーネントを取得 meshRenderer = GetComponent<MeshRenderer>(); // MeshRendererのバウンディングボックスを取得 Bounds rendererBounds = meshRenderer.bounds;
boundsから取得できる座標やサイズは全てワールド座標に基づく値になります。
逆算して見た目に合わせた適切なサイズのBoxColliderを求めることが可能です。
サンプルスクリプト
アタッチされたオブジェクトのMeshRendererを参照し、BoxColliderを設定する以下のサンプルスクリプトを作成しました。
・ModelColliderMaker.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; [RequireComponent(typeof(MeshRenderer))] public class ModelColliderMaker : MonoBehaviour { private MeshRenderer meshRenderer; private BoxCollider boxCollider; // Start is called before the first frame update void Start() { // MeshRendererコンポーネントを取得 meshRenderer = GetComponent<MeshRenderer>(); // MeshRendererのバウンディングボックスを取得 Bounds rendererBounds = meshRenderer.bounds; // BoxColliderコンポーネントを取得または追加 boxCollider = gameObject.AddComponent<BoxCollider>(); // ローカル空間でのバウンディングボックスを計算 Vector3 localCenter = transform.InverseTransformPoint(rendererBounds.center); Vector3 localSize = Vector3.Scale(rendererBounds.size, new Vector3( 1f / transform.lossyScale.x, 1f / transform.lossyScale.y, 1f / transform.lossyScale.z )); // BoxColliderのサイズと中心を設定 boxCollider.center = localCenter; boxCollider.size = localSize; Debug.Log($"{gameObject.name}: BoxColliderをMeshRendererのバウンディングボックスに合わせました" + $"\n中心: {localCenter}, サイズ: {localSize}"); } }
MeshRendererコンポーネントを持つオブジェクトにアタッチして利用します。

シーンを再生すると3Dモデルの見た目上の大きさに合わせたBoxColliderが設定されました。
