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

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

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

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

Unity

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

Q&A

解決済

2回答

172閲覧

オブジェクトの消し方(初心者の質問だと思います)

KY7777

総合スコア10

C#

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

Unity

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

0グッド

0クリップ

投稿2018/10/05 23:14

前提・実現したいこと

UnityでMIDI入力に対して動くゲームを作っています。(Unity+C#初心者です)

あるキー(鍵盤)を押したとき、
キーの番号に応じた位置に画像「Key1_C_white」を表示し、(※1)

同じキーを離したとき、
その位置に表示していた画像を消したいと思っています。(※2)

画像の上塗りも考えましたが、
オブジェクトが増える一方なので、辞めました。

お手数ですが、よろしくお願いいたします。

発生している問題・エラーメッセージ

画像が消えない

該当のソースコード

for(int i = 21; i <= 108; ++i) {
if (MidiInput.GetKeyDown(i))
{
Vector3 placePosition = new Vector3(i-65, 0, 0);
Instantiate(Key1_C_white, placePosition, Quaternion.identity);//(※1)画像表示
}
}
for (int i = 21; i <= 108; ++i){
if (MidiInput.GetKeyUp(i))
{
Destroy(Key1_C_white);//(※2)ココに何と書けば、上で表示させた画像(object?)を消せるのでしょうか?
}
}

試したこと


※2に Destroy(Key1_C_white.gameobject);と記述した
⇒キーを押したり離したりすると、画像オブジェクトは増える一方、何も減ることなし

※2に Destroy(Key1_C_white);と記述した
⇒キーを押したり離したりすると、画像オブジェクトは増える一方、何も減ることなし

※2に Destroy(gameobject);と記述した
⇒キーを押すと画像オブジェクト表示、離すと、上記プログラムを記述したCSファイルが消え、以降反応なし

補足情報(FW/ツールのバージョンなど)

Unity 2018.2.10f1 (64-bit)

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

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

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

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

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

guest

回答2

0

■消えない原因
Key1_C_whiteはコピー元のほうですので、そちらを消しても、新たに生成したものは消えない、というのが原因です。

■修正案
生成したものをリストに保存しておいて、
キーが離された時、そのリストから検索して、該当の画像を消します。
検索する為に、画像に番号を紐づけしています。
(KeyValuePair<int, GameObject>)

using System.Collections; using System.Collections.Generic; using UnityEngine; public class KeyImageGenerator : MonoBehaviour { List<KeyValuePair<int, GameObject>> keyImageList = new List<KeyValuePair<int, GameObject>>(); public GameObject Key1_C_white; private void Update() { for (int i = 21; i <= 108; ++i) { if (MidiInput.GetKeyDown(i)) { Vector3 placePosition = new Vector3(i - 65, 0, 0); GameObject image = Instantiate(Key1_C_white, placePosition, Quaternion.identity) as GameObject; //番号と画像を一緒にリストに登録 keyImageList.Add(new KeyValuePair<int, GameObject>(i, image)); } } for (int i = 21; i <= 108; ++i) { if (MidiInput.GetKeyUp(i)) { //番号(i)を使って、画像をリストから検索 var image = keyImageList.Find(x => x.Key == i); //対象の画像を削除 Destroy(image.Value); //リストからも削除する keyImageList.Remove(image); } } } }

投稿2018/10/06 03:42

ganta7188

総合スコア436

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

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

KY7777

2018/10/06 04:01 編集

ご丁寧なご回答いただきありがとうございます。 アルゴリズムの考え方は理解できたと思います。 しかし、記述いただいたプログラムでエラーは起きないのですが、 画像「Key1_C_white」が表示されません。 番号と画像を一緒にリストに登録する keyImageList.Add(new KeyValuePair<int, GameObject>(i, image)); をコメントアウトすると画像は表示されます。 上記の文の前に GameObject image = Instantiate(Key1_C_white, placePosition, Quaternion.identity) as GameObject; を記述しているので、画像は表示されるはずですが、 なぜでしょうか… 取り急ぎ状況報告とさせていただきます。 お手数をおかけしますが、 よろしくお願いいたします。
guest

0

自己解決

for (int i = 21; i <= 108; ++i) {
if (MidiInput.GetKeyDown(i))
{
GameObject image = Instantiate(Key1_C_white, new Vector3(i - 65, 0, 0), Quaternion.identity) as GameObject;
//番号と画像を一緒にリストに登録
keyImageList.Add(new KeyValuePair<int, GameObject>(i, image));
}
}

for (int i = 21; i <= 108; ++i){
if (MidiInput.GetKeyUp(i))
{
//番号(i)を使って、画像をリストから検索
var image = keyImageList.Find(x => x.Key == i);
//対象の画像を削除
Destroy(image.Value);
//リストからも削除する
keyImageList.Remove(image);
}
}

再質問しましたが、上記内容で動くようになりました。
(再質問時に生じたトラブルの原因は不明です)

ganta7188様
適切で迅速なご対応いただきありがとうございました。

投稿2018/10/06 06:35

KY7777

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問