MRが楽しい

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

UnityでBoxColliderの対角線の長さを取得する

本日は Unity の小ネタ枠です。
Unity で BoxCollider の対角線の長さを取得する方法を記事にします。

BoxCollider

BoxCollider では Inspector の Center または Size 変数から当たり判定のオフセットやサイズを設定することができます。
docs.unity3d.com

Vector3.magnitude

ベクトルの長さ((x *x+y* y+z* z) の平方根)を取得します。
docs.unity3d.com

対角線の長さ

上記の BoxCollider から取得できる Size 変数は Vector3 形式で取得できるので、この magnitude を取得すれば対角線の長さが取得できます。

サンプルスクリプト

実際に動作を確認してみます。
以下のように BoxCollider を持つ Cube オブジェクトを配置したシーンを作成しました。

以下のサンプルスクリプトを利用して、BoxCollider の Size から対角線の長さを取得してみます。
・GetColliderTest.cs

using UnityEngine;

public class GetColliderTest2 : MonoBehaviour
{
    [SerializeField] private BoxCollider targetCollider;
    
    void Start()
    {
        // BoxColliderのsizeからローカル座標の値でVector3のサイズが取得できる
        // magnitudeを取得するとboundsの対角線の長さが取得できる
        Debug.Log($"boxCollider.size : {targetCollider.size}");
        Debug.Log($"boxCollider.size.magnitude : {targetCollider.size.magnitude}");
        
        // bounds変数を経由して取得するとワールド座標での値が取得できる
        // ただしBoxに角度がつくと軸が変わるため、実際のBoxColliderの形状とboundsが一致しなくなる点に注意が必要となる
        Debug.Log($"boxCollider.bounds.size : {targetCollider.bounds.size}");
        Debug.Log($"boxCollider.bounds.size.magnitude : {targetCollider.bounds.size.magnitude}");

        // 実際のBoxColliderの形状に合わせたワールド座標での値を取得するにはスケールを考慮してサイズを求める
        var worldSize = new Vector3(
            targetCollider.size.x * targetCollider.transform.lossyScale.x,
            targetCollider.size.y * targetCollider.transform.lossyScale.y,
            targetCollider.size.z * targetCollider.transform.lossyScale.z);
        Debug.Log($"worldSize : {worldSize}");
     

以下の通り、対角線の長さを取得できました。

スクリプト内のコメントにある通り、BoxCollider の Size 変数はローカル値であることに注意が必要です。
ワールド座標での値を求める場合はオブジェクトのワールド座標におけるスケール値を考慮する必要があります。

以下はオブジェクトを回転していた場合のスクリプトの実行結果です。
bounds 変数を用いる場合はオブジェクトを回転すると BoxCollider の対角線の長さと一致しなくなる点に注意が必要です。