加载AssetBundle的方式总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq826364410/article/details/86515767

一、从UnityWebRequest加载AssetBundle

public void LoadResource(string resName, string filePath)
    {
        StartCoroutine(LoadResourceCorotine(resName, filePath));
    }

    IEnumerator LoadResourceCorotine(string resName, string filePath)
    {
        AssetBundle ab = null;
        string path = @"http://localhost/AssetBundles/" + filePath;
        UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(path);
        yield return request.SendWebRequest();
        if (request.isNetworkError || request.isHttpError)
        {
            Debug.Log(request.error);
        }
        else
        {
            ab = DownloadHandlerAssetBundle.GetContent(request);
            //ab = (request.downloadHandler as DownloadHandlerAssetBundle).assetBundle;
        }
        if (ab == null)
        {
            yield break;
        }
        //同步加载
        //GameObject gameObject = ab.LoadAsset<GameObject>(resName);
        //异步加载
        AssetBundleRequest abRequest = ab.LoadAssetAsync<GameObject>(resName);
        yield return abRequest;
        GameObject ob = abRequest.asset as GameObject;
        Instantiate(ob);
        // 卸载所有的资源
        ab.Unload(true);
    }

二、从内存加载AssetBundle

/// <summary>
    /// 从内存直接加载
    /// </summary>
    private void LoadFromMemory(string resName)
    {
        AssetBundle ab;
        ab = AssetBundle.LoadFromMemory(File.ReadAllBytes(m_ABpath));
        GameObject ob = ab.LoadAsset<GameObject>(resName);
        Instantiate(ob);
        ab.Unload(true);
    }

    /// <summary>
    /// 从内存异步加载
    /// </summary>
    IEnumerator LoadFromMemoryAsync(string resName)
    {
        AssetBundle ab;
        AssetBundleCreateRequest request = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes(m_ABpath));
        yield return request;
        ab = request.assetBundle;
        if (ab == null)
        {
            yield break;
        }
        AssetBundleRequest abRequest = ab.LoadAssetAsync<GameObject>(resName);
        yield return abRequest;
        GameObject ob = abRequest.asset as GameObject;
        Instantiate(ob);
        ab.Unload(true);
    }

三、从文件加载AssetBundle

/// <summary>
    /// 从文件直接加载
    /// </summary>
    private void LoadFromFile(string resName)
    {
        AssetBundle ab;
        ab = AssetBundle.LoadFromFile(m_ABpath);
        GameObject ob = ab.LoadAsset<GameObject>(resName);
        Instantiate(ob);
        ab.Unload(true);
    }

    /// <summary>
    /// 从文件异步加载
    /// </summary>
    IEnumerator LoadFromFileAsync(string resName)
    {
        AssetBundle ab;
        AssetBundleCreateRequest request = AssetBundle.LoadFromFileAsync(m_ABpath);
        yield return request;
        ab = request.assetBundle;
        if (ab == null)
        {
            yield break;
        }
        AssetBundleRequest abRequest = ab.LoadAssetAsync<GameObject>(resName);
        yield return abRequest;
        GameObject ob = abRequest.asset as GameObject;
        Instantiate(ob);
        ab.Unload(true);
    }

四、从Stream加载AssetBundle

/// <summary>
    /// 从Stream直接加载
    /// </summary>
    private void LoadStream(string resName)
    {
        AssetBundle ab;
        FileStream fs = new FileStream(m_ABpath, FileMode.Open, FileAccess.Read);
        ab = AssetBundle.LoadFromStream(fs);
        GameObject ob = ab.LoadAsset<GameObject>(resName);
        Instantiate(ob);
        ab.Unload(true);
        //加载AssetBundle时,不要处理Stream对象,它的生命周期应该比AssetBundle周期长,
        //可以在调用AssetBundle.Unload()后,处理Stream对象
        fs.Close();
    }

    /// <summary>
    /// 从Stream异步加载
    /// </summary>
    IEnumerator LoadStreamAsync(string resName)
    {
        AssetBundle ab;
        FileStream fs = new FileStream(m_ABpath, FileMode.Open, FileAccess.Read);
        AssetBundleCreateRequest request = AssetBundle.LoadFromStreamAsync(fs);
        yield return request;
        ab = request.assetBundle;
        if (ab == null)
        {
            yield break;
        }
        AssetBundleRequest abRequest = ab.LoadAssetAsync<GameObject>(resName);
        yield return abRequest;
        GameObject ob = abRequest.asset as GameObject;
        Instantiate(ob);
        ab.Unload(true);
        //加载AssetBundle时,不要处理Stream对象,它的生命周期应该比AssetBundle周期长,
        //可以在调用AssetBundle.Unload()后,处理Stream对象
        fs.Close();
    }

五、加载Manifest配置

/// <summary>
    /// 加载Manifest配置
    /// </summary>
    private void LoadManifest()
    {
        AssetBundle ab = AssetBundle.LoadFromFile(m_OutPath + "/AssetBundles/AssetBundles");
        AssetBundleManifest manifest = ab.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
        //foreach (var item in manifest.GetAllAssetBundles())
        //{
        //    print(item);
        //}
        foreach (var item in manifest.GetAllDependencies("wall.unity3d"))
        {
            print(item);
            AssetBundle.LoadFromFile(m_OutPath + "/AssetBundles/" + item);
        }
    }

猜你喜欢

转载自blog.csdn.net/qq826364410/article/details/86515767
今日推荐