【Unity】スクリプトからUIを生成する際につまづいた点

スクリプトからUIを生成する際につまづいた点
プログラミング

やりたかった事

メニュー画面からゲーム画面へ遷移した後にUIをスクリプトを使って表示させる。

つまづいた点

・Prefabから生成したobjectが画面に表示されなかった
Prefabとして用意しておいたボタンなどのUIをスクリプトから生成しようとした際に次のようなエラーメッセージが出てきました。

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

意味としては、Prefabに対しては親を設定できないようにしているといったようです。

参考サイト

参考サイトのケースでは、Prefabをinstantiateにしていなかったのが原因だったようですが、私の場合はinstantiateしているのにこのエラーが発生しました。

解決方法

    public void GhostArrangement(string prefabs_path, float pos_x, float pos_y)
    {
        //インスタンスの生成
        GameObject ui = (GameObject)Resources.Load(prefabs_path);

        //修正前
        Instantiate(ui, new Vector3(pos_x, pos_y, 0), Quaternion.identity);

        //canvasの子に指定
        ui.transform.SetParent(this.canvas.transform, false);

        //修正後
        GameObject ui_clone = Instantiate(ui, new Vector3(pos_x, pos_y, 0), Quaternion.identity);

        //canvasの子に指定
        ui_clone.transform.SetParent(this.canvas.transform,false);
    }

instantiateをする記述自体は書いていたのですが、
instantiateしたオブジェクトに対して親オブジェクトを指定してあげていなかった点が原因でした。

おまけ

子オブジェクトは座標が親に追従するので
instantiateで座標を指定したとしても思い通りに行きません。

SetParent()の第二引数をfalseにしてやると親への追従を無視することができます。
ここも最初戸惑いました。

スポンサーリンク
プログラミング
【Unity】scene view から音を消す

最近、というか今日からUnityに再び触り始めました。ゲーム開発をやってみたいと思っています。 まず …

ローカル開発でPHPの更新が反映されない
PHP
ローカル開発でPHPの更新が反映されない

MAMPを使ってローカル開発環境を構築し、Wordpressのテーマを作ろうとしています。 HTML …

サウンドプログラマー
DTM
サウンドプログラマーとは何ぞ

Contents1 サウンドプログラマー という職業があるらしい2 作曲はしないけど音楽関係の仕事— …