前回は、UnityでGameObjectを操作するときの基準点である Pivot について見てきました。
GameObjectを回転させるときは、どこを中心に回るのかが大事です。たとえば、ドアなら真ん中ではなく、蝶番の位置を中心に回転してほしいですよね。
ただし、Prefabや3DモデルのPivotは、使う側が簡単に変えられるとは限りません。では、ドア本体のPivotが中央にある場合、蝶番を中心に回転させることはできないのでしょうか。
そこで役立つのが、Unityの 親子関係 です。
親子関係を使うと、複数のGameObjectをまとめて動かしたり、別のGameObjectを基準にして回転させたりできます。
この記事では、Unityの親子関係について、初心者向けに整理していきます。
この記事を読むと、GameObjectの親子関係を使って、複数のオブジェクトをまとめて動かしたり、回転の基準を作ったりできるようになります。
親子関係とは?

Unityの親子関係って、HierarchyでGameObjectが入れ子になっている状態のことですか?

そうだね。でも、ただ整理されているだけじゃないよ。親を動かすと、子も一緒に動くんだ!
Unityの親子関係とは、あるGameObjectの下に、別のGameObjectを入れる仕組みです。
親になっているGameObjectを親オブジェクト、その下に入っているGameObjectを子オブジェクトと呼びます。
Hierarchyでは、次のように表示されます。
ParentObject
└ ChildObject
この場合、ParentObject が親オブジェクト、ChildObject が子オブジェクトです。
一見すると、フォルダの中にファイルを入れて整理しているようにも見えます。ですが、Unityの親子関係は、ただの整理用フォルダではありません。
親オブジェクトを移動・回転・拡大縮小すると、子オブジェクトにも影響します。つまり、親子関係は GameObject同士の動きに関係する仕組みと言えます。
親が動けば子も動く
親子関係でまず覚えておきたいのは、親を動かすと子も一緒に動く ということです。
たとえば、次のような親子関係があるとします。
RoomSet
├ Table
├ Chair
└ Lamp
この状態で RoomSet を移動すると、テーブル、椅子、ランプもまとめて移動します。
ひとつひとつのGameObjectを別々に動かさなくても、親オブジェクトを動かすだけで、まとめて位置を変えられるわけです。これは、部屋のセット、小物のまとまり、ギミックのパーツなどを扱うときに便利です。

なるほど。Hierarchyを整理するだけじゃなくて、まとめて動かすためにも使えるんですね💡
子のTransformは親を基準にする
親子関係を理解するときに大事なのが、子オブジェクトのTransformは親を基準にする ということです。
GameObjectが親子関係になっていない場合、TransformのPositionはScene全体の中での位置を表します。
一方で、子オブジェクトになっている場合、子のPositionは、基本的に親から見た位置として扱われます。
たとえば、親がX=1、子がワールド上でX=3の位置にある場合、親子関係にすると、子のPositionはX=2のように表示されます。
これは、子が親から見てX方向に2離れた位置にある、という意味です。

空のGameObjectを親にする
親子関係では、見た目のあるGameObjectだけでなく、空のGameObject を親にすることがあります。
空のGameObjectとは、Scene上に見た目を持たないGameObjectです。
CubeやSphereのような形はありませんが、Transformは持っています。
つまり、空のGameObjectは、目に見える形はないけれど、位置・向き・大きさの情報を持ったGameObjectです。

見た目がないのに、何に使うんですか?

見た目がないからこそ、基準点やまとめ役として使いやすいんだ✨
空のGameObjectは、複数のGameObjectをまとめたり、回転の基準を作ったりするときによく使います。
たとえば、部屋の小物をまとめたい場合、空のGameObjectを作って PropsRoot のような名前を付け、その下に机や椅子などを入れます。
PropsRoot
├ Table
├ Chair
└ Lamp
PropsRoot には見た目がありません。
でも、PropsRoot を動かすと、その下にある Table、Chair、Lamp も一緒に動きます。
最初は、空のGameObjectを 見た目のないまとめ役 と考えるとわかりやすいです。
親子関係を作ってみよう
では実際に、親子関係を作ってみましょう。
ここでは、空のGameObjectを親にして、Cubeを子にします。
まず、Hierarchyで右クリックして、 Create Empty を選びます。空のGameObjectが作られます。名前を CubeRoot に変更しておきましょう。

次に、Cubeを用意します。
すでにSceneにCubeがある場合は、そのCubeを使って大丈夫です。
HierarchyでCubeをドラッグして、CubeRoot の上に重ねます。すると、Cubeが CubeRoot の下に入ります。
CubeRoot
└ Cube
これで、CubeRoot が親、Cube が子になりました。

この状態で、CubeRoot を選択して移動してみてください。Cubeも一緒に動くはずです。
Cubeそのものを直接動かしているわけではありません。親である CubeRoot を動かすことで、子であるCubeが一緒に動いています。

ドアの回転基準を作ってみよう
親子関係は、回転の基準を作るときにも役立ちます。
ここでは見た目の中心にPivotがあるドアの形をしたGameObjectを使って、ドアのように蝶番の位置で回転させられるようにしましょう。
ドアを開閉させるときは、蝶番の位置を中心に回転してほしいですよね。でも、ドア本体のPivotが真ん中にある場合、そのまま回転させると、ドアは中心を軸に回ってしまいます。

そこで、空のGameObjectを使います。
ドアの蝶番の位置に、空のGameObjectを置きます。
この空のGameObjectを、ここでは DoorRoot と呼ぶことにします。
そして、ドア本体を DoorRoot の子にします。
DoorRoot
└ Door
DoorRoot は見た目のないGameObjectですが、Transformを持っています。
この DoorRoot を蝶番の位置に置くことで、ドアの回転基準として使えるようになります。

この状態で DoorRoot をY軸回りに回転させると、子である Door も一緒に回転します。
すると、ドア本体のPivotが中央にあっても、DoorRoot を基準にして、蝶番を中心に開くような動きを作れます。


なるほど!ドアそのもののPivotを変えるんじゃなくて、親を回転の基準にするんですね。

そういうこと。Unityでは、空のGameObjectを「回転の中心」として使うことがよくあるよ。
まとめ
今回は、Unityの 親子関係 について見てきました。
親子関係を作ると、親オブジェクトを動かしたときに、子オブジェクトも一緒に動きます。
この仕組みを使うと、複数のGameObjectをまとめて扱ったり、空のGameObjectを回転の基準として使ったりできます。
たとえば、ドア本体のPivotが中央にあっても、蝶番の位置に DoorRoot を置いて、その子にドア本体を入れれば、DoorRoot を回転させることで、蝶番を中心に開くドアを作れることがあります。
まずは、「親が動けば子も動く」と覚えておきましょう。




コメント