【问题标题】:Not able to download an image using www class in unity android无法在统一android中使用www类下载图像
【发布时间】:2014-10-24 23:32:31
【问题描述】:

我正在尝试在我的 Android 游戏的统一项目中使用此代码下载图像。

    public static Texture2D userTexture=new Texture2D(64, 64, TextureFormat.DXT5, false); //TextureFormat must be DXT5
    public static IEnumerator UserPictureCallback(){
        Debug.Log("USerPicture called");
        FbDebug.Log("USerPicture called");
        WWW url = new WWW("http://i1.wp.com/a0.twimg.com/sticky/default_profile_images/default_profile_1_normal.png?resize=64%2C64");


        yield return url;
        //profilePic.renderer.material.mainTexture = textFb2;

        Debug.Log(url);
        url.LoadImageIntoTexture(userTexture);
        Debug.Log("Working");
    }

然后我尝试使用 DrawTexture 在 GUI 中绘制它。

    GUI.DrawTexture(new Rect(5,0,50,50),FB.userTexture,ScaleMode.StretchToFill, false, 0.0f);

但是图像纹理没有被下载,或者至少它没有在 GUI 中显示。有人可以帮我解决这个问题吗?

【问题讨论】:

  • 你是用 StartCoroutine 调用 UserPictureCallback 吗?你得到那个“工作”调试消息了吗?您还可以使用 isDone 等属性来了解更多信息:docs.unity3d.com/Documentation/ScriptReference/WWW.html
  • 已经试过这段代码,它工作得很好。所以一定有一些你没有向我们展示的东西。你能展示你的代码的其余部分是什么样的以及你是如何调用它的吗?唯一的“问题”是使用 DXT5 时图像变成粉红色,而不是使用 RGBA32 显示的正确绿色。
  • 嘿@Bart 我尝试使用 RGBA32 格式,但在这种情况下 drawtexture 没有显示任何内容。但是当我尝试制作 RGB24 时,我得到了这张像素化的图片(我正在分享截图的链接)。所以现在我不确定这是格式问题还是图像本身没有下载。请查看以下链接并帮助我解决这个疑问。如果格式不正确,请告诉我要使用的正确纹理。 dl.dropboxusercontent.com/u/29386849/2013-11-25%2000.35.12.png
  • @radical 是的朋友,正如您在上面的代码中看到的那样,我编写的产量与您提到的统一脚本手册链接中给出的完全一样。不,我认为我不会在调试中“工作”。但是我也怀疑自 Unity 4.2 以来我是否能够阅读所有调试:P 我认为所有调试都以详细的统一标签打印出来。如果我错了,请纠正我。

标签: android unity3d


【解决方案1】:

我最近遇到了同样的问题。我在 Unity 中创建了一个可滚动的图像库,其中图像是从 Web 服务器实时下载的。在 iOS 设备上,我很快就达到了内存限制(导致应用程序崩溃)。这是由于大量 www 对象留在内存中而从未删除或释放造成的。还有大量的 Texture2D 对象泄露。 主要的误解是将 Texture2D 视为自包含图像信息的对象的变量。 Texture2D 只指向一个引用的资源,所以我们需要在分配给我们的 GUI 对象之前创建一个。如果不创建一个,我们将覆盖项目中引用的资产,导致非常疯狂的行为。 所以这是适用于我在 iOS 上的代码,并且只使用最少的内存

    public void DownloadImage(string url)
    {   
        StartCoroutine(coDownloadImage(url));
    }

    IEnumerator coDownloadImage(string imageUrl)
    {

        WWW www = new WWW( imageUrl );

        yield return www;

        thumbnail.mainTexture = new Texture2D(www.texture.width, www.texture.height, TextureFormat.DXT1, false);
        www.LoadImageIntoTexture(thumbnail.mainTexture as Texture2D);
        www.Dispose();
        www = null;
    }

简短评论: 您会收到一个 URL,您将从中下载图像。 启动管理下载的协程 在本地范围内创建 www 对象 yield 等待下载完成 使用参数创建一个新的 Texture2D 对象/资产并分配给您的最终对象 mainTexture 或您想要什么 使用“www.LoadImageIntoTexture()”函数复制创建的资产中的图像(这是基本部分) 释放 www 对象并将其设置为 null 以防止内存泄漏或孤儿

希望对遇到同样问题的人有所帮助。

一个有趣的讲座是这个网站,他们实现了一个 WebImageCache 系统以避免多次重新下载相同的图像。

http://studiofive27.com/index.php/unity-cached-web-images/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多