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

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

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

     

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

    はい、こんにちは。坂内っす。
    はぁーーー しばれるねー!
    家おんぼろなんで隙間風はいってくるから、ちょー寒い!

    Unityでオブジェクトを検索する時ってどうしてます?
    基本Find?確かに楽ですけど、Findって多用すると重くなるってことで、なるべくなら始めからアサインしたりしてます。
    あとはFindGameObjectWithTag使ってTagで検索するってことやってます。

    また、子供の指定のオブジェクトを取ってきたりするのって意外とめんどいですよね。
    過去のブログで取ってくる方法も書いたりしていました。
    【Unity】オブジェクトの親子関係って意外とめんどいよね。でもね、こうやったら子供が取れたんすわ!

    ちょっと他の方法を試してみた。


    例えばオブジェクトのAをアサインした状態で、A>Panel>Set2>Button2のテキストを変えたい時。


    public class AssetTest1 : MonoBehaviour {

    public GameObject objA;
    public GameObject objB;

      void Start () {
    objA.transform.Find("Panel/Set2/Button2/Text").GetComponent().text = "aaaaa";
    }
    }


    これでいけますね。

    Set1やSet2の子供を色々といじるようであれば、Set1,Set2をアサインしてしまってもいいのかもしれません。
    こんな感じですね。


    using UnityEngine;
    using UnityEngine.UI;
    using System.Collections;

    public class AssetTest1 : MonoBehaviour {

    //public GameObject objA;
    //public GameObject objB;

    public GameObject objSet1;
    public GameObject objSet2;

    void Start () {
    objSet2.transform.Find("Button2/Text").GetComponent().text = "AAAAA";
    }
    }



    まぁ上記のようにしてもオブジェクトとれるよー というのに加えて、便利なアセットもあります。

    【LINQ to GameObject】

    これなんですけどね。

    これ使うと、色々とオブジェクトを取るのが楽になるとか?ならないとか?
    例えば、先ほどのButton2>Textを取る場合は・・・・・



    using UnityEngine;
    using UnityEngine.UI;
    using System.Collections;
    using System.Linq;
    using Unity.Linq;

    public class AssetTest1 : MonoBehaviour {

    public GameObject objA;
    public GameObject objB;

    void Start () {
    var button2 = objA.Descendants().Where(x => x.name == "Set2").Children().Where(x => x.name == "Button2").Descendants().Where(x => x.name == "Text");
    foreach(var item in button2) {
    item.GetComponent().text = "BBB";
    }
    }
    }


    あ、くっそめんどくせ。
    これめんどくさいのって、Set1とSet2の両方にButton2というのがあるからであって、オブジェクト名が1個しかないものについては、簡単だと思うんですよね。
    例えば、Button1のTextの名前を「Set2Button1Text」とかにしちゃう。

    こんな感じね。
    そうすれば、これでできる。


    using UnityEngine;
    using UnityEngine.UI;
    using System.Collections;
    using System.Linq;
    using Unity.Linq;

    public class AssetTest1 : MonoBehaviour {

    public GameObject objA;
    public GameObject objB;

    void Start () {
    var button1Text = objA.Descendants().OfComponent().Where(x => x.name == "Set2Button1Text");
    foreach(var item in button1Text) {
    item.text = "CCCC";
    }
    }
    }


    まぁ、楽になったよね。

    LINQ to GameObjectは他にも色々なコマンドがあります。
    再び、以下のオブジェクト配置をベースにこのアセットの機能の一部をご紹介!



    ●子供のオブジェクトを取る。
    objA.Child("Panel");
    ⇒ Panelオブジェクトが取れる
    ●親のオブジェクトを取る。
    objB.Parent();
    ⇒ Aオブジェクトが取れる。
    ●子以下についている全てのオブジェクトを取る。
    objA.Descendants();
    ⇒ B、TextA、TextB、TextC、Panel、Set1、Button、Text、Button1、Text、Button2、Text、Set2、Button、Text、Button1、Text、Button2、Textのオブジェクトが取れる。
    ●子以下についている全てのオブジェクトの中から特定オブジェクトを取る。
    objA.Descendants("Set1");
    ⇒ Set1オブジェクトが取れる。
    ●子以下についているオブジェクトから特定コンポーネントがついているオブジェクトを取る。
    objA.Descendants().OfComponent();
    ⇒ TextA、TextB、TextC、Set1>Button>Text、Set1>Button1>Text、Set1>Button2>Text、Set2>Button>Text、Set2>Button1>Text、Set2>Button2>Textのオブジェクトが取れる。
    ●LINQを条件として使用し、特定のオブジェクトを取る。
    objA.Descendants().Where(x => x.name.StartsWith("Button"));
    ⇒ Set1>Button、Set1>Button1、Set1>Button2、Set2>Button、Set2>Button1、Set2>Button2のオブジェクトが取れる。



    使いやすい方法で取るといいと思うよ!
    ただし、なんでもかんでもFindで終わらせると、あんまり良くないって話しです。

    ということで、役に立てばいいんすけどね。あでゅーノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0