質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.76%

  • Unity

    3594questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • UI

    97questions

    UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Unity-ButtonをInstantiateすると”空のゲームオブジェクト”が生成されてしまう

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 328

hgwr

score 58

3Dゲームを製作しています。
UIの一環で、入力に応じてButtonをInstantiateしたいです。
以下のコードを書いたところ、Buttonの動的生成は問題なくできたのですが、なぜかButtonを生成するたびに”空のゲームオブジェクト”が併せて作られてしまいます。

ゲームの進行には影響ないのですが、ヒエラルキーが混雑してとても厄介です。
Buttonのみが生成されるようにするにはどうすればいいでしょうか?
最悪、そのつど空オブジェを消去することを考えていますが、できるだけ処理を軽くしたいのです。
回答よろしくお願いします。

入力に応じて下記のAddButtonが呼び出されます。

[SerializedField]
private GameObject AddedButton;//canvas上にあるImageです。生成したButtonはこれの子要素としつつ、Image上に並べて載せて管理するつもりです。

[SerializedField]
private GameObject ButtonA;//生成されるButtonのPrefabです。本来は複数種あります。

private void AddButton(int value)
    {
        GameObject creatingButton = new GameObject();

        switch (value)
        {
            //いくつか種類を用意されたButtonプレハブの中からどのButtonを生成するか選ぶ処理です。
           //case 1以降は省略していますが、case 0とほぼ同じものが並びます。
            case 0: creatingButton=ButtonA;
        }

        GameObject createdButton= Instantiate(creatingButton)as GameObject;
        createdButton.transform.SetParent(AddedButton.transform, false);

    }
コード
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

GameObject creatingButton = new GameObject();の部分が原因と思われます。

creatingButtonは引数valueに応じて各種ボタンプレハブを切り替えて格納するために用意したもののようですが、それには変数だけがあれば充分であり、宣言時にわざわざ空のゲームオブジェクトを作って入れてやる必要はないはずです(この時作られたゲームオブジェクトがずっと生き残って、ヒエラルキーを圧迫していると考えられます)。

上記部分をGameObject creatingButton;という風に、宣言だけして初期化しないようにしてはどうでしょう。
あるいは、GameObject creatingButton = null;にしてnullで初期化するというのもありかと思います。最初の方法では、その後のswitchdefault節を設けて、valueがどんな値であってもcreatingButtonに必ず何かしらの値が代入されるようにしないと、さらにその後のGameObject createdButton= Instantiate(creatingButton)as GameObject;の部分で「Use of unassigned local variable `creatingButton'」などとエラーメッセージが出てしまうでしょう。

※もう一つ、おそらく実際のコードでは大丈夫でしょうが(単なる書き写し間違いかと思いますが)、ご提示いただいたコードでは[SerializeField][SerializedField]になってしまっているようです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/26 09:16

    回答ありがとうございます!
    おかげ様で空オブジェが生成されないようにできました。
    その後の分岐文で使う変数をnew〇〇()で初期化するなら、分岐を100%網羅する書き方をしないといけないんですね、勉強になりました。

    SerializeFieldについても仰る通り私の写し間違いです、以後気を付けますm(__)m

    キャンセル

  • 2018/01/26 09:40

    念のため補足しますと、「その後の分岐文で使う変数をnew〇〇()で初期化するなら」というより「その後の分岐文で使う変数を初期化しないなら」の方が私の意図に合っていますかね。

    switchで全パターンを網羅していない状態でも、もし変数を「new〇〇()」あるいは「null」で初期化してあると、とりあえずコンパイルはされるはずです(実際にスクリプトを動作させたときに意図しない挙動をする可能性はありますが)。
    これに対して、変数が初期化されていないと、回答で言及したエラーによりコンパイルに失敗するはずです。

    この辺の違いは、実際にコードをいろいろ書き換えてみて比較していただけますと分かりやすいかと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Unity

    3594questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • UI

    97questions

    UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。