[Unity] GetComponent系の動作

GetComponent関数とは

GameObjectに追加されているコンポーネント(MonoBehaviourとかそういうの)を取得するものです。

早速使ってみよう

今回もサンプルを用意しておいたので一緒にご覧ください。
GetComponentSample.cs
まずはこれを、"Current Object" に追加して実行してみましょう。
Hierarchyは上の画像を参照のこと。

関数一覧

GetComponent<T>()
GetComponentInChildren<T>()
GetComponentInParent<T>()
GetComponents<T>()
GetComponentsInChildren<T>()
GetComponentsInParent<T>()







GetComponent<T>()

自分についているコンポーネントを探します。
Debug.Log($"{name} : current position is {GetComponent<transform>().position}");
これを実行すると、以下の通り。
Current Object : child name is Current Object
自分についている "Transform"コンポーネントを見つけて返してくれます。

GetComponentInChildren<T>()

自分を含めて!アクティブな子すべてについているコンポーネントを探します。
Debug.Log($"{name} : child name is {GetComponentInChildren<GetComponentSample>()?.name}");
これを実行すると、以下の通り。
Current Object : child name is Current Object
自分についている "GetComponentSample"コンポーネントを見つけて返してくれます(自分にもついていると意味がない)。
子だけでなく、自分も含まれてしまうことに注意しておきましょう。
また、Active状態の子しか対象にならないので、非表示にしている場合も注意が必要です。

GetComponentInChildren<T>(true)

自分を含めて!すべての子についているコンポーネントを探します。
Debug.Log($"{name} : child name is {GetComponentInChildren<GetComponentSample>(true)?.name}");
これを実行すると、以下の通り。
Current Object : child (includeActive) name is Current Object
自分についている "GetComponentSample"コンポーネントを見つけて返してくれます(自分にもついていると意味がない)。
子だけでなく、自分も含まれてしまうことに注意しておきましょう。

GetComponentInParent<T>()

自分を含めて!さかのぼれる親についているコンポーネントを探します。
Debug.Log($"{name} : child name is {GetComponentInParent<GetComponentSample>()?.name}");
これを実行すると、以下の通り。
Current Object : parent name is Current Object
自分についている "GetComponentSample"コンポーネントを見つけて返してくれます(自分にもついていると意味がない)。
親だけでなく、自分も含まれてしまうことに注意しておきましょう。

GetComponents<T>()

自分についているすべてのコンポーネントのリストを返します。
Debug.Log($"{name} : current component length is {GetComponents<Transform>()?.Length}");
これを実行すると、以下の通り。
Current Object : current component length is 1
自分についている "Transform"コンポーネントの数(1)を表示しています。

GetComponentsInChildren<T>()

自分を含めて!アクティブな子すべてについているコンポーネントのリストを返します。
Debug.Log($"{name} : children component length is {GetComponentsInChildren<Transform>()?.Length}");
これを実行すると、以下の通り。
Current Object : children component length is 3
自分も含めて、Active状態のすべての子についている "Transform"コンポーネントの数(3)を表示しています。
子だけでなく、自分も含まれてしまうことに注意しておきましょう。
また、Active状態の子しか対象にならないので、非表示にしている場合も注意が必要です。

GetComponentsInChildren<T>(true)

自分を含めて!すべての子についているコンポーネントのリストを返します。
Debug.Log($"{name} : children (includeActive) component length is {GetComponentsInChildren<Transform>(true)?.Length}");
これを実行すると、以下の通り。
Current Object : children (includeActive) component length is 5
自分も含めて、Active状態のすべての子についている "Transform"コンポーネントの数(5)を表示しています。
子だけでなく、自分も含まれてしまうことに注意しておきましょう。

GetComponentsInParent<T>()

自分を含めて!さかのぼれるすべての親についているコンポーネントのリストを返します。
Debug.Log($"{name} : prarent component length is {GetComponentsInParent<Transform>()?.Length}");
これを実行すると、以下の通り。
Current Object : prarent component length is 2
自分も含めて、さかのぼれるすべての親についている "Transform"コンポーネントの数(2)を表示しています。
子だけでなく、自分も含まれてしまうことに注意しておきましょう。


Kindle無料漫画ランキング

まとめ

  • 子や親をたどるときは、自分が含まれることを忘れないようにしましょう。
  • 子をたどるときは、引数を指定しないとActive状態のみが対象になることも忘れないようにしましょう。





コードのすべてはこちら

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GetComponentSample : MonoBehaviour
{
private bool Flag { get; set; }
private void Awake()
{
Debug.Log($"{name} : in Awake");
}
void Start()
{
Debug.Log($"{name} : in Start");
Debug.Log($"{name} : current position is {GetComponent<Transform>().position}");
Debug.Log($"{name} : child name is {GetComponentInChildren<GetComponentSample>()?.name}");
Debug.Log($"{name} : child (includeActive) name is {GetComponentInChildren<GetComponentSample>(true)?.name}");
Debug.Log($"{name} : parent name is {GetComponentInParent<GetComponentSample>()?.name}");
Debug.Log($"{name} : current component length is {GetComponents<Transform>()?.Length}");
Debug.Log($"{name} : children component length is {GetComponentsInChildren<Transform>()?.Length}");
Debug.Log($"{name} : children (includeActive) component length is {GetComponentsInChildren<Transform>(true)?.Length}");
Debug.Log($"{name} : prarent component length is {GetComponentsInParent<Transform>()?.Length}");
}
void Update()
{
if (!Flag)
Debug.Log($"{name} : in Update");
Flag = true;
}
}

0 件のコメント :

コメントを投稿