実現したいこと
・StreamingAssetsフォルダ内のpng画像をすべて取得しリストに加えたい
・上記リストからランダムで選び出し、画面上のRawイメージの見た目を変えたい
前提
Unity、C#ともに初心者です。
検索して使えそうな要素を切り貼りでなんとか作っています。
用語についてもわからないことばかりなので、失礼ながら
「この位置にこれを置け!」くらいの具体性で回答頂けますと幸いです。
もちろんそれに限らず、解決の糸口になるものならなんでも歓迎します。
助けてください…。
StreamingAssetsを使っているのは、
ビルド後に差し替えできるようにしたいと考えているからです。
発生している問題・エラーメッセージ
・png画像をすべて取得できるはずのコードでエラーが出る。
ArgumentNullException: Value cannot be null.
Parameter name: oldValue
System.String.Replace (System.String oldValue, System.String newValue) (at <ecf276dcb8654fa5bed2c5ea1a4ad870>:0)
Test.Start () (at Assets/:::/:::/Test.cs:30)
・すべて取得できたとしても、string型のパスをtextureにする方法がわからない。
該当のソースコード
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using Random = UnityEngine.Random; 6using System.IO; 7 8public class Test : MonoBehaviour 9{ 10 public RawImage img; 11 string basePath; 12 13 //表示させる画像リスト 14 public List<Texture> cuts = new List<Texture>(); 15 16 void Start() 17 { 18 Random.InitState(System.DateTime.Now.Millisecond); 19 // ゲームオブジェクトのRaw画像を指定 20 img = GameObject.Find("Raw").GetComponent<RawImage>(); 21 22 // ファイルリストの取得 23 string[] files = GetStreamingAssetFiles("images", "*.png"); 24 25 // リスト一覧 26 for (int i = 0; i < files.Length; i++) 27 { 28 // 頂き物のコードで意味がわかっていない 29 // basePathの隣、""の中には何も入れなくていいのか? 30 files[i] = files[i].Replace(basePath, ""); 31 cuts.Add(files); // 現状ではここは不可能 32 } 33 } 34 35 public void ChangeImage() //他のスクリプトからこれを呼び出している 36 { 37 // 表示する画像の数をランダムで算出 38 int random = Random.Range(0, cuts.Count); 39 img.texture = cuts[random]; 40 } 41 42 // すべて頂き物。下記のメソッドで、 43 //StreamingAssets内のpng画像をstringですべて取得できると考えている 44 static public string[] GetStreamingAssetFiles(string dir, string ext, bool isFullPath = true) 45 { 46 if (dir.IndexOf("/") != 0) 47 { 48 dir = "/" + dir; 49 } 50 if (dir.LastIndexOf("/") != dir.Length - 1) 51 { 52 dir = dir + "/"; 53 } 54 55 string basePath = Application.streamingAssetsPath + dir; 56 string[] files = System.IO.Directory.GetFiles(basePath, ext, System.IO.SearchOption.TopDirectoryOnly); 57 58 if (isFullPath && -1 == files[0].IndexOf(basePath)) 59 { 60 for (int i = 0; i < files.Length; i++) 61 { 62 files[i] = basePath + files[i]; 63 } 64 } 65 else if (!isFullPath && -1 < files[0].IndexOf(basePath)) 66 { 67 for (int i = 0; i < files.Length; i++) 68 { 69 files[i] = files[i].Replace(basePath, ""); 70 } 71 } 72 73 return files; 74 } 75}
試したこと
わざわざstringで取得せず、はじめからtextureで取得できないか。
byteで取得すればtextureにできるという文章も見た気がする。
そんな考えはしたけれども、実現の方法が一切わからず。
補足情報(FW/ツールのバージョンなど)
Unity 2023 2.20f1
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/11/13 10:59