2020/11/09
というわけで、今回はUnityのBounds
に関するお話です。
「3D空間範囲を定義する」もので、Collider
やRenderer
で使用されています。自分で使う機会は多くありませんが、今回Bounds
を直接使用する機会があったので、簡単に調べてみました。
C#における構造体
そもそもですが、Bounds
は「クラス」ではなく「構造体」です。
C#における構造体についてよく知らなかったわけですが、以下のサイトの説明がとても分かりやすかったです。
http://ufcpp.net/study/csharp/resource/rm_struct/
ポイントは以下のような感じでしょうか。
・構造体は値型、クラスは参照型
・構造体はクラスと比べて機能が少ない
・データ構造によっては構造体の方がメモリ効率が良い
Unityで使用する分にはあまり意識しなくても問題なさそうではありますが、覚えておきましょう。
Boundsについて
公式のスクリプトリファレンスに変数・関数の一覧があるので、そちらも合わせて参照してください。
(日本語版は未だに5.4
相応だったりしますが…)
https://docs.unity3d.com/jp/540/ScriptReference/Bounds.html
Bounds
自体は構造体のため、コンポーネントとしてオブジェクトに付与することはできません。スクリプト上からnew
でインスタンス化して使用します。
コンストラクタで引数を指定しなかった場合、center
・size
は零ベクトルとして作成されます。
Bounds bounds = new Bounds( transform.position, new Vector3(10f, 10f, 10f) );
上にも書きましたが、イメージはBoxCollider
とほとんど一緒です。BoxCollider
コンポーネントもインスペクター上でcenter
とsize
を設定しますよね。勿論Vector3
型なので、Bounds
のコンストラクタでそのまま使用できます。
BoxCollider boxCollider = this.GetComponent<BoxCollider>(); Bounds bounds = new Bounds( boxCollider.center, boxCollider.size );
この場合、BoxCollider
コンポーネントの定義範囲とBounds
の定義範囲は同じになります。
各変数について
sizeとextends
Bounds
にはsize
とextends
という変数があります。リファレンスには「size
は常にextends
の2倍」と書かれています。
下画像の赤枠がsize
、青枠がextends
の範囲です。
「定義範囲の半分のサイズ」を取得したい場合はextends
を使うと手っ取り早いです。
また、定義済みのBounds
でToString()
を実行すると、center
とextends
が出力されます。size
が直接出力されないので、定義範囲がそのまま出力されるわけではない点に注意が必要です。
最小値と最大値
Bounds
はmin
とmax
のプロパティがあり、実行時にVector3
型で最小・最大の位置が返ってきます。
下画像の青球がmin
、緑球がmax
です。
この位置であれば、XYZのどの軸の最小~最大を取っても正しく計算することができます。スクリプト上で定義範囲を用いて計算する場合に有用です。
定義範囲をエディタ上で表示
OnDrawGizmos()
内でGizmos.DrawWireCube()
を使用することで、定義範囲をシーン上に表示することができます。
private Bounds bounds; void OnDrawGizmos() { Gizmos.color = Color.red; Gizmos.DrawWireCube(bounds.center, bounds.size); }
ただしbounds
が定義されていない場合は描画されません。当然ではありますが、「定義範囲をスクリプト実行時に設定する」という場合は注意が必要です。その場合は再生中にシーンビューに切り替えると描画されます。
あとがき
そんなわけで、UnityのBounds
について調べてみました!
Bounds
自体に難しい要素はありませんが、意外と知らないことが多かったりするので、いざ使うときに困らないよう下調べしておきたいですね。
本ブログですが、ここ数週間引っ越しに伴うあれこれで全然更新できていません。今日で旧住宅の引き渡しまで終わったのでペースを上げていきたいところですが、パソコンデスクを購入しておらず、フローリングに座り込んでPCを操作している状態なので、腰を据えて書けるのはまだ先になりそうです。9月頭には環境を整え、またUnityライフに戻りたいです。