🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

1回答

2290閲覧

Unity 3D オブジェクト リスト 表示/非表示 一括切り替え SetActve

911RSR

総合スコア13

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2021/03/14 02:48

依然としてUnity 3Dでゲームを開発しています。

UIのボタンを押して、複数のオブジェクトの表示/非表示を一括で切り替えたいです。

シーン上には非表示のオブジェクトと表示しているオブジェクトが混在していて、
ボタンを押すと非表示のオブジェクト→表示に、表示中のオブジェクトは非表示にしたいです。

ボタンはゲーム中何回も押すことができ、そのたびに表示/非表示を交互に入れ替えたいです。

表示/非表示にはenable、SetActiveなどいろいろありますが、今回はSetActiveで行きたいです。

以下のスクリプトを試しましたが、一度非表示にしてしまったものが、再度ボタンを押してもうまくいきません。

C#

1using UnityEngine; 2using GlobalOutline; 3using System.Collections.Generic; 4 5public class SwitchBotton : MonoBehaviour 6{ 7 public GameObject[] targetObjects; 8 9 10 11 // Start is called before the first frame update 12 void Start() 13 { 14 15 } 16 17 // Update is called once per frame 18 void Update() 19 { 20 21 } 22 23 public void OnClick() 24 { 25 foreach (GameObject targetObject in targetObjects) 26 { 27 if (targetObject.activeSelf == false) 28 { 29 targetObject.SetActive(true); 30 } 31 32 if (targetObject.activeSelf == true) 33 { 34 targetObject.SetActive(false); 35 } 36 } 37 } 38}

なお、対象のオブジェクトを二つに絞った場合、またボタンを一回だけ押せる場合には以下のスクリプトでうまくいきました。

C#

1using UnityEngine; 2using GlobalOutline; 3using System.Collections.Generic; 4 5public class SwitchButton : MonoBehaviour 6{ 7 public GameObject targetObject1; 8 public GameObject targetObject2; 9 10 11 12 // Start is called before the first frame update 13 void Start() 14 { 15 16 } 17 18 // Update is called once per frame 19 void Update() 20 { 21 22 } 23 24 public void OnClick() 25 { 26 targetObject1.SetActive(false); 27 targetObject2.SetActive(true); 28 } 29}

アドバイスよろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

foreach内のif文が別れてしまってるので、

●最初のif → falseのものをtrueに変える。
●次のif → 最初のifでtrueにしたものをfalseに変える。

となってしまってます。

elseで繋げば、多分うまくいくと思います。

public void OnClick() { foreach (GameObject targetObject in targetObjects) { if (targetObject.activeSelf == false) { targetObject.SetActive(true); }else{ targetObject.SetActive(false); } } }

投稿2021/03/14 07:59

moory

総合スコア146

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

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

911RSR

2021/03/15 03:48

シンプルかつ的確、スピーディな訂正を誠にありがとうございます! 自分で無限ループに陥っていたのですね!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問