【问题标题】:Making a Texture2D readable in Unity when loading from server从服务器加载时在 Unity 中使 Texture2D 可读
【发布时间】:2017-02-05 01:05:42
【问题描述】:

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

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

【问题讨论】:

    标签: c# unity3d texture2d


    【解决方案1】:

    只是想指出 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)

    【讨论】:

      【解决方案2】:

      您可以存储来自 UnityWebRequest 的数据。你是什​​么东我有点没用的目的。您将结果转换为纹理以将纹理转换回字节 []。

      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);
      

      【讨论】:

      • 我正在加载纹理以在我的模型中使用它。但是当程序结束时,我试图将它缓存到文件中。我使用DownloadHandlerTexture.GetContent 的原因是它针对内存进行了优化。
      • 不是在最后缓存,而是在得到时缓存。完全一样。
      • 听起来有道理,我回家试试,马上报告。从字节加载纹理而不是使用DownloadHandlerTexture.GetContent
      • 这来自手册“要从远程服务器检索纹理文件,您可以使用 UnityWebRequest.Texture。此方法与 UnityWebRequest.GET 非常相似,但针对有效下载和存储纹理进行了优化。”
      • 好吧,但你误会我的意思了,我说,你使用纹理,但你也使用我展示的方式存储纹理。事实上,你显示的更快,我明白了,但是下一轮当你使用缓存版本时,这无论如何都不适用。所以当你dl时,使用快速版本并存储uploadHandler.data。接下来,获取缓存数据并使用慢速版本,无论如何都会比再次下载更快。
      猜你喜欢
      • 2014-09-30
      • 1970-01-01
      • 2014-03-10
      • 2011-06-22
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-16
      相关资源
      最近更新 更多