はじめに
UnityEngine.Bounds
について調べる必要があったので、そこで分かったことをメモがわりに残しておきたいと思います。
Boundsの変数・コンストラクタ・メソッド
Bounds
には以下の変数・コンストラクタ・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.extents
はBounds.size
の0.5倍Bounds.max
はBounds.center + Bounds.extents
Bounds.min
はBounds.center - Bounds.extents
実際の出力からも分かるように、Bounds.center
とBounds.size
の情報さえあればそれ以外の値は自然と導けます。
ではBounds.center
とBounds.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); } } }
3DObject
を覆うようにBounds
が設定されているのがわかりますね。
ちなみにSkinned Mesh Renderer
はインスペクターからBounds
のcenter
とextents(size)
を設定することもできます。
また親子構造にしたとしても破綻しないので、しっかりとWorld
座標で取得されていることが伺えます。
TextMeshPro.boundsとTextMeshProUGUI.bounds
お試しでTextMeshPro
のbounds
を可視化してみたところうまくいっているようです。
ただしTextMeshProUGUI
のbounds
を表示してみたところバグってるぽいですね。(値が固定値になっている)
TextMeshProUGUI.bounds TextMeshProUGUI.textBounds
UI周りのBounds
についてはまだ未調査なので、後でやれたらと思います。