从服务器加载时,使Unity中的Texture2D可读

时间:2016-09-27 11:54:35

标签: c# unity3d texture2d

我正在使用DownloadHandlerTexture.GetContent来获取纹理:

www = UnityWebRequest.GetTexture("http://www.example.com/loadTex/?tag=" + tag);
www.SetRequestHeader("Accept", "image/*");
async = www.Send();
while (!async.isDone)
    yield return null;

if (www.isError) {
    Debug.Log(www.error);
} else {
    yield return null;
    tex = DownloadHandlerTexture.GetContent(www);
}

加载后我想将它缓存到文件中,所以我这样做:

byte[] pic = tex.EncodeToPNG();
File.WriteAllBytes(Application.persistentDataPath + "/art/" + tag + ".png", pic);

此时我得到例外:

UnityException: Texture '' is not readable, the texture memory can not be accessed from 
scripts. You can make the texture readable in the Texture Import Settings.

我认为我需要以某种方式使其可读。我用Google搜索了,但我得到的唯一答案是如何通过编辑器使其可读。

2 个答案:

答案 0 :(得分:3)

只是想指出UnityWebRequest.GetTexture可以采用两个参数:url和bool使纹理可读或不可用:) https://docs.unity3d.com/ScriptReference/Networking.UnityWebRequest.GetTexture.html

所以在使用DownloadHandlerTexture.GetContent获取请求结果中的纹理之前。只需调用UnityWebRequest.GetTexture(url,false);所以下载的纹理变得可读。

PS:小心,在Unity 5.6之前,bool nonReadable被反转。他们应该从5.6开始修复它(根据发行说明)。

使纹理可读:

  • 5.6之前: UnityWebRequest.GetTexture(url,true)
  • 5.6之后: UnityWebRequest.GetTexture(url,false)

答案 1 :(得分:2)

您可以存储UnityWebRequest中的数据。你是什​​么东西我为此目的有点无用。您将结果转换为纹理以将纹理转换回byte []。

byte[] bytes = www.uploadHandler.data;
File.WriteAllBytes(Application.persistentDataPath + "/art" + tag, data);

我猜这应该做。存储原始字节数组时不需要.png扩展名。然后,您将获得数组并从中创建纹理:

byte [] bytes = File.ReadAllBytes(Application.persistentDataPath + "/art" + tag); 
Texture2D texture = new Texture2D(4,4,TextureFormat.RGBA32, false);
texture.LoadImage(bytes);