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

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

新規登録して質問してみよう
ただいま回答率
85.48%
UI

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

667閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

UI

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/01/21 19:44

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); } コード

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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/21 21:03

編集2018/01/21 21:32
Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/01/26 00:16

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

2018/01/26 00:40

念のため補足しますと、「その後の分岐文で使う変数をnew〇〇()で初期化するなら」というより「その後の分岐文で使う変数を初期化しないなら」の方が私の意図に合っていますかね。 switchで全パターンを網羅していない状態でも、もし変数を「new〇〇()」あるいは「null」で初期化してあると、とりあえずコンパイルはされるはずです(実際にスクリプトを動作させたときに意図しない挙動をする可能性はありますが)。 これに対して、変数が初期化されていないと、回答で言及したエラーによりコンパイルに失敗するはずです。 この辺の違いは、実際にコードをいろいろ書き換えてみて比較していただけますと分かりやすいかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問