LoginSignup
4
4

More than 5 years have passed since last update.

unity > Panelが属するCanvasの名前探索 > return panel.GetComponentInParent<Canvas>().name;

Last updated at Posted at 2015-09-11
動作確認
Unity 5.1.3-f1 on MacOS X 10.8.5

状況

以下のようなHierarchyがあるとする。それぞれのPanelの名前からCanvasの名前を取得したい。

Main_unity_-_150912-findParentCanvasOfPanel_-_PC__Mac___Linux_Standalone__Personal_.jpg

code

try 1 (v0.1: 自作処理)

v0.1 @ github

以下において、メインの処理はgetMyParentCanvasName()

FindParentCanvas.cs
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

/*
 * v0.1 2015/09/12
 *   - getMyParentCanvasName() worked as expected 
 */

public class FindParentCanvas : MonoBehaviour {

    string getMyParentCanvasName(GameObject panel) {
        GameObject parentGO;
        GameObject targetGO = panel;

        for (int loop=0; loop<3; loop++) { // search upper three levels
            parentGO = targetGO.transform.parent.gameObject;
            if (parentGO.GetComponent<Canvas> () != null) {
                return parentGO.name;
            }
            targetGO = parentGO;
        }
        return "";
    }

    void Test_each(string name) {
        GameObject myPanel = GameObject.Find (name);
        string canvasName = getMyParentCanvasName (myPanel);
        Debug.Log (canvasName + " - " + myPanel.name);
    }

    void Test_main() {
        Test_each ("Panel_1");
        Test_each ("Panel_1_1");
        Test_each ("Panel_1_2_1");

        Test_each ("Panel_2");
        Test_each ("Panel_2_1");
        Test_each ("Panel_2_2_1");
    }


    void Start () {
        Test_main ();
    }   
}

結果

Main_unity_-_150912-findParentCanvasOfPanel_-_PC__Mac___Linux_Standalone__Personal_.jpg

これでCanvasをインスペクタで関連付ける必要がなくなる。


try2 (v0.2: GetComponentInParent()使用)

@ ShajikuWorks さんに押していただいたGetComponentInParent()を使用するように変更した。

GetComponentInParent

有効なコンポーネントが見つかるまで上に向かって(親の親)再帰します。それでも見つからない場合は null を返します

上方向の再帰探索なので、階層がいくつというのを検討しなくてもいい。

v0.2 @ github

結果、getMyParentCanvasName()が1行になった。もはやgetMyParentCanvasName()という関数にしなくてもいいかも。

FindParentCanvas.cs
...
    string getMyParentCanvasName(GameObject panel) {
        return panel.GetComponentInParent<Canvas>().name;
    }
...


try3 (try2のnullケース対応)

v0.3 @ github

v0.2の場合、実際にCanvasが見つからない時にGetComponentInParent<>()がnullを返して、.nameを返すときに以下のエラーがでる。

NullReferenceException: Object reference not set to an instance of an object

nullチェックを以下のように入れた。

FindParentCanvas.cs
...
    string getMyParentCanvasName(GameObject panel) {
        Canvas canvasGO = panel.GetComponentInParent<Canvas> ();
        if (canvasGO != null) {
            return canvasGO.name;
        } else {
            return "";
        }
    }
...

nullケースとしてPanel3を追加。

Main_unity_-_150912-findParentCanvasOfPanel_-_PC__Mac___Linux_Standalone__Personal_.jpg

    void Test_main() {
                ...
        Test_each ("Panel_2_2_1");

        Test_each ("Panel_3"); // for null case
    }

Main_unity_-_150912-findParentCanvasOfPanel_-_PC__Mac___Linux_Standalone__Personal_.jpg

Panel_3の場合exceptionでなく""が返るようになった。

4
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4