【Unity】【C#】Transfrom (GameObject) のパス名を取得する 
2020/11/08 Sun [edit]
前回に引き続き、少しばかり Transform (GameObject) の便利メソッドを書いておく。
GameObject.Find のマニュアルを見るとわかるが、ヒエラルキーの各オブジェクトの名前を '/' (スラッシュ) で繋げて、特定のオブジェクトを階層で指定することができる(ただし、ファイルシステムとは違い、名前は自由に付けられるため、同名パスが複数存在する場合があることに注意)。
これに近いものを作るメソッドを定義してみよう。このメソッドでは Transform を返しているが、GameObject が欲しいなら、戻値から transform.gameObject を取得すれば良い。
(※) Unity 2019.4.14f1 / Windows10(x64) で確認
●Transform の(フル)パス名を作成する
using UnityEngine;
/// <summary>
/// Transform の(フル)パス名を作成する
/// 2020/11/08 Fantom (Unity 2019.4)
/// http://fantom1x.blog130.fc2.com/blog-entry-379.html
/// </summary>
/// <param name="transform">パス名を取得する Transform</param>
/// <returns>ヒエラルキールートからのパス名 (頭に '/' は付かない)</returns>
public static string GetFullPathName(this Transform transform)
{
if (transform.parent == null)
return transform.name;
return GetFullPathName(transform.parent) + "/" + transform.name;
}
●使用例(メインコード等)
using System.Linq;
using UnityEngine;
var transforms = GetComponentsAll<Transform>(); //※前回の記事を参照
foreach (var tr in transforms)
{
Debug.Log(tr.GetFullPathName());
}

GetRootTransforms(), GetComponentsAll() の2つのメソッドは以前の記事からコピペして欲しい。テストは前回のサンプルとほぼ同様なもので試してみよう。パス名となっているので、階層での位置がよくわかる。
ただ、戻値には頭に '/' は付かないので、GameObject.Find() で絶対パスのように使うときには、頭に '/' を追加する必要がある(※また、GameObject.Find() はアクティブなオブジェクトしか検出しないので注意)。
ちなみに、頭に '/' があるとき:"/nameA/nameB/nameC" はルート直下からとなり、
無いとき:"nameA/nameB/nameC" はルート以外でもパターンが合えば、どの階層でもヒットするようだ(複数ある場合、一番最初に見つかったのものとなる。深さ優先探索っぽい)。
また、似たようなものに、Transform.Find() というものもあるが、これは自身を除いた、子Transform 内で検出される。
このメソッドは再帰処理なので、ランタイムでの利用はほどほどにした方が良いね。
通常、決まったオブジェクトを検索したいのなら、GameObject.FindWithTag() を使った方がパフォーマンスが良い。ただし、事前にタグを作成(設定)しておく必要がある。
ヒエラルキーでユニークな名前のオブジェクトなら、使いやすいかも知れない。
(関連記事)
【Unity】【C#】シーン(ヒエラルキー)のルートにある Transform を全て取得する(非アクティブも含む)
【Unity】【C#】非アクティブも含めて、全ての GameObject からコンポーネントを取得する
【Unity】【C#】非アクティブも含めて、Transform (GameObject) をパス名で取得する
【Unity】【C#】ヒエラルキー(シーン)の全てのオブジェクト(Transform)をスキャンして処理をする
- 関連記事
トラックバック
トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/379-9764944a
この記事にトラックバックする(FC2ブログユーザー)
| h o m e |