前提
フォルダ内の写真一覧を表示して、追加ボタンを押せば別窓でカメラ撮影画面となります。
カメラ撮影画面にて撮影した画像は、この画面に戻ってきたときに追記されます。
また、動的に写真下にボタンを配置して、そのボタンを押すと別窓で拡大表示されます。
このコードは、”再描画”ボタン(リスト外にあります)にアタッチしております。
実現したいこと
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 です。
回答1件
あなたの回答
tips
プレビュー