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

本文关键字:Unity Texture2D 服务器 加载 | 更新日期: 2023-09-27 18:08:58

我使用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.

我想我需要让它以某种方式可读。我用谷歌搜索了一下,但我得到的唯一答案是如何通过编辑器使其可读。

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

只是想指出UnityWebRequest。GetTexture可以接受两个参数:url和一个bool值来决定纹理是否可读:)https://docs.unity3d.com/ScriptReference/Networking.UnityWebRequest.GetTexture.html

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

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

使你的纹理可读:

  • 之前5.6:UnityWebRequest。GetTexture (url,真的)
  • 5.6:UnityWebRequest。假GetTexture (url)

您可以存储来自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);