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

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

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

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

解決済

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

Amaty0727
Amaty0727

総合スコア2

C#

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

1回答

0リアクション

0クリップ

157閲覧

投稿2022/08/16 08:43

編集2022/08/17 01:52

前提

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

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

実現したいこと

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("初期化開始");    // 2022/08/17追記 //    slots.Clear(); // 前回のファイル名一覧をクリアしておく。(ゴミが残って表示順が滅茶苦茶になる) // ここで、リストの全削除をしたいです 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++; }    // 2022/08/17追記 //     names.Initialize(); //使い終わったファイル名のリストを初期化しておく(次に使う時、ゴミが残るのを防ぐため) // 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 です。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

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文を使って実体化して貼り付けています。 大変分かり難いとは存じますが、よろしくお願いします。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C#

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