Programming Serendipity

プログラミングを中心に種々雑多に書き留めます

Unity5 メモ11

  • 子オブジェクトまで全て再帰的に有効・無効にする
    Textコンポーネントなどに用意されているenebledフィールドは、これだけをtrue/falseにすると、
    このコンポーネントがアタッチされているオブジェクトだけが有効・無効になり、その子オブジェクトなどはそのままになる。
    これを制御するには、TextとしてではなくGameObjectとして受け取り、
    SetActive(false);のようにすると下の階層のオブジェクトも全て無効になる。

  • GameObjectの配列の長さを動的に変更する
    Gameobject[] など、生の配列は固定長なので、C#の機能を使う。

using System.Collections.Generic;  
List<GameObject> enemyGroup;  
  • Instantiate()と親子関係の設定、生成したオブジェクトのメソッドのコールを同時に行う方法
    敵を生成して、敵マネージャーオブジェクトの子にし、敵のパラメータの設定まで一度に行いたいとする。
    敵をInstantiate()でGameObjectとして生成すると、受け取ったクローンはEnemyの情報が欠落しているためメソッドが呼び出せず、
    Enemyとして生成するとGameObjectの情報が無いため親子関係を設定できない。
    そこで、GameObjectとして生成してSendMessage()関数を使用する。
GameObject go = Instantiate(enemyList[index], pos, Quaternion.identity) as GameObject;  
go.transform.parent = GameObject.Find("Enemies").transform;  
go.SendMessage("SetIndex", resisterIndex);  
  • コルーチンにラムダを渡すときの注意点
    StartCoroutineでラムダ式を使用できるようにするラッパークラス
    のようなやり方をする場合、渡したラムダが評価されるのは実際に呼ばれるタイミングのため、
    例えばfor文のループカウンタをラムダ内で使っていると、呼ばれたときはループカウンタが回りきった状態のため、
    ループカウンタを使って配列を参照していると配列外参照が起きる。
    この場合はラムダではなくStartCoroutine()でその時点の値を渡すと期待通りの動作になる。

  • スクリプトでGameObjectを削除する場合
    Destroy(this);とするとスクリプトが削除されるだけでGameobjectは残る。
    Destroy(gameObject);またはDestroy(this.gameObject);とすることでGameObjectも削除される。
    逆に、そのスクリプトでオブジェクトの移動をしていた場合、わざとスクリプトだけを削除することでどのタイミングで破棄されることになるのか確認に使うこともできる。