GameObject.Destroy()がうまく動かない
まず引数にGameObjectが入っているか確認する。thisとか入れるとコンポーネント(スクリプト)が削除されてしまう。
思い通りに動いたり動かなかったりするときはタイミングの問題かもしれない。
Destroyは現在のフレーム終了後、次のフレーム開始前に実行される。
そのためDestroy直後に親オブジェクトから子オブジェクトを数える処理なんかを入れてもDestroy前の結果が返ってくる。これを回避するためにコルーチンを使う。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
//Actionに必要 using System; ... //親ノードから子ノードを数える private void CountNode(){ ... } //子ノードを消す public void Delete(){ Destroy(some game object); StartCoroutine(Delay(1,CountNode));//1フレーム後に実行 } //fフレーム後に関数実行 IEnumerator Delay(int f,Action act){ for(var i=0;i<f;i++)yield return null; act(); } |
これはDestroy後の処理を1F遅らせているけど、Destroy自体を遅らせるときは第2引数に秒数を入れる。遅らせたDestroyのさらに後に処理を入れるならオブジェクトに OnDestroy() を定義してタイミングをはかる必要がある。
1 |
Destroy(Object obj, float t = 0.0F); |