【Unity】TransformのSetParentで親子関係を設定して表示を整理する
スクリプトからPrefabをインスタンス化してゲームオブジェクトを作る、なんてのは呼吸するかの如く行っていることですが、うまく整理しておかないとHierarchyウィンドウがとっ散らかってしまうので整理整頓は大切なのです。
例えばこんな感じ。
ゲーム実行中にオブジェクトの状態を確認しようにも、インスタンス化したオブジェクトで埋め尽くされてしまい確認したいオブジェクトがどこにあるか分からない状態になってしまうのは多くの人が通った道ではないでしょうかね。(えっ無い?)
開発やテストをスムーズに進めるためにも、こうした状態は避けるのが吉。
「でもtodoちゃん、そんな方法あるの?」
とお悩みのあなた、実はあるんです!(通販風味)
Transformクラスには親オブジェクトを設定できるメソッドの『SetParent()』があるので、これを使ってHierarchyウィンドウでの親子関係を設定しましょう。できればPrefabからゲームオブジェクトをインスタンス化した後にやっておくと忘れずに済みます。
環境
macOS 11.1 Big Sur
Unity2019.4.4f1
ゲームオブジェクトをインスタンス化する
ゲームオブジェクトのインスタンス化については以下の記事でも扱っているので良かったらこちらもご覧ください。なるべく基礎から分かるように解説してみたのでぜひ。
ゲームオブジェクトの親子関係をセットする
ゲームオブジェクトの親子関係をセットする方法は大きく分けて2通りあり、
- エディタから親子関係を操作する
- ゲーム実行中に親子関係を操作する
という方法があります。
エディタから親子関係を操作する
エディタから親子関係をセットするのは簡単で、対象のゲームオブジェクトを選択している状態でドラッグ&ドロップすることで、ドロップしたゲームオブジェクトの子要素にすることができます。
とても簡単にできる方法なので、ゲーム実行前に存在しているゲームオブジェクトに関してはこの方法で積極的に整理しておきましょう。親オブジェクトは関連するオブジェクトを一括で操作するためにも使えますし、単純に整理しておくためのフォルダのようにも使うことができます。
ゲーム実行中に親子関係を操作する
ゲーム実行中に親子関係を操作したいこともあります。エディタでの操作は、ゲーム実行前に既に存在しているゲームオブジェクトに対しては向いていますが、ゲーム実行中に生成されたゲームオブジェクトを操作するのには不向きです。
ゲーム実行中だとオブジェクトの位置をスクリプトやRigidbodyなどで変更していることが多いので、親子関係が変わってしまうことで修正する項目が多くなります。
さらには、ゲーム実行中にゲームオブジェクトを生成するのは大抵の場合、数が多いんですよね。これを手作業で調整していくのは現実的ではないので、動的に生成するゲームオブジェクトに関してはスクリプトから親子関係を設定するのが簡単です。
冒頭でも触れましたが、スクリプトから親子関係を設定するためにはTransformクラスの『SetParent()』メソッドを使います。引数に親オブジェクトのトランスフォームを渡すことで、そのオブジェクトの子要素にしてくれます。子オブジェクトの立場から「誰が親です」と設定していくイメージです。
以下のスクリプトはPrefabからインスタンス化したゲームオブジェクトについて、親オブジェクトのトランスフォームをセットするサンプルです。
Prefabからゲームオブジェクトをインスタンス化するメソッドの『InstantiatePrefab()』では、GameObjectの「obj」を作成した後に『SetParent()』を使って親オブジェクトを設定しています。引数はGameObjectではなくTransformになっています。もしフィールドでGameObjectを参照している場合は、「parentObj.transform」のようにTransformを渡してあげればOKです。
動作確認
作成したスクリプトを任意のゲームオブジェクトにアタッチして、『Prefab』にインスタンス化するPrefabを、『Parent Tran』に親となるオブジェクトをアサインします。オブジェクトの生成数である『Prefab Num』は任意の数でOKです。
ゲームを実行すると以下のようにオブジェクトが大量に生成されますが、親オブジェクトが設定されているので折り畳みができます。
このシーンではもともと存在するゲームオブジェクトの数が少ないのでそこまで大変ではありませんが、ゲームを作る際には案外たくさんのゲームオブジェクトがシーン内に存在しているので、整理して確認しやすくするのはとても大切なことです。
まとめ
Transformクラスの『SetParent()』メソッドを使うことで、スクリプトからゲームオブジェクトの親子関係をセットすることができます。
整理する目的でもそうですし、UIの表示などでは親オブジェクトのスケールに合わせてから自分のスケールを設定することも多いので、用途に合わせて適切に親子関係を設定するとグッド。
今回使ったInstantiateあたりの話を基礎から固めたい時には以下の記事もおすすめです。
親子関係をセットした後に、子オブジェクトの順番を決めたい時にはSetSibling系のメソッドが便利です。
ゲーム開発の攻略チャートを作りました!
-
前の記事
【Unity】パーリンノイズを使った地形を作るサンプル!【エディタ拡張編】 2021.01.23
-
次の記事
【Unity/C#】thisキーワードの使い道について簡単に紹介 2021.01.25
コメントを書く