こんにちは、ともくんのゲーム作り部屋にようこそ!
このページでは、
「Unityの親子関係のオブジェクトってなに?」
「親オブジェクトの中に入れると何ができるの?」
というお悩みの方に向けた内容となっています。
Unityでは、それぞれのオブジェクトを階層にすることができ、上の階層にいるオブジェクトを親オブジェクト、下の階層にいるオブジェクトを子オブジェクトと呼びます。
オブジェクトに対して親子関係を作るメリットとして、親を動かすと子も一緒に動くことにあります。
そのため、例えばプレイヤーの特定の位置から弾を出したり、手や腕の細かいパーツを組み合わせる際に、オブジェクトを親子関係にすることがあります。
そこで、このページでは、Unityで親子関係がどのようなものなのか、また親子関係の作り方とメリットを紹介していきます。
なお、このページでは、
Windows11
Unity Hub3.11.0
Unity6
のバージョンで解説しています。
オブジェクトの親子関係とは?
まずは、冒頭でも解説したオブジェクトの親子関係について、仕組みをまとめていきます。
ヒエラルキーウィンドウでの階層のこと
オブジェクトの親子関係とは、お互いのオブジェクト同士が階層になっていることを指しています。
階層は、ヒエラルキーウィンドウで確認することができ、階層になっていると、以下のように親オブジェクトの中に子オブジェクトがあるのが分かります。

また、階層は親と子の2つだけでなく、さらに深く階層を作ることができるようになっています。

親オブジェクトを動かすと子も動く
親のオブジェクトを動かした場合、その階層にある子オブジェクトも一緒に動くことになります。
例えば、丸い図形(Circle)を親オブジェクト、三角の図形(Triangle)をその中の子オブジェクトとした場合、親オブジェクトを動かすと、子オブジェクトも一緒に動いているのが分かります。
このように親オブジェクトと一緒に動かすことが出来るため、プレイヤーの身体のパーツを組み合わせるのに親子関係を作ったり、弾の発射位置を子にしておくことで、キャラクターが動いても常に同じ位置から発射させる、ということが、簡単にできるようになります。
子オブジェクトだけを動かすことができる
今度は反対に、子オブジェクトを動かした場合、親オブジェクトは動かずに自由に子オブジェクトだけを動かすことができます。
例えば、先ほどと同じく、丸い図形(Circle)を親オブジェクト、三角の図形(Triangle)をその中の子オブジェクトとした場合、子オブジェクトを動かすと、親オブジェクトには関係なく動いていることが分かります。
そのため、身体のパーツを親子の階層で作っていた場合、子オブジェクトにした腕パーツだけを動かしたり、足パーツだけを動かすといったキャラクターの動きなどを表現することができます。
親子関係・階層の作り方
それぞれのオブジェクトを親子関係にする方法として、
- ヒエラルキーウィンドウから作る
- スクリプトから作る
の2つの方法があります。
ヒエラルキーウィンドウから親子関係を作る場合
ヒエラルキーウィンドウから親子関係を作る場合は、親にしたいオブジェクトに対して、そのオブジェクトをドラッグ&ドロップするだけで、階層ができ親子関係を作ることができます。

また、親子関係を解除したい場合は、子オブジェクトをドラッグ&ドロップで外に出してあげることで、階層が無くなり解除することができます。

また、親オブジェクトの左側にある矢印部分をクリックすることで、中に入っている子オブジェクトを展開したり縮めたりすることができます。

スクリプトから親子関係を作る場合
スクリプトから親子関係を作る場合は、子オブジェクトに対して、transform.parentを使って親オブジェクトを指定することで作れます。
transform.parent = Transform型の親オブジェクト;
なお親オブジェクトは、Transform型で指定する必要があります。
例えば、「player」というオブジェクトを「Parent」の親オブジェクトの中に入れたい場合は、
using UnityEngine;
public class Test : MonoBehaviour
{
Transform parentTransform; // Transform型の変数を作成
void Start()
{
parentTransform = GameObject.Find("Parent").transform; // 親オブジェクトのTransformを代入
transform.parent = parentTransform; // 親に指定する
}
}
というようなスクリプトを書いて、子オブジェクトのplayerにアタッチしてあげることで、以下のように親子関係を作ることができます。

また、親子関係を解除する場合は、子オブジェクトに対して、
transform.parent = null;
というスクリプトを書いてあげることで、親子関係が解除されます。
もしくは、親オブジェクトに対して、
transform.DetachChildren();
というスクリプトを書くと、親オブジェクトの中に入っている子オブジェクトを全て解除するということもできます。
子オブジェクトは親を中心としたローカル座標を持つ
親子関係の階層を持つ子オブジェクトの特徴として、親オブジェクトを中心としたローカル座標を持っています。
階層を作っていないオブジェクト(シーン配下)の場合は、ワールド座標上で動かすことになるので、通常原点である(0, 0, 0)からの位置がTransform上で表示されています。

しかし、親をもつ子オブジェクトになると、原点ではなく親の座標を中心(0, 0, 0)とした相対的なローカル座標を持つことになり、その座標がTransform上で表示されています。

子オブジェクトにすると動かしていないのにTransformの座標が変わりますが、これは上記による仕組みで、親オブジェクトからの相対的な座標となったからです。
そのため、座標を取得して条件処理などを行う際は、このワールド座標とローカル座標の違いに気を付けておきましょう。
まとめ
このページでは、Unityの親子関係がどのような仕組みになっているのか、また作り方やメリットについて紹介していきましたが、いかがでしたでしょうか?
親子関係とは、それぞれのオブジェクトが階層になっていることです。
オブジェクトを親子関係にすることで、
- 親オブジェクトを動かすと子オブジェクトが一緒に動く
- 子オブジェクトだけを自由に動かすことができる
という動きを行うことができます。
このUnityの階層には、様々な使い方がありますので、使いこなせるようになりましょう。
最後までお読みいただきまして、ありがとうございました!
コメント