前提・実現したいこと
今回は前回の続きになります。
ローカルフォルダにある画像を入れ替えることで、unityのwebgl上でオブジェクトのテクスチャを自由に変えられるようにしたいです。
試したこと
今回はwindowsアプリで上記のことができないか試してみたところ、無事にファイルを変更することでアプリを起動したままテクスチャを変更することができました。
行った手順を以下に示します。
まず、以下のスクリプトをCubeにアタッチしてビルドしました。
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.Networking; 5 6public class CubeTexture : MonoBehaviour 7{ 8 private float timeleft; 9 //画像リンクから画像をテクスチャにする 10 Texture texture; 11 //テクスチャをマテリアル化するので生成しておく 12 [SerializeField] Material material; 13 //画像リンク 14 string url = " file:///c:/Users/xxx/Desktop/blue.png"; 15 void Start() 16 { 17 //先にマテリアルのシェーダを変更しておく 18 string shader = "Legacy Shaders/Diffuse"; 19 material.shader = Shader.Find(shader); 20 //StartCoroutine(Connect()); 21 } 22 23 void Update() 24 { 25 timeleft -= Time.deltaTime; 26 if (timeleft <= 0.0) 27 { 28 timeleft = 10.0f; 29 StartCoroutine("Connect"); 30 } 31 } 32 33 //テクスチャを読み込む 34 private IEnumerator Connect() 35 { 36 UnityWebRequest www = UnityWebRequestTexture.GetTexture(url); 37 38 yield return www.SendWebRequest(); 39 40 if (www.isNetworkError || www.isHttpError) 41 { 42 Debug.Log(www.error); 43 } 44 else 45 { 46 //textureに画像が入るよ 47 texture = ((DownloadHandlerTexture)www.downloadHandler).texture; 48 //textureをマテリアルにセット 49 material.SetTexture("_MainTex", texture); 50 51 gameObject.GetComponent<Renderer>().material = material; 52 Debug.Log(www.error); 53 } 54 } 55}
画像はデスクトップ上に配置しています。
同じ名前の画像をデスクトップの画像に上書き保存するとアプリ上のテクスチャが上書きした画像に変更することできました。
(前回のgifのようなテクスチャの切り替わりが画像を変更することで行えるようになりました。)
###発生している問題
上記のwindowsアプリで行ったことをwebgl上で行いたいのですが、うまくいきません。
webglでビルドしてlocalhostで試してみたところchromeのコンソール上で以下のようなエラーが出ました。
Not allowed to load local resource
そこで、以下のようなファイル構成にして画像リンクを./image/blue.pngに変更しました。
sample ┣ image/ ┃ ┗ blue.png ┗ index.html
これでwebglを起動させると画像が反映されるのですが、アプリを動かしている状態で画像の上書きをしてもテクスチャ変更することができませんでした。
そもそもwebglではアプリ起動中にファイルを参照をすることができないのでしょうか。
知っている方がいれば教えていただきたいです。
###追記
System.IOを使うスクリプトで試してみました。
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System.IO; 5 6public class TextLoad : MonoBehaviour 7{ 8 private float timeleft; 9 //テクスチャをマテリアル化するので生成しておく 10 [SerializeField] Material material; 11 12 void Start() 13 { 14 //先にマテリアルのシェーダを変更しておく 15 string shader = "Legacy Shaders/Diffuse"; 16 material.shader = Shader.Find(shader); 17 //StartCoroutine(Connect()); 18 } 19 20 void Update() 21 { 22 timeleft -= Time.deltaTime; 23 if (timeleft <= 0.0) 24 { 25 timeleft = 10.0f; 26 StartCoroutine(textLoad()); 27 } 28 } 29 30 IEnumerator textLoad() 31 { 32 string filepath = Application.streamingAssetsPath + "/blue.png"; 33 byte[] bytes; 34 var load_texture = new Texture2D(1, 1); 35 if (filepath.Contains("://") || filepath.Contains(":///")) 36 { 37 WWW www = new WWW(filepath); 38 yield return www; 39 byte[] result = www.bytes; 40 load_texture.LoadImage(result); 41 } 42 else 43 { 44 bytes = File.ReadAllBytes(filepath); 45 load_texture.LoadImage(bytes); 46 yield return load_texture; 47 Renderer renderer = GetComponent<Renderer>(); 48 renderer.material.mainTexture = load_texture; 49 } 50 } 51} 52
回答1件
あなたの回答
tips
プレビュー