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

前提

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

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

実現したいこと

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

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

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

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

該当のソースコード

C#

using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;using System;using System.IO;using UnityEngine.EventSystems;using UnityEngine.Networking;using UnityEngine.SceneManagement;using UnityEngine.UIElements; public class RepaintButton : MonoBehaviour { public GameObject content; public GameObject imgPrefab; public GameObject btnPrefab; public UnityEngine.UI.Button onGoButton; public UnityEngine.UI.Image Gamen; // FaceNode public GameObject faceNode = null; Sprite sprite; Texture2D texture; string PathNaiyo; public class Slot { private int num_; // enumとかのセット private string filename_; // 表示したいファイルパス private string FullPathName_; public Slot(int num, string filename, string FullPathName) { /* コンストラクタ */ this.num_ = num; this.filename_ = filename; this.FullPathName_ = FullPathName; } public int num() { /* int num_ 用のgetter */ return num_; } public string filename() { /* String filename_ 用のgetter */ return filename_; } public string FullPathName() { return FullPathName_; } public Slot() { num_ = 0; filename_ = ""; FullPathName_ = ""; } } public static bool bFlg = false; static List<Slot> slots = new List<Slot>(); static int intNumber = 0; public void Awake() { } void Start() { // DontDestroyOnLoad(this); OnClickAddSkillButton(); } public void OnClickAddSkillButton() { #if UNITY_ANDROID PathNaiyo = Application.persistentDataPath;#else PathNaiyo = Application.dataPath;#endif// Debug.Log("PathNaiyo = " + PathNaiyo); int i = 0; string[] names = Directory.GetFiles(PathNaiyo, "*.jpg"); content = GameObject.Find("Content"); imgPrefab = (GameObject)Resources.Load("Gazou"); btnPrefab = (GameObject)Resources.Load("GoButton"); if (imgPrefab == null) { return; } // 一旦リスト内のを全部消す Debug.Log("初期化開始"); // ここで、リストの全削除をしたいです Debug.Log("初期化完了"); foreach (string name in names) {// Debug.Log("name = "+name); // Debug.Log("パス名 = " + @PathNaiyo); int name_bango = @name.IndexOf(@"\"); string name_only = name.Substring(name_bango+1); Debug.Log("[" + i.ToString()+"]:name_only = " + name_only); slots.Add(new Slot(i, name_only, name)); Debug.Log(slots[i].filename()); // Debug.Log("ここからは、IMEGEに張り付けるところ"); byte[] metadata = readImgFile(name); texture = readByBinary(metadata); //textureに画像格納 //textureからspriteに変換 sprite = Sprite.Create(texture, new Rect(0.0f, 0.0f, texture.width, texture.height), Vector2.zero); // 画像追加 GameObject _img = Instantiate(imgPrefab, content.transform); UnityEngine.UI.Image image_component = _img.GetComponent<UnityEngine.UI.Image>(); image_component.sprite = sprite; // ボタン追加 GameObject _btn = Instantiate(btnPrefab, content.transform); string _name = ""; _name = _name + (i+1).ToString("D"); _btn.name = _name; image_component.name = "IMG" + _name; _btn.transform.Find("Midasi").GetComponent<Text>().text = "[" + (i + 1).ToString("D") + "] : " + slots[i].filename(); int n = i; _btn.GetComponent<UnityEngine.UI.Button>().onClick.AddListener(() => MyOnClick(n)); i++; } // Debug.Log("終了"); } public byte[] readImgFile(string path) { using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read)) { BinaryReader bin = new BinaryReader(fileStream); byte[] values = bin.ReadBytes((int)bin.BaseStream.Length); bin.Close(); return values; } } public Texture2D readByBinary(byte[] bytes) { Texture2D texture = new Texture2D(1, 1); texture.LoadImage(bytes); return texture; } void MyOnClick(int index) { Debug.Log(index.ToString()); Debug.Log(slots[index].filename()); intNumber = index; PlayerPrefs.SetInt("NUMBER", index); PlayerPrefs.SetString("FILENAME", slots[index].filename()); PlayerPrefs.SetString("FULLPATHNAME", slots[index].FullPathName()); PlayerPrefs.Save(); SceneManager.LoadScene("GazoViewScene"); } public int GetNumber() { return intNumber; } public Slot GetSlot(int iNumber) { Slot slot = slots[iNumber]; return slot; } }

試したこと

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

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

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

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

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

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

コメントを投稿

0 コメント