この記事はUnityの基本的な使い方を解説するシリーズの一つで、今回はゲームオブジェクトにアタッチされているコンポーネントへの参照をC#スクリプトから取得する方法について詳しくご説明します。
コンポーネントを取得できる「GetComponent系関数」の使い方
では早速ですがゲームオブジェクトにアタッチされているコンポーネントを取得できる関数(いずれも「GetComponent」という名前がついているので、ここでは便宜的に「GetComponent系関数」と呼ぶことにします)の使い方をご紹介していきます。
コンポーネントを1つだけ取得する方法
まず、あるゲームオブジェクトにアタッチされているコンポーネントを一つだけ取得する場合には次のような関数を使うと便利です。
- GetComponent関数:そのゲームオブジェクトのコンポーネントを1つ取得する
- GetComponentInChildren関数:子のゲームオブジェクトのコンポーネントを1つ取得する
- GetComponentInParent関数:親のゲームオブジェクトのコンポーネントを1つ取得する
GetComponent関数
GetComponent関数を使えば指定したゲームオブジェクトにアタッチされている特定のコンポーネントへの参照を1つ取得することができます。
例えば、スクリプトがアタッチされているのと同じゲームオブジェクトにアタッチされているRigidbodyコンポーネントを取得する場合は次のように書きます。
Rigidbody rb = GetComponent<Rigidbody>();
なお、もし同じ種類のコンポーネントが複数アタッチされている場合は最初のコンポーネントを取得するようです。
GetComponentInChildren関数
GetComponentInChildren関数は、あるゲームオブジェクトの子のゲームオブジェクトにアタッチされているコンポーネントを1つ取得するメソッドです。使い方はGetComponent関数と同じです。
GetComponentInParent関数
GetComponentInParent関数は上のGetComponentInChildren関数の逆で、あるゲームオブジェクトの親のゲームオブジェクトにアタッチされているコンポーネントを1つ取得するメソッドです。使い方はGetComponent関数と同じです。
複数のコンポーネントをまとめて取得する方法
次に複数のコンポーネントをまとめて取得するには、先ほどの3つの関数とほぼ同じ使い方ができるメソッドを使います。
- GetComponentsでそのゲームオブジェクトのコンポーネントをまとめて取得する
- GetComponentsInChildrenで子のゲームオブジェクトのコンポーネントを検索してまとめて取得する
- GetComponentsInParentで親のゲームオブジェクトのコンポーネントを検索してまとめて取得する
1つだけ取得する場合との違いは、戻り値が配列になることだけです。
コンポーネントを取得するときの注意点
最後に、コンポーネントを取得する関数を使う際には1つ注意点があります。それはコンポーネントの取得処理は比較的重い処理だということです。
つまりGetComponent系の関数を使うときは、ゲームオブジェクトの検索処理の時と同様に
- そもそもゲーム実行中にコンポーネントを取得しないようにする(=予めインスペクターから登録しておく)
- どうしても取得が必要な場合は取得結果を変数にキャッシュしておく
といった工夫をした方がよいでしょう。
おわりに
以上、UnityでゲームオブジェクトにアタッチされているコンポーネントをC#スクリプトから検索する方法についてご説明しました。
コンポーネントの取得処理も(ゲームオブジェクトの検索処理と同様に)なるべく使わないほうがスマートですが、使いこなせると便利ではあるのでぜひ上記の内容を参考にしていただければと思います。