Unity动态加载AssetBundle

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class Test2:MonoBehaviour {
    public static string BundleURL;
    private GameObject g;
    private string assetname;

    private void Awake() {
        //平台预处理
        BundleURL =
#if UNITY_ANDROID
                    "jar:file://" + Application.dataPath + "!/assets/";
#elif UNITY_IPHONE
                    Application.dataPath + "/Raw/";
#elif UNITY_STANDALONE_WIN || UNITY_EDITOR
 "file://" + Application.dataPath + "/StreamingAssets/";//Test_AssetBundle 资源束文件的位置
#elif UNITY_WEBGL
 "服务器地址";
#else
                    string.Empty;  
#endif
    }

    public void OnPrefab() {
        StartCoroutine(DownPrefabAndSceneWWW(BundleURL + ".manifest名称"));
    }
    //WWW加载
    IEnumerator DownPrefabAndSceneWWW(string path) {
        //电脑端加载使用
        using (WWW asset = new WWW(path)) { 
            yield return asset;
        AssetBundle bundle = asset.assetBundle;
        //资源加载 
        //加载的是打包到资源包里面,每个资源的名字
        g = Instantiate(bundle.LoadAsset(".manifestPrefab")) as GameObject;
        g.transform.position = Vector3.zero;
        //资源加载完毕后记得Unload,不然再次加载资源的时候无法加载
        bundle.Unload(false);
        }
    }
    //UnityWebRequest加载
    IEnumerator DownPrefabAndSceneUnityWebRequest(string path) {
        using (UnityWebRequest www = UnityWebRequestAssetBundle.GetAssetBundle(url)) {
            // Debug.LogError(url);
            yield return www.SendWebRequest();
            if (www.isNetworkError || www.isHttpError) {
                Debug.Log(www.error);
            }
            else//第一种加载方法  需要把场景拖进buildsetting
            {
                AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(www);
                SceneManager.LoadScene(assetname);
                Debug.Log(www.GetHashCode());
                print("跳转场景");
                // AssetBundle.Unload(false),释放AssetBundle文件内存镜像,不销毁Load创建的Assets对象
                // AssetBundle.Unload(true),释放AssetBundle文件内存镜像同时销毁所有已经Load的Assets内存镜像
                bundle.Unload(false);
            }
        }
    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity中,可以使用AssetBundle来打包和加载资源,而动态控制AssetBundle的依赖关系是实现资源动态加载和更新的重要步骤。以下是一种常见的方法来实现动态控制AssetBundle的依赖关系: 1. 创建AssetBundle:首先,你需要创建和打包AssetBundle。你可以使用Unity的BuildPipeline.BuildAssetBundles方法来生成AssetBundle文件,并且可以指定资源及其依赖项的路径。 2. 加载主AssetBundle:在运行时,你需要加载主AssetBundle,这是整个资源加载的起点。你可以使用AssetBundle.LoadFromFile或AssetBundle.LoadFromMemoryAsync等方法来加载主AssetBundle。 3. 加载依赖项:一旦主AssetBundle加载完成,你可以通过AssetBundle.GetAllDependencies方法获取它的所有依赖项的名称。然后,你可以使用AssetBundle.LoadFromFile或AssetBundle.LoadFromMemoryAsync等方法来加载这些依赖项的AssetBundle文件。 4. 加载资源:当所有依赖项的AssetBundle加载完成后,你可以使用AssetBundle.LoadAsset或者AssetBundle.LoadAssetAsync等方法来加载资源。这些资源可以是场景、模型、纹理等。 5. 卸载AssetBundle:一旦你加载了所需的资源,你可以使用AssetBundle.Unload方法来卸载不再需要的AssetBundle。但要注意,如果你还在使用该AssetBundle中的资源,那么卸载后将无法访问这些资源。 通过以上步骤,你可以实现动态控制AssetBundle的依赖关系,实现资源的灵活加载和更新。当你需要更新资源时,你可以重新构建AssetBundle并替换旧的AssetBundle文件,然后再次按照上述步骤加载新的AssetBundle即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值