(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

親や子オブジェクトも含めた範囲から指定のコンポーネントを取得する【Unity】


このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 5.1.0f3 Personal

はじめに

以下のようにアニメーションと連動するように下層にコライダーを設定し、

Player等の他のコンポーネントを一番親のオブジェクトに設定した場合


f:id:kan_kikuchi:20150825205129p:plain


衝突時に以下のようなコードではPlayerを取得出来ません。

private void OnCollisionEnter (Collision collision){
  //コライダーとPlayerスクリプトが違うオブジェクトに設定されているため取得できない
  Player player = collision.gameObject.GetComponent<Player>();
}


ルートのオブジェクトはtransform.rootで取得できますが、

欲しいコンポーネントがrootにあるとは限らないので、

親や子オブジェクトも含めた範囲から指定のコンポーネントを取得するメソッドを作成しました。

GetComponentInParentAndChildren

以下がそのコードになります。



使い方はこのGameObjectExtension.csを作成し、

GetComponentを使う要領で以下のようにします。

Player player = gameObject.GetComponentInParentAndChildren<Player> ();


これで親や子オブジェクトも含めた範囲から指定のコンポーネントを取得

できるようになります。

問題点は指定のコンポーネントが複数ある場合、一つしか取れない事です。


そんな時はGetComponentsInParentAndChildrenを使うと

List<Player> _playerList = gameObject.GetComponentsInParentAndChildren <Player> ();

親や子オブジェクトも含めた範囲から指定のコンポーネントを全て取得できます。