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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

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

Q&A

解決済

3回答

891閲覧

ゲームオブジェクトの表示非表示について

h-054

総合スコア13

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

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

0グッド

0クリップ

投稿2019/03/03 14:14

Unity初心者です。今、自分の作っているゲームの中でオブジェクトをつけたり消したりというところがあるのですが、 gameObject.SetActive(false);で非表示にしたゲームオブジェクトをgameObject.SetActive(true);でもう一度表示させたいのですができません。調べてみたところ、 gameObject.SetActive(false);にしたゲームオブジェクトは、もう一度表示することができないとありました。一度非表示にしたゲームオブジェクトをもう一度表示するにはどうしたらいいでしょうか?教えてください。

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

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

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

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

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

guest

回答3

0

SetActive(false); だと非アクティブになってしまうからです。
私達も一旦寝てしまったら、起きるまでは何もできないですよね。そんな感じです。

だったら目覚ましで起こすようなイメージで、オブジェクトを管理する別オブジェクトを用意すればOKです

Unityで「Cube」を作って1個おいておきます。
次に「Create Empty」で空のゲームオブジェクトを作ります。
下記のスクリプトを**「空のゲームオブジェクト」にアタッチ**します。

C#

1 GameObject myCube; 2 3 void Start() { 4 myCube = GameObject.Find("Cube"); // 対象のゲームオブジェクト 5 } 6 7 void Update() { 8 9 // マウスクリックしたとき 10 if (Input.GetMouseButtonDown(0)) { 11 12 // 対象のオブジェクトがアクティブか? 13 if (myCube.activeInHierarchy) { 14 myCube.SetActive(false); // 対象のオブジェクトを非表示にする 15 } else { 16 myCube.SetActive(true); // 対象のオブジェクトを表示する 17 } 18 } 19 20 }

実行して画面をクリックしていくと、クリックのたびにCubeが出たり消えたりするはずです。

投稿2019/03/04 01:27

hogefugapiyo

総合スコア3302

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

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

0

一度非表示にしたゲームオブジェクトをもう一度表示するにはどうしたらいいでしょうか?教えてください。

一番簡単なのは表示状態で座標を画面外に飛ばせば良いだけです。

投稿2019/03/04 00:49

stdio

総合スコア3307

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

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

0

ベストアンサー

超短い回答:他のオブジェクトから実行してください。

以下解説。
なぜ一度Activeをfalseにしたオブジェクトをtrueに出来ないかというと、
「GameObjectのActiveがfalseの時、そのオブジェクトとその子孫オブジェクトに付いているスクリプトのメソッドは自動的には実行されないから」です。

具体的には、Start、Update、IEnumerator(コルーチン)等のメソッドは新たに呼ばれません。
なのでその中でActive(true)のコードを書いても、呼ばれないのでずっとtrueになりません。

じゃあどうすればいいかというと、別のオブジェクト(スクリプトやコンポーネント)から呼べばいいです。
直接targetObject.SetActive(true);もいいし、
該当オブジェクトに付与されたコンポーネントを取得しておけば、その中のメソッド(コルーチン除く)を新たに実行させることは可能です。
(ちなみにGameObject.Find等のFind系命令は、Activeがfalseの間は取得出来ないので別の方法で参照を持ってください)
この辺りがよくわからない場合は「unity 別オブジェクト スクリプト」で検索してみてください。

投稿2019/03/03 15:42

sakura_hana

総合スコア11427

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

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

h-054

2019/03/04 08:02

簡潔かつわかりやすい説明ありがとうございました。別のオブジェクトからやってみたところうまく行きました。 他の回答してくれた人たちもありがとうございます。とても助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問