はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】UnityEngine.Boundsについて簡単に調べてみた

はじめに

UnityEngine.Boundsについて調べる必要があったので、そこで分かったことをメモがわりに残しておきたいと思います。

docs.unity3d.com

Boundsの変数・コンストラクタ・メソッド

Boundsには以下の変数・コンストラクタ・publicメソッドがあります。

変数・コンストラクタ・publicメソッド

UnityEngine.Bounds - Unity スクリプトリファレンス
UnityEngine.Bounds - Unity スクリプトリファレンス


ただこれだけだと実感が湧かないと思うのでもう少し掘り下げます。

Boundsの持つ変数について

変数の値を試しに出力してみます。

public void Start()
{
    var bounds = GetComponent<Renderer>().bounds;
        
    // サイズ1のSphereで試した例
    Debug.Log(transform.position);                          // (6.0, 1.5, -5.0)
        
    Debug.Log($"Bounds.center : {bounds.center}");          // (6.0, 1.5, -5.0)
    Debug.Log($"Bounds.extents : {bounds.extents}");        // (0.5, 0.5, 0.5)       sizeの0.5倍
    Debug.Log($"Bounds.max : {bounds.max}");                // (6.5, 2.0, -4.5)      center + extents
    Debug.Log($"Bounds.min : {bounds.min}");                // (5.5, 1.0, -5.5)      center - extents
    Debug.Log($"Bounds.size : {bounds.size}");              // (1.0, 1.0, 1.0)
}
  • Bounds.extentsBounds.sizeの0.5倍
  • Bounds.maxBounds.center + Bounds.extents
  • Bounds.minBounds.center - Bounds.extents

実際の出力からも分かるように、Bounds.centerBounds.sizeの情報さえあればそれ以外の値は自然と導けます。

ではBounds.centerBounds.sizeについてもっと掘り下げてみます。

Boundsを可視化する

バウンディングボックスを可視化するためにGizmoを利用してみましょう。

[RequireComponent(typeof(Renderer))]
public class BoundingBoxChecker : MonoBehaviour
{
    private static readonly Color BoundsColor = new Color(1, 0, 0, 0.5f);

    void OnDrawGizmos()
    {
        if (TryGetComponent(out Renderer renderer))
        {
            var bounds = renderer.bounds;

            Gizmos.color = BoundsColor;
            Gizmos.DrawCube(bounds.center, bounds.size);
        }
    }
}
シーンビューでの様子
3DモデルのBounds

3DObjectを覆うようにBoundsが設定されているのがわかりますね。

ちなみにSkinned Mesh RendererはインスペクターからBoundscenterextents(size)を設定することもできます。

Skinned Mesh Renderer

また親子構造にしたとしても破綻しないので、しっかりとWorld座標で取得されていることが伺えます。

TextMeshPro.boundsとTextMeshProUGUI.bounds

お試しでTextMeshProboundsを可視化してみたところうまくいっているようです。

TextMeshProのbounds

ただしTextMeshProUGUIboundsを表示してみたところバグってるぽいですね。(値が固定値になっている)

TextMeshProUGUI.bounds
TextMeshProUGUI.textBounds

UI周りのBoundsについてはまだ未調査なので、後でやれたらと思います。