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

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

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

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

Q&A

解決済

2回答

1492閲覧

配列を使って、指定したキーを押すとそこに格納されたオブジェクトだけを表示したい

yuuuuun

総合スコア1

Unity

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

0グッド

0クリップ

投稿2020/12/02 13:57

編集2020/12/02 14:02

配列を使って、指定したキーを押すとそこに格納されたオブジェクトだけを表示したい

配列を使い、インスペクター上でキーとオブジェクトを数パターン指定しました。
そのキーを入力した際だけそのElementに格納したオブジェクトを表示したいのですが、どうコードを書けばよいのかわかりません。

例えば
Size 3 だとして
○Element 0
[Key] a
[Gameobject] cube1

○Element 1
[Key] s
[Gameobject] cube2

○Element 2
[Key] d
[Gameobject] cube3

と配置したときに
「a」を押すと cube1がsetActive(true)になって、cube2とcube3がsetActive(false)になるイメージです。

どなたかおしえていだだけませんか。。。

現状はここまでしかできていません

sing System.Collections; using System.Collections.Generic; using UnityEngine; public class test : MonoBehaviour { [System.Serializable] public class ActiveObjects { public KeyCode KEY; public GameObject GameObject; } public ActiveObjects[] activeObjects; }

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

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

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

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

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

guest

回答2

0

ベストアンサー

変な回答してしまいました、申し訳ありません。
この書き方ならば動くはずです。

ですが、その前にメンバ名が気になったので訂正させてください。

[System.Serializable] public class ActiveObjects { public KeyCode key; // C#はフィールド(変数)は小文字スタートが推奨されていたはずです. public GameObject gmObj; // gameObjectはUnity内部で利用されているので, 混乱しないよう避けるべきです. }

c#

1private void Update() 2{ 3 // キー監視 4 for(var i=0;i<activeObjects.Length;i++) 5 { 6 // 対応するキーが押されたら 7 if(Input.GetKeyDown(activeObjects[i].key)) 8 { 9 ToggleObjects(i); //トグル開始 10 } 11 } 12} 13 14// 指定したオブジェクトを有効, ソレ以外を無効化するメソッド. 15private void ToggleObjects(int idx) 16{ 17 for(var i=0;i<activeObjects.Length;i++) 18 { 19 if(idx==i) 20 activeObjects[i].gmObj.SetActive(true); 21 else 22 activeObjects[i].gmObj.SetActive(false); 23 } 24}

投稿2020/12/02 14:45

編集2020/12/02 14:47
Sado

総合スコア89

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

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

yuuuuun

2020/12/02 14:55

すごい!コメントまでつけて丁寧に教えていただきありがとうございます;; 完璧に動作しました! また、私が書いた変数まで訂正していただきありがとうございます;; 書き方もわかりやすくて、めちゃめちゃ助かりました。 これを元に勉強させていただきます!!
Sado

2020/12/02 14:57

恐れ入ります。
guest

0

キー押下時にactiveObjectsをひとつずつ比較するしか……。
(activeObjects[i].KEY == nowPressed)のような条件式で、trueならSetActive(true)、falseならその逆と、全ての要素に対して行えばよいかと思います。

これだけですと、非対応のキーが押された場合すべて消えてしまいますので、お望みの挙動をするよう工夫する必要があります。

投稿2020/12/02 14:04

Sado

総合スコア89

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

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

yuuuuun

2020/12/02 14:16

素早いアドバイスありがとうございます! 大変嬉しいのですが、unity初心者なもので、条件式とかあまり良くわかっておらず、実際にどうコードを書けばよいかわかりません、、、ごめんなさい;; Sadoさんのやり方ですと間違って指定外のキーを押してしまうとすべて消えてしまうんですね、、、
Sado

2020/12/02 14:34 編集

そうですね、手っ取り早く書くと以下のようになります。 private void Update()に書く内容になります。 // for(var i=0;i<activeObjects.Length;i++){ var isBtnDown= Input.GetKeyDown(activeObjects[i].KEY); //今押されたキーがソレか activeObjects[i].gameObject.SetActive(isBtnDown); } // 配列内のすべてを比較し「キーが押されていたら有効化、押されていなければ無効化」のように書いています。 これは、全てのオブジェクトで「キーが押されていなければ無効化」が通ってしまうif文の書き方ですので、有効無効を切り替える前に「押されたキーが想定範囲内かどうか」を確認するべきでしょうね。
Sado

2020/12/02 14:35

すみません、あまり深く考えずに書きました。 これでは色々穴がありますね。 押された瞬間だけ、有効無効をトグルする処理を書くべきでした。
yuuuuun

2020/12/02 14:44

詳しくかいてくださり、ありがとうございます! unityで実際に書いてみました。 そして。。。すみません!説明不足だったかもしれないのですが、キーを押してる間だけではなくて、イメージ的には、キーを押したら表示です;;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問