多资产包下载缓存问题

Multiple Asset Bundle Download Cache Problem

我正在使用UnityWebRequestAssetBundle.GetAssetBundle(url, bundleData.version, bundleData.crc);系统,我可以成功地在线下载和使用bundleAssets。但是当我想下载多个捆绑资产并将它们保存以供以后离线使用时,我遇到了问题。 例如,我有 2 个文件 'A' 和 'B'。 情况 1:当我下载 A 并离线时,即使关闭应用程序,我也可以随时加载 A。但是当我想下载 B 并返回到 A 时无法再次加载 A 因为它出于某种原因删除了缓存并尝试再次下载它。

情况二:我把A和B一起下载离线的时候,加载B就加载了。但是如果我尝试 A 它无法加载并且需要互联网连接。之后,当我再次尝试加载 B 时,我丢失了包裹,所以它需要再次连接互联网。

所以基本上我想下载多个资产包,我想随时使用它们。我怎么解决这个问题?谢谢

代码示例:

using UnityWebRequest uwr = UnityWebRequestAssetBundle.GetAssetBundle(url, bundleData.version, bundleData.crc);
        yield return uwr.SendWebRequest();

            bundle = DownloadHandlerAssetBundle.GetContent(uwr);
            Debug.Log(bundle);

        if (bundle==null)
        {
                Debug.Log("COULDN'T CONNECT TO URL");
                callback(null);
        }
        else
        {
            Debug.Log("FOUND AT SEARCH!");
            // Get downloaded asset bundle
            bundle = DownloadHandlerAssetBundle.GetContent(uwr);
            Sprite sprite = isDiff ? bundle.LoadAsset<Sprite>(levelText + "Diff") : bundle.LoadAsset<Sprite>(levelText);

            callback(sprite);
        }

我通过将图像保存到 persistentFolder 解决了我的问题。 我首先通过 Texture2D.EncodeToJPG();

将图像写入磁盘
private void writeImageOnDisk(Sprite sprite, string fileName)
{
    Texture2D texture = DeCompress(sprite.texture);
    byte[] textureBytes = texture.EncodeToJPG();

    File.WriteAllBytes(Application.persistentDataPath + "/" + fileName+".jpg", textureBytes);
    Debug.Log("File Written On Disk!");
}

要使用 EncodeToJPG 图像必须 Read/Write 在拥有 AssetBundles 之前启用,您应该先解压缩它们,我找到了解决方案

private Texture2D DeCompress(Texture2D source)
{
    RenderTexture renderTex = RenderTexture.GetTemporary(
                source.width,
                source.height,
                0,
                RenderTextureFormat.Default,
                RenderTextureReadWrite.Linear);

    Graphics.Blit(source, renderTex);
    RenderTexture previous = RenderTexture.active;
    RenderTexture.active = renderTex;
    Texture2D readableText = new Texture2D(source.width, source.height);
    readableText.ReadPixels(new Rect(0, 0, renderTex.width, renderTex.height), 0, 0);
    readableText.Apply();
    RenderTexture.active = previous;
    RenderTexture.ReleaseTemporary(renderTex);
    return readableText;
}

最后您可以使用此代码加载图像:

private Sprite loadImageFromDisk(string fileName)
{
    string dataPath = Application.persistentDataPath + "/" + fileName + ".jpg";
    if (!File.Exists(dataPath))
    {
        Debug.LogError("File Does Not Exist!");
        return null;
    }

    byte[] textureBytes = File.ReadAllBytes(dataPath);
    Texture2D loadedTexture = new Texture2D(2048,2048,TextureFormat.ARGB32, false);
    loadedTexture.LoadImage(textureBytes);
    Sprite spr = Sprite.Create(loadedTexture, new Rect(0f, 0f, loadedTexture.width, loadedTexture.height), new Vector2(.5f,.5f), 2048); // 2048 is pixel per unit if you have a custom pixelPerUnit value you should set it here. Or you will see only some part of pixels of image.
    spr.name = fileName;
    return spr;
}

我希望这对你们有用。这就是我在下载 assetbundle 后存储图像的方式以及我在游戏中调用它们的方式。