Не может быть загружен, потому что другой AssetBundle с теми же файлами уже загружен
Я хочу воспроизвести видео в 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);
}
1 ответ
Я нашел ответ, после 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;
}