FC2ブログ
    02 «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.» 04

    ハルシオンシステムの気まま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 1   

    コメント

    子要素までが欲しいのにGetComponentsInChildrenで
    孫要素までとってくるのでハマっていたので助かりました。感謝mm

    nh #- | URL | 2017/12/20 22:31 [edit]

    コメントの投稿

    Secret

    トラックバック

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