MRが楽しい

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

BoxColliderのローカル座標とワールド座標のCenter,SizeまたはBoundsをそれぞれ取得する

本日は Unity の小ネタ枠です。
BoxCollider のローカル座標とワールド座標の Center, Size または Bounds をそれぞれ取得する

BoxCollider

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

BoxCollider の変数からはローカル座標の Center または Size の値が取得できます。
bounds を介するとワールド座標の Center または Size の値が取得できます。

サンプルスクリプト

実際に動作を確認してみます。
以下のように BoxCollider を設定して、そのオブジェクトの Transform を変更したシーンを作成しました。

以下のサンプルスクリプトを利用して、BoxCollider から Center, Size または Bounds を取得してみます。
・GetColliderTest.cs

using UnityEngine;

public class GetColliderTest : MonoBehaviour
{
    [SerializeField] private BoxCollider targetCollider;
    
    void Start()
    {
        // boundsを経由して取得するとワールド座標の値が取得される
        Debug.Log($"bounds.center : {targetCollider.bounds.center}");
        Debug.Log($"bounds.size : {targetCollider.bounds.size}");

        // BoxColliderからcenter,sizeで直接取得するとInspectorで設定したローカル座標の値が取得される
        // ベースクラスのColliderクラスからは取得できないので注意
        Debug.Log($"boxCollider.center : {targetCollider.center}");
        Debug.Log($"boxCollider.size : {targetCollider.size}");
        
        // boundsからの逆算例
        // sizeは回転によって範囲の形状が変化するため逆算できない?
        Bounds colliderBounds = targetCollider.bounds;
        var localCenter = Quaternion.Inverse(targetCollider.gameObject.transform.rotation) *
            new Vector3(
            (colliderBounds.center.x - targetCollider.gameObject.transform.position.x) / targetCollider.gameObject.transform.lossyScale.x,
            (colliderBounds.center.y - targetCollider.gameObject.transform.position.y) / targetCollider.gameObject.transform.lossyScale.y,
            (colliderBounds.center.z - targetCollider.gameObject.transform.position.z) / targetCollider.gameObject.transform.lossyScale.z);
        Debug.Log($"bounds.center to local : {localCenter}");
    }
}

結果、以下のようにローカル座標またはワールド座標の Center, Size または Bounds を取得できることが確認できました。

・Collider.bounds からはワールド座標の Center, Size が取得できる
・BoxCollider.center または BoxCollider.size からはローカル座標(Inspectorで設定した)の Center, Size が取得できる