关于Unity通过 Assetbundle加载资源 代码

Unity AssetBundle加载与卸载详解
这篇博客详细介绍了Unity中如何使用AssetBundle从本地加载资源,包括加载GameObject的Prefab并实例化,以及AssetBundle的卸载方法。讨论了false和true参数在Unload方法中的不同效果,以及未卸载AssetBundle可能导致的问题。

AssetBundle asset;
//通过加载本地ab包 加载资源
asset = AssetBundle.LoadFromFile(Application.streamingAssetsPath + “/Window/Res/Cube.u3d”);//注意 ab包要加后缀 这里加载的asset就是所谓的镜像
GameObject obj = asset.LoadAsset(“Assets/Res/Cube/Cube.prefab”);
Instantiate(asset.LoadAsset(“Assets/Res/Cube/Cube.prefab”));//注意这里资源要加后缀 新版本得加载方式需要加后缀否则报空找不到 另外特别要注意得是这个资源路径是从Assets开始得

    Instantiate(UnityEditor.AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Res/Cube/Cube.prefab"));//不走ab包加载资源得话 可以使用这个API 进行加载预制体

ab包得卸载
asset.Unload(false);//如果是false 的话 那么镜像asset被销毁 但是通过镜像加载出来的资源(如上面的Obj)不会被销毁 如果再次加载Asset则是新的Asset,与原来的Asset独立共存于内存;
asset.Unload(true);//如果是true的话 那么镜像asset被销毁 并且通过镜像加载出来的资源(如上面的Obj)会被销毁

另外AssetBundle加载出来后没有Unload则其镜像一直在内存,再次加载会报错
在这里插入图片描述

<think>嗯,用户问的是关于Unity中通过AssetBundle加载资源的问题,特别是当AB资源目录下有子文件夹时,应该用资源名字加载还是路径加载。我需要先回忆一下AssetBundle加载机制。 首先,我记得Unity打包AssetBundle的时候,资源在项目中的路径会影响打包后的AssetBundle结构。如果资源放在子文件夹里,打包时可能需要设置AssetBundle的名称和变体。不过用户的问题是关于加载时的处理,即加载的时候是否需要考虑子文件夹的路径。 然后,想到AssetBundle.LoadAsset方法,这个方法通常是根据资源的名称来加载的,而不是路径。也就是说,无论资源在项目中的哪个子文件夹下,只要打包进了同一个AssetBundle加载时只需要用资源名字。不过这里可能有个前提,就是资源的名称在AssetBundle内是唯一的,否则可能会有冲突。 不过,也有可能用户的情况是,资源被打包到不同的AssetBundle中,这时候可能需要通过路径来指定具体的AssetBundle文件。比如,如果子文件夹被单独打包成不同的AssetBundle,那么加载的时候需要指定那个AssetBundle的路径或者名称,然后再用资源加载具体资源。 可能需要区分两种情况:一种是资源在同一个AssetBundle中的子文件夹结构,另一种是子文件夹被打包成不同的AssetBundle。如果是前者,子文件夹结构在打包后可能被忽略,资源名只是根据文件名;如果是后者,需要加载不同的AssetBundle,每个对应子文件夹。 另外,Unity在打包时,如果选择按照文件夹结构来打包,可能需要设置每个文件夹为一个AssetBundle,这时候加载的时候需要分别加载每个子文件夹对应的AssetBundle,然后再用资源加载资源。如果所有子文件夹的资源都打包到一个AssetBundle中,那么加载时只需要资源名,路径可能被忽略。 不过,可能有一些特殊情况,比如资源名称相同但路径不同,这时候打包到同一个AssetBundle中会导致冲突,所以Unity可能会自动处理为不同的名称,或者在加载时需要指定路径。但根据官方文档,通常AssetBundle.LoadAsset使用的是资源的名称,而不是路径。 需要确认Unity在打包时如何处理资源的路径信息。例如,如果一个资源位于Assets/Resources/Subfolder/MyPrefab.prefab,并且被打包到同一个AssetBundle中,那么加载时是否需要使用"MyPrefab"还是"Subfolder/MyPrefab"。根据经验,应该是"MyPrefab",因为Unity在打包时会将资源名称作为唯一标识,而忽略路径结构,除非在打包时显式设置了不同的AssetBundle名称。 总结一下,用户的问题核心在于子文件夹结构是否影响加载时的资源名称。正确的做法应该是通过资源名称加载,而不是路径,前提是这些资源被打包到同一个AssetBundle中。如果子文件夹被打包成不同的AssetBundle,则需要先加载对应的AssetBundle,然后再用资源加载资源。 另外,可能需要提醒用户注意AssetBundle的依赖关系,如果子文件夹中的资源引用了其他AssetBundle中的资源,需要先加载依赖项。不过这可能超出了当前问题的范围。 最后,应该给出一个明确的步骤说明,比如如何设置AssetBundle的名称,如何加载,以及示例代码,这样用户能更清楚地理解。</think>在Unity中通过AssetBundle加载资源时,**子文件夹路径不会直接影响资源加载方式**,而是由以下两个核心因素决定: --- ### **1. AssetBundle打包规则** - **关键原则**:UnityAssetBundle打包以`AssetBundle名称`为核心,与资源在项目中的物理路径无关。 - **子文件夹的处理**: - 如果子文件夹内的资源被打包到**同一个AssetBundle**中,加载时仅需资源名称。 - 如果子文件夹被标记为**不同的AssetBundle**,则需要分别加载每个AssetBundle。 --- ### **2. 资源加载方式** #### **场景1:子文件夹资源打包到同一个AssetBundle** - **打包设置**:将子文件夹内的资源标记为同一个AssetBundle名称(如 `mybundle`)。 - **加载代码**: ```csharp // 加载AssetBundle(路径为AB文件在服务器的位置) AssetBundle bundle = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "mybundle")); // 加载资源(仅需资源名称,无需子文件夹路径) GameObject obj = bundle.LoadAsset<GameObject>("MyPrefab"); ``` #### **场景2:子文件夹资源打包到不同AssetBundle** - **打包设置**:为每个子文件夹单独标记AssetBundle名称(如 `subfolder1/bundle1` 和 `subfolder2/bundle2`)。 - **加载代码**: ```csharp // 加载子文件夹对应的AssetBundle AssetBundle bundle1 = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "subfolder1/bundle1")); AssetBundle bundle2 = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "subfolder2/bundle2")); // 分别加载资源 GameObject obj1 = bundle1.LoadAsset<GameObject>("ResourceInSubfolder1"); GameObject obj2 = bundle2.LoadAsset<GameObject>("ResourceInSubfolder2"); ``` --- ### **注意事项** 1. **资源名称唯一性**:同一AssetBundle内的资源名称必须唯一,否则会覆盖。 2. **依赖关系**:若子文件夹资源引用其他AssetBundle中的资源,需先加载依赖的AssetBundle。 3. **路径无关性**:资源加载时仅依赖AssetBundle名称和资源名称,与原始项目路径无关。 --- ### **总结** - **资源加载依据**:由**AssetBundle名称**和**资源名称**共同决定,与子文件夹路径无关。 - **开发建议**:通过脚本统一管理AssetBundle命名规则,避免手动操作导致路径混乱。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值