Django Girls and Boys 備忘録

Python、Selenium、Django、java、iPhoneアプリ、Excelマクロなどで気付いたこと、覚えておきたいことなどを載せていきます。

【Unity】スクリプトからボタンを生成しようとしてうまく表示されなかった時の解決した方法


Unityでスクリプトからボタンを追加しようとしたところ、なぜか表示されませんでした。

まだまだ未熟者ということもありはじめは理由が分からずしばらく悩んでしまったため解決した方法を備忘録として残しておきます。

 

 

 

ボタンが表示されなかった時のコードの内容

 

以下のコードは修正前のものです。

あらかじめボタンはプレハブにしてあり、インスペクター上でpublic宣言したbtnPrefabにそれをアタッチしてある状態です。

はじめは他のオブジェクトの生成の時と同様、Instantiate()を使用して以下のようなコードで表示されるものかと思ってやっていました。

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class GameController : MonoBehaviour
{
    public GameObject btnPrefab;

    // Start is called before the first frame update
    void Start()
    {
            GameObject btn = Instantiate(btnPrefab) as GameObject;
    }

}

 

実際にはこれでは表示されませんでした。

 

 

修正後のコードの内容

 

 

そこで、再度ヒエラルキーウインドウの方で+のプルダウンメニューから選択して配置してみたところ問題なく表示されたのですが、よくよく見るとヒエラルキーウインドウで選択して配置したボタンオブジェクトはCanvasの中に入っているではないですか。

 

これかと思い、Canvasを親とする子オブジェクトとして生成するにはどうするのかといろいろと?調べた結果最終的に修正したコードは以下のようでした。

 

Canvas 型の変数を宣言しておいた後に、ボタンを生成し、このボタンをCanvas 型の変数を親とする子オブジェクトとして設定しました。

このようにして実行したところ、ヒエラルキーウインドウ上でもCanvasの子オブジェクトという表示で生成されるようになり、無事Gameウインドウ内にも表示されるようになりました。

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class GameController : MonoBehaviour
{
    public Canvas canvas;
    public GameObject btnPrefab;

    // Start is called before the first frame update
    void Start()
    {
            GameObject btn = Instantiate(btnPrefab) as GameObject;
            btn.transform.SetParent(canvas.transform, false);
    }

}

 

 

以上が、言語切替メニューの表示非表示設定切り替え方法についての説明になります。