【问题标题】:Downloading an AssetBundle more than once fails多次下载 AssetBundle 失败
【发布时间】:2017-09-12 19:03:31
【问题描述】:

我正在 Unity 2017.1.0f3 中开发一个应用程序(如果这很重要,适用于 HoloLens)。此应用有 3 个场景

  • 场景 1. 用户提供凭据并使用 服务。
  • 场景 2. 服务提供,应用显示用户可以选择的资源列表。
  • 场景 3. 选择资源后,AssetBundle 会下载并显示给用户。

这是下载AssetBundle的协程

IEnumerator GetAssetBundle(string assetUrl, Action<AssetBundle> successCallback, Action<string> errorCallback )
    {
        UnityWebRequest request = UnityWebRequest.GetAssetBundle(assetUrl);

        yield return request.Send();

        if (request.isHttpError || request.isNetworkError)
        {
            errorCallback(request.error);
        }
        else
        {
            AssetBundle bundle = ((DownloadHandlerAssetBundle)request.downloadHandler).assetBundle;

            successCallback(bundle);
        }
    }

用户可以在场景之间来回切换,并可能选择两次相同的资源。这就是问题发生的时候。

用户第一次尝试下载AssetBundle 时一切正常。 第二次(以及所有后续)下载失败。失败不是下载过程出错而是这个
((DownloadHandlerAssetBundle)request.downloadHandler).assetBundle; 始终为空。

我认为 Unity 将不允许您多次下载相同的 AssetBundle,并且您必须在下载后对其进行缓存。是这样吗? 我想避免这种情况,因为该应用程序最终可以有大量的AssetBundles 可供下载,并且在下载后将它们全部缓存是一个不好的选择。

如果需要,您是否知道多次下载同一个 AssetBundle 的方法?

【问题讨论】:

  • 完成后尝试卸载你的包:bundle.Unload()
  • @joreldraw 这行得通。你知道我是否也应该做类似Caching.CleanCache 的事情。另外,如果您想将您的评论变成答案,以便我接受它
  • 小心使用AssetBundle.Unload() “如果你的场景中有游戏对象引用了这些资源,那么对它们的引用就会丢失” 如果你不在乎然后使用它。一个合适的解决方案是像普通文件一样手动下载资产并手动保存。如果您想这样做,请不要使用GetAssetBundleDownloadHandlerAssetBundle
  • 清除所有内容的唯一选择是卸载所有资产包
  • @Programmer 我需要的是 bundle.Unload(false);这不会破坏已经实例化的对象。

标签: c# unity3d assetbundle


【解决方案1】:

您可以单独卸载您的捆绑包:

bundle.Unload(bool unloadAllLoadedObjects);

或者可以卸载所有已加载的大量捆绑包:

UnloadAllAssetBundles(bool unloadAllObjects);

注意 bool unloadAllObjects 选项,默认为 false。如果您设置为 true,则您的所有实例化资产都将因缺少引用而被销毁。

*如果您不知道所有已加载的捆绑包,您可以获得所有已加载捆绑包的可枚举列表: AssetBundle.GetAllLoadedAssetBundles

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 2019-12-07
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多