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

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

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

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

Unity

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

Q&A

解決済

2回答

1374閲覧

Unity タッチして消えるアイテムを、元通り復活させるListの使用法

Matsuri_

総合スコア15

C#

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

Unity

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

0グッド

0クリップ

投稿2021/07/03 14:40

編集2021/07/03 14:46

前提・実現したいこと

Unityでゲームを作っています。
実現したい動作は以下の通りです。
1.画面上に色々なアイテムが散らばっている。
(ゲーム進行に従って、種類が増えたり減ったりします。)
2.タッチしていくとアイテムが消える。
3.画面上のアイテムをすべて消し終わると、再び最初の1の状態になる。
(同じアイテムが元通り復活して、再びタッチできるようになる)

発生している問題

GameObjectのListを用いて上記動作を実現しようとしていますが、うまくいきません。
現在試していることは、以下の2通りです。
方法A
1.ListAとListBを二つ作成しておき、ListAには画面上に表示されたアイテムを入れる。ListBは空。
2.Removeを用いてListAからタッチされたアイテムを消していく。(アイテムには識別用として個々にナンバーを振ってあり、タッチされた際このナンバーを渡すことで、Listの中のどのアイテムを消すのか区別しようとしています)
3.RemoveされたItemを、今度はListBにAddで追加。
4.ListAのCountが0になったら、、ListAにListBの内容をコピーし、
再びSetActiveで表示させ、元通りの画面になる。

方法B
1.画面上に表示されたアイテムを入れるListAとListBを二つ作成しておく。(二つとも同じ内容です。)
2.上記2と同じです。
3.ListAのCountが0になったら、ListAにListBの内容をコピー。
ListAの中身を再びSetActiveで表示させ、元通りの画面になる。

いずれにしても、うまく動きません。
方法Aは、ListBへのAddができず、
方法Bは、なぜか2種類目のアイテムのRemoveができず…という感じです

該当のソースコード

以下は方法Aのコードです。

C#

1public void ItemReturn(int ItemNumber)//アイテムをタッチすると発動 2 { 3 ListA.Remove(Item[ItemNumber]);//Itemの配列に登録されたItemを番号で探してリムーブ 4 ListB.Add(Item[myNumber]);//消したアイテムを登録 5 if (ListA.Count <= 0) //すべて消し終わったら復活 6 { 7 ListA = new List<GameObject>(ListB); 8 ListB.Clear(); 9 StartCoroutine(ListAFukkatsu()); 10 } 11 12public IEnumerator ListAFukkatsu() 13 { 14 yield return new WaitForSeconds(FukkatsuSpeed); 15 16 for (int i = 0; i <= ListA.Count; i++)//再びすべてを表示(コルーチンで待機) 17 { 18 ListA[i].SetActive(true); 19 ListA[i].GetComponent<CanvasGroup>().alpha = 1; 20 } 21 }

以上になります。
正しいやり方がわからず、困っております。
何かご提案ありましたら、どうぞよろしくお願いいたします。

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

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

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

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

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

YAmaGNZ

2021/07/03 23:20

なぜListAからRemoveするときはItemNumberを利用してListBへAddするときはmyNumberを添字として利用しているのでしょうか?
Matsuri_

2021/07/04 00:32

すみません、ミスです。 どちらもItemNumberです。 申し訳ないです。
YAmaGNZ

2021/07/04 00:41

では「ListBへのAddができず」というのはどのような状況なのでしょうか? 何かエラーが出るのですか?それともその部分が実行されないということですか? ログなどでCountが増えていないなどの確認を行った結果なのでしょうか?
Matsuri_

2021/07/04 00:54

ありがとうございます。 まず、ListAからリムーブすることはできます。 ですが、そのリムーブしたゲームオブジェクトをAddでListBに入れようとすると、入ってくれないんです。もしリストに入っていれば、プレイ中、インスペクタ上ですぐ確認できるのですが、ListBはなにもでてこない、という状況です。エラーも特に出てきません。 ListBのCountは確かしていませんでしたので、後ほど確認します。 わかりにくく、すみません。 よろしくお願い致します。
guest

回答2

0

GameObjectの表示/非表示はSetActiveでやればいいだけなので、
わざわざListAからRemoveしたりListBを使う必要は無いのでは?

投稿2021/07/05 00:47

sakura_hana

総合スコア11427

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

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

Matsuri_

2021/07/06 04:40

回答頂き、ありがとうございます。 一応書き直すことで自己解決致しました。 お手数おかけ致しました。
guest

0

自己解決

ご回答、ご質問など頂き、ありがとうございます。
わかりにくい書き方で、大変申し訳ないです。
自己解決致しましたので、ひとまずこちらにご報告です。
(Listを使おうとしたのは、タッチする前の、元の状態と
何をタッチして消したかを記録したい…と思ったからです。ほかにいい方法が思いつきませんでした)
上記ListのAddとRemoveを再び書き直しすと、なぜかうまくいきました。
どこかが間違っていたのかなと思います。が、現時点でどこがおかしかったのか指摘ができません。
こちらで今回の質問いったん終了させて頂きます。
重ねて、ご回答頂いた方々、大変お手数おかけ致しました。

投稿2021/07/06 04:39

Matsuri_

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問