Returning to a scene with AssetBundle

I’ve created an AssetBundle for one of my scenes and it works fine…when you go onto the scene for the first time. However, if you navigate away from that scene then back again, it comes up with the error message:

UnityException: WWW Download had an error: Cannot load cached AssetBundle. A file of the same name is already loaded from another AssetBundle.
AssetBundleAugmenter+c__Iterator0.MoveNext () (at Assets/AssetBundleAugmenter.cs:39)

I’m using vuforia augmented reality plug-in but this scene is currently only augmenting a simple cube.
I believe its trying to reload the AssetBundle but its already been ‘unpacked’, not sure if this is right though.
Anyone know what this means and how I can fix it?

I’m using the following script I found on the documentation plus the part that augments the content:

using UnityEngine;
using System.Collections;

public class AssetBundleAugmenter : MonoBehaviour, ITrackableEventHandler {
    
	
    public string AssetName;
     public string BundleURL;
    private GameObject mBundleInstance = null;
     
    private TrackableBehaviour mTrackableBehaviour;
     
    private bool mAttached = false;
     
     IEnumerator Start(){
		//StartCoroutine (DownloadAndCache());
        
         
        mTrackableBehaviour = GetComponent<TrackableBehaviour>();
        if (mTrackableBehaviour) {
            mTrackableBehaviour.RegisterTrackableEventHandler(this);
        }
 

			
        using (WWW www = new WWW(BundleURL)){
            yield return www;
             
        if (www .error != null)
            throw new UnityException("WWW Download had an error: " + www. error);
			
        AssetBundle bundle = www.assetBundle;
        if (AssetName == "CubeAndroid.unity3d") {
            mBundleInstance = Instantiate (bundle.mainAsset) as GameObject;
        }
        else {
            mBundleInstance = Instantiate(bundle.Load (AssetName)) as GameObject;
				bundle.Unload(false);
				
				
        }
		}			
    }

     
public void OnTrackableStateChanged(
        TrackableBehaviour.Status previousStatus,
        TrackableBehaviour.Status newStatus) {
         
        if (newStatus == TrackableBehaviour.Status.DETECTED ||
            newStatus == TrackableBehaviour.Status.TRACKED ){
            //newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED) {
 
            if (!mAttached && mBundleInstance) {
                // if bundle has been loaded, let's attach it to this trackable
                mBundleInstance.transform.parent = this.transform;
                mBundleInstance.transform.localScale = new Vector3(0.3f, 0.3f, 0.3f);
                mBundleInstance.transform.localPosition = new Vector3(0.0f, 0.15f, 0.0f);
                mBundleInstance.transform.gameObject.SetActive(true);
				
                 
                mAttached = true;
                
				
            }
        }
    }
}

I’ve solved it! The problem was in else function:

 else {
            mBundleInstance = Instantiate(bundle.Load (AssetName)) as GameObject;

Try it like this instead:

using UnityEngine;
using System.Collections;

public class AssetBundleAugmenter1 : MonoBehaviour, ITrackableEventHandler {
    
	
    public string AssetName;
     public string BundleURL;
    private GameObject mBundleInstance = null;
     
    private TrackableBehaviour mTrackableBehaviour;
     
    private bool mAttached = false;
     
     IEnumerator Start(){        
         
        mTrackableBehaviour = GetComponent<TrackableBehaviour>();
        if (mTrackableBehaviour) {
            mTrackableBehaviour.RegisterTrackableEventHandler(this);
        }
			
        using (WWW www = new WWW(BundleURL)){
            yield return www;
             
        if (www .error != null)
            throw new UnityException("WWW Download had an error: " + www. error);
			
        AssetBundle bundle = www.assetBundle;
        if (AssetName == "CylinderAndroid.unity3d") {
            mBundleInstance = Instantiate (bundle.mainAsset) as GameObject;
				//Unload the AssetBundle so it can be reloaded on return
				bundle.Unload(false);
					
        }
		}			
    }
public void OnTrackableStateChanged(
        TrackableBehaviour.Status previousStatus,
        TrackableBehaviour.Status newStatus) {
         
        if (newStatus == TrackableBehaviour.Status.DETECTED ||
            newStatus == TrackableBehaviour.Status.TRACKED ){
            //newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED) {
 
            if (!mAttached && mBundleInstance) {
                // if bundle has been loaded, let's attach it to this trackable
                mBundleInstance.transform.parent = this.transform;
               mBundleInstance.transform.localScale = new Vector3(0.005f, 0.005f, 0.005f);
                mBundleInstance.transform.localPosition = new Vector3(0.0f, 0.0f, 0.0f);
                mBundleInstance.transform.gameObject.SetActive(true);
				
                mAttached = true;
              
            }
        }
    }
}

This should allow the AssetBundle to be Unloaded so when you leave the scene and return, it will be reloaded.
Hope this helps!