【Unity基礎】親子関係とは?GameObjectをまとめて動かす基本

前回は、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離れた位置にある、という意味です。

親子関係にしたとき、子のPositionが親から見た値になる

空の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 に変更しておきましょう。

空のGameObjectを作成

次に、Cubeを用意します。
すでにSceneにCubeがある場合は、そのCubeを使って大丈夫です。

HierarchyでCubeをドラッグして、CubeRoot の上に重ねます。すると、Cubeが CubeRoot の下に入ります。

CubeRoot
└ Cube

これで、CubeRoot が親、Cube が子になりました。

空のGameObjectの子オブジェクトとしてCubeを追加

この状態で、CubeRoot を選択して移動してみてください。Cubeも一緒に動くはずです。

Cubeそのものを直接動かしているわけではありません。親である CubeRoot を動かすことで、子であるCubeが一緒に動いています。

親オブジェクトを動かすと子オブジェクトも動く

ドアの回転基準を作ってみよう

親子関係は、回転の基準を作るときにも役立ちます。

ここでは見た目の中心にPivotがあるドアの形をしたGameObjectを使って、ドアのように蝶番の位置で回転させられるようにしましょう。

ドアを開閉させるときは、蝶番の位置を中心に回転してほしいですよね。でも、ドア本体のPivotが真ん中にある場合、そのまま回転させると、ドアは中心を軸に回ってしまいます。

ドア本体を回転すると中心を軸に回ってしまう

そこで、空のGameObjectを使います。

ドアの蝶番の位置に、空のGameObjectを置きます。
この空のGameObjectを、ここでは DoorRoot と呼ぶことにします。

そして、ドア本体を DoorRoot の子にします。

DoorRoot
└ Door

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

DoorRootを親にしてDoorを子にした

この状態で DoorRoot をY軸回りに回転させると、子である Door も一緒に回転します。

すると、ドア本体のPivotが中央にあっても、DoorRoot を基準にして、蝶番を中心に開くような動きを作れます。

DoorRootを回転させてDoorを開いている画面
ゆかり
ゆかり

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

リンカ先生
リンカ先生

そういうこと。Unityでは、空のGameObjectを「回転の中心」として使うことがよくあるよ。

まとめ

今回は、Unityの 親子関係 について見てきました。

親子関係を作ると、親オブジェクトを動かしたときに、子オブジェクトも一緒に動きます。

この仕組みを使うと、複数のGameObjectをまとめて扱ったり、空のGameObjectを回転の基準として使ったりできます。

たとえば、ドア本体のPivotが中央にあっても、蝶番の位置に DoorRoot を置いて、その子にドア本体を入れれば、DoorRoot を回転させることで、蝶番を中心に開くドアを作れることがあります。

まずは、「親が動けば子も動く」と覚えておきましょう。

コメント

タイトルとURLをコピーしました