6804
初の質問投稿となります。よろしくお願いします。

uGUI の Textをプレハブから生成した後、 Canvas を親として設定するためにプレハブを使い

```

    public class NumberText : MonoBehaviour
    {
        public Canvas UICanvas;     //UIを表示するキャンバス
        void Awake(){
            transform.SetParent(UICanvas.transform, false);
        }
    }
    
```

というように書いたのですが、下記のエラーが出てしまいます。

> Setting the parent of a transform which resides in a prefab is disabled to
> prevent data corruption.

プレハブを使わずに、 Canvas を直接 `GameObject.Find`
することで正常に動作してくれたのですが、プレハブ化出来ないのがどうもモヤモヤします。

Inspector 上でプレハブやスクリプトを付け忘れていないことは確認しているのですが…。  
Canvas をプレハブ化して参照するような使い方をすることが間違っているのでしょうか？

また、 Hierarchy にある CanvasはPanel や Image を子オブジェクトとして持つのですが、プレハブ化した際にこれらの子オブジェクトが
Project ビューに表示されないことも気になります。

![スクリーンショット](https://i.stack.imgur.com/ZiPku.png)
CC BY-SA 3.0
2015-02-19T16:47:10.087
6793
2015-02-25T02:48:39.837
2015-02-20T05:03:11.050
6085
6085
question
c# unity3d ugui
Canvas のプレハブ化が上手くいきません。
`Assets/Prefabs/NumberText.prefab` にアタッチしているNumberTextコンポーネントですが、  
UICanvasにInstantiate前の `Prefab` が設定してあるのが問題だと思います。  
ProjectView内のPrefabはInsrantiateしないでそのまま使う事はできません

Hierarchy上のCanvasをtransform.SetParent()するといいんじゃないでしょうか

```

    void Awake(){
        var canvas = GameObject.FindObjectOfType<Canvas>();
        transform.SetParent(canvas.transform, false);
    }
    
```

あと、 ProjectViewには孫以下のGameObjectは表示されない仕様？だったはず
CC BY-SA 3.0
2015-02-20T01:59:45.860
6804
2015-02-20T02:09:23.810
2015-02-20T02:09:23.810
3944
3944
6793
answer
Find系は処理が遅いと言われてますが、繰り返し処理しなければほとんど問題にはなりません。  
AwakeやStart、また何らかのトリガから一度のみ行う場合はそんなに神経質にならなくても大丈夫です。  
また、それでもFindしたくないのであれば、Publicな変数にCanvasを設定し、インスペクタから設定することでもCanvasを取得することは可能です。  
その場合はProjectView内のCanvasではなく、HierarchyView内のCanvasをインスペクタから設定してください。
CC BY-SA 3.0
2015-02-25T02:48:39.837
7053
2015-02-25T02:48:39.837
8539
6793
answer