【Unity】他のゲームオブジェクトのコンポーネントにアクセスする方法
Unityで他のゲームオブジェクトのコンポーネントにアクセスする方法はいくつかあります。以下にいくつかの方法を説明します。
さまざまな手順
GetComponentメソッドを使用する
GetComponentメソッドは、指定された型のコンポーネントを持つゲームオブジェクトからコンポーネントを取得するためのものです。例えば、以下のコードでは、名前が"target"であるゲームオブジェクトから、AudioSourceコンポーネントを取得しています。
AudioSource audioSource = GameObject.Find("target").GetComponent<AudioSource>();
GetComponentInChildrenメソッドを使用する
GetComponentInChildrenメソッドは、指定された型のコンポーネントを持つ最初の子孫ゲームオブジェクトからコンポーネントを取得するためのものです。以下のコードでは、名前が"parent"である親のゲームオブジェクトから、AudioSourceコンポーネントを持つ最初の子孫ゲームオブジェクトを取得しています。(親オブジェクトにアタッチされているコンポーネントも取得対象です(後述)
AudioSource audioSource = GameObject.Find("parent").GetComponentInChildren<AudioSource>();
インスペクターから取得する
インスペクターから取得する方法には、2つの主な方法があります
[SerializeField]属性を使用する
[SerializeField]属性を変数に追加することで、インスペクターでその変数にアクセスできます。以下の例では、変数audioSourceがインスペクターで表示されます
using UnityEngine;
public class Example : MonoBehaviour
{
[SerializeField]
private AudioSource audioSource;
// ...
}
public変数を使用する
public変数は、インスペクターからアクセスできます。以下の例では、public変数audioSourceがインスペクターで表示されます
using UnityEngine;
public class Example : MonoBehaviour
{
public AudioSource audioSource;
// ...
}
上記の2つの方法の違いは、SerializeField属性を使用すると、private変数でもインスペクターで表示されるため、変数の外部からのアクセスを制限できることです。一方、public変数は、どこからでもアクセス可能であるため、変数を変更することができる可能性があります
以上のように、Unityでは複数の方法で他のゲームオブジェクトのコンポーネントにアクセスすることができます。適切な方法を選択して、必要なコンポーネントにアクセスしてください
検証サンプル
親子関係のゲームオブジェクトを作成して、各オブジェクトにコライダーをアタッチします
親には、BoxCollider、子1にはSphereCollider、子2にはCapsuleColliderをアタッチしています
親にもコンポーネントが存在する場合
配置
テストコード
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
Collider collider = GameObject.Find("Parent").GetComponentInChildren<Collider>();
Debug.Log(collider);
}
}
結果
GetComponentInChildrenメソッドで、子オブジェクトからのみ取得のように捉われますが、実際は、親のコンポーネントも取得(検索)対象となります
Parent (UnityEngine.BoxCollider)
UnityEngine.Debug:Log (object)
Test:Start () (at Assets/Test.cs:8)
親にはコンポーネントが存在しない場合
配置
テストコード
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
Collider collider = GameObject.Find("Parent").GetComponentInChildren<Collider>();
Debug.Log(collider);
}
}
結果
親にコンポーネントが存在しない場合、子が取得(検索)対象となります
Child1 (UnityEngine.SphereCollider)
UnityEngine.Debug:Log (object)
Test:Start () (at Assets/Test.cs:8)
親と子孫のゲームオブジェクト全てのコンポーネントを取得したい場合
配置
テストコード
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
Collider[] colliders = GameObject.Find("Parent").GetComponentsInChildren<Collider>();
foreach (var collider in colliders)
{
Debug.Log(collider);
}
}
}
結果
戻り値は、全ての検索されたコンポーネントの配列になります
Parent (UnityEngine.BoxCollider)
UnityEngine.Debug:Log (object)
Test:Start () (at Assets/Test.cs:11)
Child1 (UnityEngine.SphereCollider)
UnityEngine.Debug:Log (object)
Test:Start () (at Assets/Test.cs:11)
Child2 (UnityEngine.CapsuleCollider)
UnityEngine.Debug:Log (object)
Test:Start () (at Assets/Test.cs:11)
ディスカッション
コメント一覧
まだ、コメントがありません