概要
Unityでシーン上にあるGameObjectや、それにアタッチされているコンポーネントを取得する方法。
GameObjectの取得
Inspectorで設定する
検索をかけるまでもなく、実行前の状態で既にシーン上にあるものにのみ有効な方法。
シリアライズ可能なフィールドを書き、UnityのInspector上で設定する。
Sample.cs
public class Sample : MonoBehaviour
{
// [SerializeField]を書くことで、シリアライズ可能なフィールドを宣言できる。
[SerializeField] private GameObject _object;
// publicなフィールドでも可。
// public GameObject _object;
}
GameObject名で検索する
GameObjectに設定された名前で検索をかけます。
GameObject obj = GameObject.Find("探したいオブジェクト名");
アタッチされているコンポーネントで検索する
特定のコンポーネントをアタッチしていた場合に使用可能だが、パフォーマンスが悪い。
GameObject obj = FindObjectOfType</*指定したいコンポーネント*/>().gameObject;
タグで検索する
UnityではGameObjectにタグを設定でき、そのタグを使って検索をかけます。
ただし探したいタグは、あらかじめタグマネージャーに設定されたものである必要があります。
Find
やFindObjectOfType
に比べ、安定した実行速度を誇る。
// 指定したタグを持つGameObjectを 1つ 取得する。
GameObject obj = GameObject.FindWithTag("探したいオブジェクトに設定されたタグ");
// 指定したタグを持つGameObjectを 全て 取得する。
GameObject[] objs = GameObject.FindGameObjectsWithTag("探したいオブジェクトに設定されたタグ");
コンポーネントの取得
Inspectorで設定する
方法はGameObjectの時と同様のため、画像での説明は省略。
Sample.cs
// 欲しいコンポーネントを仮に Example とする
public class Sample : MonoBehaviour
{
[SerializeField] private Example _object;
// または
// public Example _object;
}
GetComponentで取得する
GetComponent
関数で取得する。
指定したGameObjectからコンポーネントを取得するものなので、GameObjectの取得と組み合わせることも可。
// 自身を持つGameObjectにアタッチされた、他のコンポーネントを取得する場合
var cmp = this.gameObject.GetComponent</*欲しいコンポーネント*/>();
// CUBE という名前のGameObjectから取得したい場合
var cmp = GameObject.Find("CUBE").GetComponent</*欲しいコンポーネント*/>();
シーン内から取得する
GameObjectの時に使ったFindObjectOfType
の本来の用途。
頻繁に使うべきではない。
// シーン内にある、指定したコンポーネントの1つを取得する
var cmp = FindObjectOfType</*欲しいコンポーネント*/>();
// シーン内にある指定したコンポーネント全てを取得する
var cmp = FindObjectsOfType</*欲しいコンポーネント*/>();
まとめ
- 取得一つをとっても様々な方法がある。
- ものによっては処理が重くなるため以下のような策を講じるべきである。
- 初期化時に一回のみ呼び出す。
- 頻繁に呼び出すようなものは、あらかじめ配列などで保持できるような設計にするべきである。
実行確認環境
Unity [2018.2 以上]