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ライフに戻りたいです。








