4276


uGUIでSetParent(null)を使ってはいけないのでしょうか？

Unity4.6から、TransformにSetParentというメソッドができて、parent=としていた記述は、「SetParentを使うように」というwarningがでていると思います。

warningにしたがってコードを修正したのですが、parent=null; としていたのを
SetParent(null)とすると、潜在的に不具合を抱えたままゲームが進行して何かのきっかけでバグるようです。自分のアプリではほぼ再現率100%でUnityエディタがクラッシュする手順があります。ただ似たようなロジックのところでは正常に動作するため、どういう要素が影響しているかまではわかりませんでした。

SetParent(null)を使用していたのは、子オブジェクトを全部削除するときで、このように書いていました。

[code]

     //SetParent(null)の書き方だとどうもマズイ模様
     while (parent.childCount > 0)
     {
          Transform child = parent.GetChild(0);
          child.SetParent(null);
          GameObject.Destroy(child.gameObject);
     }
    
[/code]

このように変えたら直りました。

[code]

     //書き方を変更
     foreach(Transform t in this.transform)
     {
          Destroy(t.gameObject);
     }
    
[/code]

SetParent(null)としていたのは、削除したときに、parent.childCountもちゃんとゼロになるようにしたかったからです。
GameObject.Destroyだけでは、1フレーム後じゃないと子オブジェクトが削除されないらしく、明示的にparent=nullとすることで子オブジェクトから外れるようにしていたのですが、.SetParent(null)とした場合は不正な処理になるようです。


CC BY-SA 3.0
2015-01-08T06:17:57.597
4275
2015-01-08T07:30:14.370
3593
question
unity3d ugui
uGUIでSetParent(null)を使ってはいけない？


直前にSetActive(false)とすることで動作するようになりました。
おそらくですが、uGUIのオブジェクトはCanvas以下に置かれる前提で設計されているため、SetParent(null)としてルート直下にあるオブジェトにすると不具合を起こすのだと思います。

[code]

       //SetActive(false);とすると動く
       while (parent.childCount > 0)
       {
            Transform child = parent.GetChild(0);
            child.gameObject.SetActive(false);
            child.SetParent(null);
            GameObject.Destroy(child.gameObject);
       }
    
[/code]


CC BY-SA 3.0
2015-01-08T06:21:54.520
4276
2015-01-08T07:30:14.370
2015-01-08T07:30:14.370
3593
3593
4275
answer