无法加载,因为已加载另一个具有相同文件的 AssetBundle。加载不同捆绑包时出错

can't be loaded because another AssetBundle with the same files is already loaded. error while loading different bundles

提问人:Muhammet Demir 提问时间:12/28/2020 更新时间:11/21/2023 访问量:2125

问:

这个赏金已经结束了。这个问题的答案有资格获得 +50 声望赏金。赏金宽限期在 12 小时后结束。Seaky Lone 正在寻找一个规范的答案
我遇到了同样的问题,在尝试 1000 次后不知道如何解决它。

我试过从 URL 加载资产包。当我只加载单个资产包时,它运行良好。但是,如果我尝试加载多个资源包,Unity 会给出以下错误:The AssetBundle 'https://example.com/uc?export=download&id=1234567' can't be loaded because another AssetBundle with the same files is already loaded.

示例代码如下

using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.SceneManagement;
using TMPro;

public class sahnecagir : MonoBehaviour
{
    public TextMeshProUGUI Log;

    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(LoadBundleFromUrl("https://example.com/uc?export=download&id=123456", 2, 0, (uint)Crc.Gifts));
    }

    IEnumerator LoadBundleFromUrl(string url, int tip, uint version, uint crc)
    {
        using (UnityWebRequest uwr = UnityWebRequestAssetBundle.GetAssetBundle(url, version, crc))
        {
            uwr.SendWebRequest();

            while (!uwr.isDone)
            {
                if(tip == 1) Log.text = "Rooms loading " + (uwr.downloadProgress * 100).ToString("0")  + "%";
                else if(tip == 2) Log.text = "Gifts loading " + (uwr.downloadProgress * 100).ToString("0")  + "%";
               
                yield return null;
            }

            if (uwr.isNetworkError || uwr.isHttpError)
            {
                Debug.Log(uwr.error);
            }
            else
            {
                if (tip == 1)
                {
                    MainConfig.Instance.RoomBgBundle = DownloadHandlerAssetBundle.GetContent(uwr);
                }
                else if (tip == 2)
                {
                    MainConfig.Instance.GiftBundle = DownloadHandlerAssetBundle.GetContent(uwr);
                }
            }

           

            if (uwr.isDone && tip == 1)
            {
                Log.text = "Rooms loading 100%";
                StartCoroutine(LoadBundleFromUrl("https://example.com/uc?export=download&id=1234567", 2, 0, 0));
            }
            else
            {
                Log.text = "Gifts loading 100%";
            }
            yield return null;
        }
    }
}
C# unity-游戏引擎

评论

0赞 derHugo 12/28/2020
你如何创建你的捆绑包?听起来您的 AssetBundle 共享一些常见文件 => 正如 Unity 告诉您的那样,它无法多次加载同一个文件。要么考虑在不再需要捆绑包时将其卸载,要么将这些通用文件包含在构建中,或者仅以不同的方式下载它们一次
1赞 Muhammet Demir 12/28/2020
@derHugo 嗨,不同的捆绑包中没有相同的文件。例如,捆绑包一包含:资产/资源/房间/1.png - 2png 等,捆绑包二包含资产/资源/礼物/gift1.png - gift2.png 等
0赞 Seaky Lone 11/15/2023
您好,您最终如何解决这个问题?
0赞 yasirkula 11/21/2023
@SeakyLone 我的回答能解决您的问题吗?
0赞 Seaky Lone 11/21/2023
@yasirkula 不,就我而言,我的资产包和 Demir 的情况一样,都有独特的名称。我目前的解决方法是在将资产包加载到场景中后立即卸载它,这看起来很奇怪,需要更多的修补代码,但目前有效。

答:

1赞 bluewave41 3/10/2022 #1

就我而言,我一直在尝试修改包含不同文件的捆绑包,但 Unity 拒绝加载两个不同的文件,即使它们具有不同的名称、不同的结构、内部不同的文件,什么都没有。

在 Notepad++ 中打开捆绑包会显示我假设的 CAB-a317cdbf067bab183d6dd12d870c1407 的“容器名称”作为示例。这似乎是 Unity 正在检查以确定捆绑包是否“相同”的内容。

一个简单的查找并替换为不同的名称和繁荣。捆绑包现在加载。

0赞 yasirkula 11/21/2023 #2

如果使用相同的 AssetBundleBuild.assetBundleName 参数创建了多个 AssetBundle,则可能会出现此问题。为每个 AssetBundle 提供唯一的 s 可以解决此问题(即使您之后重命名生成的 AssetBundle 文件)。assetBundleName