繁体   English   中英

无法加载,因为已经加载了另一个具有相同文件的AssetBundle

[英]Can't be loaded because another AssetBundle with the same files is already loaded

我想在AR相机中播放视频。 我总共有10个视频和一个视频播放器。 我正在从服务器下载视频播放器作为资产捆绑,名称为videoplayer.unit3d并存储到sd卡中。 当我扫描imageTarget时,我正在使用AssetBundle.LoadFromFile()函数读取视频资产捆绑文件,并且第一次可以正常工作。

如果我扫描第二个imageTarget它显示以下错误

“无法加载,因为已经加载了另一个具有相同文件的AssetBundle”

我已经试过bundle.Unload(true); Caching.cleanchache()但无法正常工作并抛出相同的错误。 还尝试了bundle.Unload(false);

  private void loadObject(string resourcePath, string objectName, TrackableBehaviour trackableBehaviuor, string videoUrl) { Debug.Log("Resource path " + resourcePath + " objectName " + objectName); Debug.Log("Video Url from sd card " + videoUrl); FileInfo fileInfo = new FileInfo(resourcePath); if (!fileInfo.Exists) return; Debug.Log("File is present"); AssetBundle bundle = AssetBundle.LoadFromFile(resourcePath, 0, 0);//www.assetBundle; Debug.Log("Bundle data is " + bundle); if (bundle == null) { AndroidJavaObject jObject = new AndroidJavaObject("com.ezvidya.buzzle.activity.UnityActivity"); jObject.Call("showErrorDialog"); return; } else { AndroidJavaObject jo = new AndroidJavaObject("com.ezvidya.buzzle.activity.UnityActivity"); jo.Call("closeScanDialog"); } //Load an asset from the loaded bundle AssetBundleRequest bundleRequest = bundle.LoadAssetAsync(objectName, typeof(GameObject)); //bundle.Unload(false); Caching.CleanCache(); //get object GameObject cubeFromSDCard = bundleRequest.asset as GameObject; if (cubeFromSDCard != null) { // instantiate augmentation object and parent to trackable GameObject augmentation = (GameObject)GameObject.Instantiate(cubeFromSDCard); augmentation.transform.parent = trackableBehaviuor.gameObject.transform; augmentation.transform.localPosition = cubeFromSDCard.transform.localPosition;//new Vector3(0f, 0f, 0f); augmentation.transform.localRotation = cubeFromSDCard.transform.localRotation;//Quaternion.identity; augmentation.transform.localEulerAngles = cubeFromSDCard.transform.localEulerAngles; augmentation.transform.localScale = cubeFromSDCard.transform.localScale;// new Vector3(22f, 22f, 22f); Debug.Log("$$$$$$$$$$$$$$$$ Local Position from asset object " + cubeFromSDCard.transform.localPosition); Debug.Log("$$$$$$$$$$$$$$$$ Local Rotation from asset object " + cubeFromSDCard.transform.localEulerAngles); Debug.Log("$$$$$$$$$$$$$$$$ Local Scale from asset object " + cubeFromSDCard.transform.localScale); Debug.Log("$$$$$$$$$$$$$$$$ Position from asset object " + cubeFromSDCard.transform.position); Debug.Log("$$$$$$$$$$$$$$$$ Rotation from asset object " + cubeFromSDCard.transform.eulerAngles); Debug.Log("$$$$$$$$$$$$$$$$ Scale from asset object " + cubeFromSDCard.transform.lossyScale); // Caching.CleanCache(); if (videoUrl != null && videoUrl.Length > 0) { VideoPlaybackBehaviour video = augmentation.GetComponent<VideoPlaybackBehaviour>(); video.m_autoPlay = true; Debug.Log("Autoplay is " + video.AutoPlay); video.m_path = videoUrl; // Pause other videos before playing this one // Play this video on texture where it left off //OnTrackingFound(false); if (video != null && video.AutoPlay) { VideoPlayerHelper.MediaState state = video.VideoPlayer.GetStatus(); if (state == VideoPlayerHelper.MediaState.PAUSED || state == VideoPlayerHelper.MediaState.READY || state == VideoPlayerHelper.MediaState.STOPPED) { // Pause other videos before playing this one PauseOtherVideos(video); // Play this video on texture where it left off video.VideoPlayer.Play(false, 0); } else if (state == VideoPlayerHelper.MediaState.REACHED_END) { // Pause other videos before playing this one PauseOtherVideos(video); // Play this video from the beginning video.VideoPlayer.Play(false, 0); } } } augmentation.gameObject.SetActive(true); } //bundle.Unload(false); } 

我找到了答案, Instantiate Gameobject之后,只需调用bundle.Unload(false); 它解决了我的问题。

我使用两行下面的添加解决了这个问题,

private AssetBundle myLoadedAssetBundle;
string bundleUrl="";
IEnumerator LoadAssetBundle ()
{
    if (myLoadedAssetBundle != null) {
        myLoadedAssetBundle.Unload(false); //scene is unload from here
    }

    while (!Caching.ready)
        yield return null;

    WWW www = WWW.LoadFromCacheOrDownload(bundleUrl, 1);
    yield return www;

    if (!string.IsNullOrEmpty(www.error))
    {
        Debug.Log(www.error);
        yield return null;
    }
    myLoadedAssetBundle = www.assetBundle;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM