子のオブジェクトをコレクション化して名前を調べたり、その子すべてにコンポーネントを追加するサンプル

一番早いインスタンス取得

コンポーネントのインスタンスを拾うならAwakeが一番良い場所と思われる
Awakeはスクリプトのインスタンスがロードされたときに呼び出される。つまりunityでは実質Awakeがコンストラクタ
StartはUpdateの前に一度だけ呼ばれるので厳密な意味インスタンス取得のタイミングとしてはふさわしくないっぽい

  void Awake(){
       tes1Map = map.GetComponent<Tes1Map>();
   }

LINQとラムダ式を利用したコレクション内の検索


C#らしいLINQとラムダ式を利用したコレクション利用
今回はオブジェクトネームからフレーズをContainsで検索してコレクションを作成している

using UnityEngine;
using System.Collections;
using System.Linq;

public class MikuPuzzle : MonoBehaviour {
  
   MikuPeiceCtrl[] myPeices;
   
   // Use this for initialization
   void Start () {
       
       Transform[] tr;
         tr = this.transform.GetComponentsInChildren<Transform>();
       
 // var query =
 // from item in tr
 // where item.gameObject.name.Contains("Peice")
 // select item;

      
       //LINQとラムダ式を利用したコレクション内の検索
       var query = tr.Where(p => p.gameObject.name.Contains("Peice"));
       
           foreach (Transform item in query) {
           item.gameObject.AddComponent("MikuPeiceCtrl");
       }    
       
       myPeices = this.transform.GetComponentsInChildren<MikuPeiceCtrl>();
       
   }
   
   // Update is called once per frame
   void Update () {
   
   }
}


サンプル1

using UnityEngine;
using System.Collections;

public class GetChild : MonoBehaviour {
  
   int peiceNum =0;
   MyPeice[] allPiece;
   
   // Use this for initialization
   void Start () {
       
       //最初にピースの数だけ求める 
       for (int i = 0; i < this.transform.childCount; i++) {
           GameObject go = this.transform.GetChild(i).gameObject;    //GetChild()で子のgameobjectを得る 
           if(go.name=="base"){continue;}
           peiceNum++;
       }
       allPiece = new MyPeice[peiceNum];
       
       //次にMyPeice[]の配列に割り当てる iとnとcontinueの使い方に注目。GetChild()は.NETの標準関数で子を拾える 
       for (int i = 0 , n =0; i < this.transform.childCount; i++) {
           GameObject go = this.transform.GetChild(i).gameObject;
           if(go.name=="base"){continue;}
           go.AddComponent("MyPeice");
           allPiece[n++] = go.GetComponent<MyPeice>(); 
       }
       
       allPiece[4].TestMethod();
   }
   
   // Update is called once per frame
   void Update () {
   
   }
}

サンプル2

Transform型はGameObject型の代わりに使用することができる事を利用するコード
transform.gameObject と gameObject(this.gameObject)は同一。よくUnityのスクリプトでモデルを登録する際、GameObject ではなく Transform だったりするのは transform.gameObject で代用できるから。GetComponentsInChildrenをGameObject[]で利用すると使えないので抜け道としてこれがあるのでは?ただしGetComponentsInChildrenは自分自身も子として含めて探してくる(親が含まれる)ので自分も省く必要がある
      
       Transform[] tr = this.transform.GetComponentsInChildren<Transform>();
       foreach (Transform item in tr) {
           if(item.gameObject.name != "base"){item.gameObject.AddComponent("MyPeice");}
       }
       
       allPiece = this.transform.GetComponentsInChildren<MyPeice>();
       allPiece[4].TestMethod();
       

メニュー



  • 最終更新:2014-06-13 12:04:41

このWIKIを編集するにはパスワード入力が必要です

認証パスワード