09 «1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.» 11

ハルシオンシステムの気ままBlog

株式会社ハルシオンシステムのメンバーが送る、UnityやらJavaやらの技術的話題から、自社開発のアプリの宣伝とかとかのブログです。ほんと気ままにいきたいと思います。更新日は毎週 月 木でっす!

 

【Unity】オブジェクトの親子関係って意外とめんどいよね。でもね、こうやったら子供が取れたんすわ! 

夏真っ盛りじゃないですか!
これは外いったら溶けそうです。
日射病、熱射病にお気を付けくださいまし。
ってことで、坂内です。

本日はHierachyにオブジェクトが親子関係で並んでる時の、取得方法についてです。

まずはこんな感じで、オブジェクトを並べてみました。
上のボタン群(3個)は「Set1」オブジェクトの子にあたり、下のボタン群(3個)は「Set2」の子供になっています。


CanvasにScriptを置いて、以下のコードをやったところ・・・
    public Transform panelTransform;


void Start () {
foreach (Transform obj in transform.GetComponentsInChildren()) {
Debug.Log("transform ⇒ " + obj.name);
}


foreach (Transform obj in panelTransform.GetComponentsInChildren()) {
Debug.Log("panelTransform ⇒ " + obj.name);
}
}


※PanelTransformにはPanelオブジェクトをアサインしています。

上の結果はこんな感じです。

transform ⇒ Canvas
transform ⇒ Panel
transform ⇒ Set1
transform ⇒ Button
transform ⇒ Text
transform ⇒ Button 1
transform ⇒ Text
transform ⇒ Button 2
transform ⇒ Text
transform ⇒ Set2
transform ⇒ Button
transform ⇒ Text
transform ⇒ Button 1
transform ⇒ Text
transform ⇒ Button 2
transform ⇒ Text
panelTransform ⇒ Panel
panelTransform ⇒ Set1
panelTransform ⇒ Button
panelTransform ⇒ Text
panelTransform ⇒ Button 1
panelTransform ⇒ Text
panelTransform ⇒ Button 2
panelTransform ⇒ Text
panelTransform ⇒ Set2
panelTransform ⇒ Button
panelTransform ⇒ Text
panelTransform ⇒ Button 1
panelTransform ⇒ Text
panelTransform ⇒ Button 2
panelTransform ⇒ Text


ってことは、transform.GetComponentsInChildren()は子供以外の孫とかも持ってきちゃう感じですね。

さて次はGetChildの出番!

        Transform childTrans = transform.GetChild(0);
Debug.Log(childTrans.name);


こうやると、下が返ってくる。

Panel

ってことで、GetChildは引数にintが必須です。
この場合は、特定のtransformの中に子供がどれだけいるかを使いループで取るような処理になるっぽいです。

        for (int i = 0; i < transform.childCount; i++ ) {
Transform childTrans = transform.GetChild(i);
Debug.Log(childTrans.name);
}


あ、transform.childCountだと孫の数はとらないらしいです。

ってことは、Set1とかSet2に入ってる子供(ボタンオブジェクト)を取りだして、色々やりたい場合は、以下のコードでできるってわけかな。

    public Transform set1Tran;

void Start () {
for (int i = 0; i < set1Tran.childCount; i++ ) {
Transform childTrans = set1Tran.GetChild(i);
Debug.Log(childTrans.name);
childTrans.gameObjectから色々やる。
}
}

※set1Tranには「Set1」オブジェクトをアサイン。

なんか以前にこんなコード書いたことありました・・・・
    public Transform set1Tran;

void Start () {
foreach (Transform obj in set1Tran.GetComponentsInChildren()) {
if(obj.name == "Button"){
obj.gameObjectから色々やる。
}
}
}

だめなコードですね!
第一、stringで判定するとか、新人かよと!(笑)

他にも、特定の名前の子供を取得するには、transform.FindChild("名前")とかって方法もあります。

この辺その時使える方でうまく使ってみてください!

ってことで、これにてアデュ~ノシ

スポンサーサイト

Category: 開発日記(Unity)

tb 0 : cm 0   

コメント

コメントの投稿

Secret

トラックバック

トラックバックURL
→http://halcyonsystemblog.blog.fc2.com/tb.php/223-a0bcb3ae
この記事にトラックバックする(FC2ブログユーザー)