今回は自身に設定されているコンポーネントを全て取得したり、自身の階層からコンポーネントを全て取得する方法を作成してみます。
特定のコンポーネントや自身の親や子の要素から1つのコンポーネントを取得する方法は
でやり方を記載していますのでそちらをご覧ください。
自身に設定されているコンポーネントを全て取得するGetComponents
まずは自身のゲームオブジェクトに設定されているコンポーネントを全て取得する事が出来るGetComponentsを使ってみます。
例えば一つのゲームオブジェクトに複数のコライダが設定されている時に全てのコライダを取得する事が出来ます。
ひとつサンプルを作成してみます。
↑のようにStandard Assets→Characters→ThirdPersonCharacter→Models→Ethanをヒエラルキー上にドラッグ&ドロップします。
↑のようにBoxColliderとSphereColliderを取りつけます。
↑はコライダのサイズを調整した状態です。
今回はコンポーネントを取得するサンプルなので細かい事は忘れましょう・・・・。
GetComponentsTestスクリプトを作成し、Ethanに設定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | using UnityEngine; using System.Collections; public class GetComponentsTest : MonoBehaviour { // コライダを入れる配列 private Collider[] cols; void Start () { // 自身に設定されているColliderコンポーネントを全て取得 cols = GetComponents<Collider>(); // 取得したコンポーネント全ての名前を表示 foreach(var col in cols) { Debug.Log(col); } } } |
コライダはBoxColliderとSphereColliderを取りつけていますので親クラスであるCollider型の配列を宣言し取得したコンポーネントをそこに入れるようにします。
GetComponentsで自身に設定されているColliderコンポーネントを取得しcolsに入れます。
最後に取得したコライダのゲームオブジェクトの名前を出力してます。
それでは実行してみましょう。
↑のようにBoxColliderとSphereColliderが取得出来る事を確認出来ました(上ではEthanとなってますがゲームオブジェクト名がEthan(1)ならばEthan(1)が表示されるはずです)。
自身の子要素に設定されているコンポーネントを全て取得するGetComponentsInChildren
さきほどのGetComponentsでは自身のゲームオブジェクトに複数のコンポーネントが設定されていた場合取得出来ますが、
子要素に設定されているコンポーネントは取得出来ませんでした。
そこで自身のゲームオブジェクトを含む子要素に設定されているコンポーネントも取得出来るGetComponentsInChildrenを使用してみましょう。
↑のようにEthanのボーンの子要素に右クリック→Create Emptyを選択しそれぞれの名前を設定します。
それぞれにはコライダを設定します。
左足の部分は↑のようにコライダを設定しています。
↑がそれぞれの部位にコライダを設定した状態です。
さきほどのスクリプトを少し変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | using UnityEngine; using System.Collections; public class GetComponentsTest : MonoBehaviour { // コライダを入れる配列 private Collider[] cols; void Start () { // 自身と自身の子要素に設定されているColliderコンポーネントを全て取得 cols = GetComponentsInChildren <Collider> (); // 取得したコンポーネント全ての名前を表示 foreach(var col in cols) { Debug.Log(col); } } } |
GetComponentsをGetComponentsInChildrenに変更します。
これをEthanに設定し実行してみます。
↑のように取得したコライダのゲームオブジェクトの名前が表示されました。
GetComponentsInChildrenを使うと自身に設定されているコンポーネントを含む子要素全てのコンポーネントが取得出来る事がわかりました。
自身の親要素に設定されているコンポーネントを全て取得するGetComponentsInParent
自身の親要素に設定されているコンポーネントを全て取得するにはGetComponentsInParentを使います。
使い方はGetComponentsInChildrenと同じなので割愛します。
終わりに
一括して同種のコンポーネントを取得したい事もあると思います。
例えばダメージを受けるコライダを体の部位毎に作成しているけど無敵になるアイテムを取ったらダメージを受けるコライダを全て無効にするといった場面です。
そういう時はキャラクターを動かす当たり判定のコライダも取得されてしまいますが、タグを設定し振り分ければダメージを受けるコライダだけ無効にする事が可能です。
一つ一つのコンポーネントを取得するのが面倒な時に今回のように一括でコンポーネントが取得出来ると便利ですね(^_^)v