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

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

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

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

Q&A

解決済

1回答

421閲覧

コードから動的に、ScrollViewの全件削除をする方法をご教授ください。

Amaty0727

総合スコア2

C#

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

0グッド

0クリップ

投稿2022/08/16 08:43

編集2022/08/17 01:52

前提

フォルダ内の写真一覧を表示して、追加ボタンを押せば別窓でカメラ撮影画面となります。
カメラ撮影画面にて撮影した画像は、この画面に戻ってきたときに追記されます。
また、動的に写真下にボタンを配置して、そのボタンを押すと別窓で拡大表示されます。

このコードは、”再描画”ボタン(リスト外にあります)にアタッチしております。

実現したいこと

ScrollViewで一覧作成しております一覧画面を、初期化処理時に削除する方法が分からないので、
前回読み込んだ一覧に追加される形で、また一覧が表示されます…。
ScrollViewでの全削除の方法をご教授ください…お願いします。
(現在は、削除したい箇所を記述してますが、実装はしておりません…)

また、今回はスピード等は度外視してまして、兎に角動くものを作りたい、と思っております。

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

現在、エラーは発生しておりません。

該当のソースコード

C#

1 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5using UnityEngine.UI; 6using System; 7using System.IO; 8using UnityEngine.EventSystems; 9using UnityEngine.Networking; 10using UnityEngine.SceneManagement; 11using UnityEngine.UIElements; 12 13 14public class RepaintButton : MonoBehaviour 15{ 16 17 public GameObject content; 18 public GameObject imgPrefab; 19 public GameObject btnPrefab; 20 21 public UnityEngine.UI.Button onGoButton; 22 public UnityEngine.UI.Image Gamen; 23 24 // FaceNode 25 public GameObject faceNode = null; 26 27 Sprite sprite; 28 Texture2D texture; 29 30 31 string PathNaiyo; 32 33 34 35 public class Slot 36 { 37 private int num_; // enumとかのセット 38 private string filename_; // 表示したいファイルパス 39 private string FullPathName_; 40 41 public Slot(int num, string filename, string FullPathName) 42 { 43 /* コンストラクタ */ 44 this.num_ = num; 45 this.filename_ = filename; 46 this.FullPathName_ = FullPathName; 47 } 48 public int num() { 49 /* int num_ 用のgetter */ 50 return num_; 51 } 52 public string filename() { 53 /* String filename_ 用のgetter */ 54 return filename_; 55 } 56 public string FullPathName() 57 { 58 return FullPathName_; 59 } 60 public Slot() 61 { 62 num_ = 0; 63 filename_ = ""; 64 FullPathName_ = ""; 65 } 66 } 67 68 public static bool bFlg = false; 69 70 71 static List<Slot> slots = new List<Slot>(); 72 static int intNumber = 0; 73 74 75 public void Awake() 76 { 77 } 78 79 80 void Start() 81 { 82 // DontDestroyOnLoad(this); 83 OnClickAddSkillButton(); 84 } 85 86 public void OnClickAddSkillButton() 87 { 88 89 90 91#if UNITY_ANDROID 92 PathNaiyo = Application.persistentDataPath; 93#else 94 PathNaiyo = Application.dataPath; 95#endif 96// Debug.Log("PathNaiyo = " + PathNaiyo); 97 98 int i = 0; 99 string[] names = Directory.GetFiles(PathNaiyo, "*.jpg"); 100 101 102 content = GameObject.Find("Content"); 103 imgPrefab = (GameObject)Resources.Load("Gazou"); 104 btnPrefab = (GameObject)Resources.Load("GoButton"); 105 if (imgPrefab == null) 106 { 107 return; 108 } 109 110 // 一旦リスト内のを全部消す 111 Debug.Log("初期化開始"); 112 113   // 2022/08/17追記 // 114   slots.Clear(); // 前回のファイル名一覧をクリアしておく。(ゴミが残って表示順が滅茶苦茶になる) 115// ここで、リストの全削除をしたいです 116 117 Debug.Log("初期化完了"); 118 119 120 foreach (string name in names) 121 { 122// Debug.Log("name = "+name); 123 124// Debug.Log("パス名 = " + @PathNaiyo); 125 126 int name_bango = @name.IndexOf(@"\"); 127 string name_only = name.Substring(name_bango+1); 128 Debug.Log("[" + i.ToString()+"]:name_only = " + name_only); 129 130 131 slots.Add(new Slot(i, name_only, name)); 132 133 Debug.Log(slots[i].filename()); 134 135// Debug.Log("ここからは、IMEGEに張り付けるところ"); 136 byte[] metadata = readImgFile(name); 137 138 texture = readByBinary(metadata); 139 140 //textureに画像格納 141 //textureからspriteに変換 142 sprite = Sprite.Create(texture, new Rect(0.0f, 0.0f, texture.width, texture.height), Vector2.zero); 143 // 画像追加 144 GameObject _img = Instantiate(imgPrefab, content.transform); 145 UnityEngine.UI.Image image_component = _img.GetComponent<UnityEngine.UI.Image>(); 146 image_component.sprite = sprite; 147 148 // ボタン追加 149 GameObject _btn = Instantiate(btnPrefab, content.transform); 150 151 string _name = ""; 152 _name = _name + (i+1).ToString("D"); 153 154 _btn.name = _name; 155 image_component.name = "IMG" + _name; 156 _btn.transform.Find("Midasi").GetComponent<Text>().text = "[" + (i + 1).ToString("D") + "] : " + slots[i].filename(); 157 158 int n = i; 159 160 _btn.GetComponent<UnityEngine.UI.Button>().onClick.AddListener(() => MyOnClick(n)); 161 162 163 i++; 164 165 } 166   // 2022/08/17追記 // 167    names.Initialize(); //使い終わったファイル名のリストを初期化しておく(次に使う時、ゴミが残るのを防ぐため) 168 169 // Debug.Log("終了"); 170 } 171 172 173 174 175 176 public byte[] readImgFile(string path) 177 { 178 using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read)) 179 { 180 BinaryReader bin = new BinaryReader(fileStream); 181 byte[] values = bin.ReadBytes((int)bin.BaseStream.Length); 182 bin.Close(); 183 return values; 184 } 185 } 186 187 public Texture2D readByBinary(byte[] bytes) 188 { 189 Texture2D texture = new Texture2D(1, 1); 190 texture.LoadImage(bytes); 191 return texture; 192 } 193 194 void MyOnClick(int index) 195 { 196 Debug.Log(index.ToString()); 197 Debug.Log(slots[index].filename()); 198 199 intNumber = index; 200 201 PlayerPrefs.SetInt("NUMBER", index); 202 PlayerPrefs.SetString("FILENAME", slots[index].filename()); 203 PlayerPrefs.SetString("FULLPATHNAME", slots[index].FullPathName()); 204 PlayerPrefs.Save(); 205 206 SceneManager.LoadScene("GazoViewScene"); 207 208 } 209 210 public int GetNumber() 211 { 212 213 return intNumber; 214 } 215 216 public Slot GetSlot(int iNumber) 217 { 218 Slot slot = slots[iNumber]; 219 return slot; 220 } 221 222 223} 224

試したこと

色々検索してみましたが、動的にListViewを全削除する方法を記述するサイトに巡り合っておりません。

覚えている限りでは、以下の方法を試しましたが、どうやらDestroyの所に入って無かったです。
(このとき、画像名は全て IMG で統一させてみました。)
削除したい場所に記述してました。

img_obj = GameObject.Find("IMG"); foreach (Transform n in img_obj.transform) { GameObject.Destroy(n.gameObject); }

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

リスト表示・ボタンの追加・画面遷移の方法等、検索して試して動作させてるうちに、ソースコードが若干見づらくなってしまいました…。
また、かなり無茶な方法で作っているかもしれません。

Unityのバージョンは、2021.3.61f です。

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

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

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

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

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

drednote

2022/08/16 10:55

ScrollViewというのはUI要素のScrollViewということで良かったでしょうか? その場合、どのオブジェクトがScrollViewなのか、とかそういった情報が見当たらないのですが?
Amaty0727

2022/08/17 00:23

説明不足で申し訳ありません… ご指摘通り、UI要素のScrollViewです。 ソースコードでは、特にScrollViewを操作しておりません。 ScrollViewの要素として、Content だけ定義しておいて、そのContentに対して、コードで写真・ボタンを交互に張り付けています。 また、ScrollViewに対して、Scrollbar Verticalをコンポーネントを追加し、強引にスクロールするようにしております(これは静的にヒエラルキーで登録しております)… ですので、ちょっと反則的な使い方かもしれません… 今回の場合ですと、ScrollViewのContent内の画像(ボタンも)の一覧を取得して、それに対して削除すればよいのかな?と思っております…勘違いしていたら、申し訳ありません。 その他使っているのは、  画像…image_component  ボタン…_btn です。どちらもプレハブ化しているのをロードし、Instantiate文を使って実体化して貼り付けています。 大変分かり難いとは存じますが、よろしくお願いします。
guest

回答1

0

ベストアンサー

構造把握しました。
ヒエラルキー上のcontentのチャイルドがリストの中身なので、

for(int i = 0; i < content.transform.childCount; i ++) { Destroy(content.transform.GetChild(i).gameObject); }

でcontentのチャイルドを全部消せばリストの中身は空になります。
もしリストの中身は後で使うんだ、とかの場合はSetActive(false)とかにしておいた方が良いかもしれませんが。

投稿2022/08/17 01:29

drednote

総合スコア336

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

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

Amaty0727

2022/08/17 01:56

ご教授いただいた内容で試してみたら、見事に私の希望通りの動作を確認しました。 ありがとうございました。 後はこれに色々と機能を追加していきます。 また調べても分からないことがあれば、よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問