Unity bundle的制作和使用

     Unity有个很好的功能,大致是很多专注于PC的engine没有提供的(因为没有必要),就是能加载主包外的资源,这个主包外的资源,unity把它叫做bundle。这个功能的提供,主要是在web上或者是ios、android等设备上,主包太大的话,会遇上下载主包时间太长,体验不佳;或者是有些市场直接就限制了主包的大小。

制作的bundle的方式,这里只讲bundle中连scene都带入的:

1、Assets/Editor下面放入编辑器使用的菜单代码,代码如下:

    @MenuItem("Tools/Build Streamed Asset Bundle")  
    static function ExportResource () {  
        var path = EditorUtility.SaveFilePanel ("Build Bundle", "", "*", "unity3d");  
        if (path.Length != 0)  
        {  
            var levels : String[] = ["Assets/mybundlelevel.unity"];  
            BuildPipeline.BuildStreamedSceneAssetBundle (levels, path, BuildTarget.Android);  
        }  
    }  

   上面的代码的最后一行,最后一个参数,你可以用需要的平台填入。

2、上面的代码放入以后,在Unity的Tools目录下,可以找到“Build Streamed Asset Bundle”。点击这个菜单,就可以为mybundlelevel.unity这个scene生成相关的.unity3d文件,也就是我们需要的bundle文件。

    这样制作bundle的过程就结束了。你可以在主包中删除这个关卡而节省主包的空间。注意的是,你可以删除这个关卡需要的所有的资源,只不过要注意不要删除脚本文件、shader文件,还有就是可能被其他关卡引用到的文件。


使用bundle的方式:

在你的程序中,用下面的代码读取和装载相关的bundle

WWW download = WWW.LoadFromCacheOrDownload("file://" + dataPath + "mybundlelevel.unity3d", 1);  
  
if (download.error != null)  
{  
    Debug.LogError(download.error);  
    return false;  
}  
AssetBundle bundle = download.assetBundle; 

    注意最后一句代码并非想象中的没有必要(特别是C和C++程序员看到这个语句可能是某个function的最后一句),Unity文档说提到,这样写过后,资源才会被真正load进来。

LoadFromCacheOrDownload()的第一个参数,是一个URI,用"file://"开头,说明是本地的文件。用"http://“开头,说明文件在网络上。

    上面的代码正确无误的跑过后,你就可以当做原来的level已经在你的主包中了。现在就可以用Application.LoadLevel()来装载这个关卡。

    上述方式笔者在Android平台上测试,完全没有任何问题。而且加载速度也很快,在Unity论坛上,有老外遇上加载的速度很慢,笔者没有遇到。

另,这个过程可能遇上让你抓头的问题:

Application.LoadLevel()时,Unity报错,大致是“xxx couldn't be loaded because it has not been added to the build settings”。这个问题的产生,你可以检查以下几个地方:

1、生成bundle的时候,bundle生成没有错误;

2、bundle通过一定的方式放到了正确的路径;

3、LoadFromCacheOrDownload()的参数一,用了file://或者是http://开头;

4、可以更改LoadFromCacheOrDownload()的第二个参数试试;

5、用上AssetBundle.Unload();

不需要考虑的是,在bundle中的scene(level),是不需要在BuildSetting中勾上的,也没有办法勾,因为被你删除了,对吧!Unity的这个错误提示容易让人想入非非。

原文地址:http://blog.youkuaiyun.com/tinyhum3d/article/details/7674626

### Unity AssetBundle 工具实用程序 对于管理与创建 AssetBundles,Unity 提供了一系列官方支持的工具以及社区开发的解决方案。AssetBundles 是一种打包资源的方式,允许开发者按需加载这些包中的纹理、模型其他资产,从而优化游戏性能并减少初始下载大小。 #### 官方工具支持 - **Unity Editor 内置功能** 使用 Unity 编辑器内置的功能可以方便地构建 AssetBundles。通过 `BuildPipeline.BuildAssetBundles` 方法能够指定输出路径以及其他选项来编译所需的 AssetBundles[^1]。 ```csharp using UnityEditor; public static void BuildAllAssetBundles() { string assetBundleDirectory = "Assets/AssetBundles"; if (!System.IO.Directory.Exists(assetBundleDirectory)) System.IO.Directory.CreateDirectory(assetBundleDirectory); BuildPipeline.BuildAssetBundles( assetBundleDirectory, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64); // 更改为目标平台 } ``` - **Addressable Assets Package** Addressables 是 Unity 推荐用于处理动态内容加载的新一代系统。它不仅简化了 AssetBundle 的管理分发过程,还提供了更强大的依赖解析能力。安装此包后,可以通过简单的 API 调用来异步加载资源[^2]。 ```csharp using UnityEngine.AddressableAssets; private async Task<GameObject> LoadPrefabAsync(string prefabName) { var handle = Addressables.LoadAssetAsync<GameObject>(prefabName); await handle.Task; return handle.Result; } ``` #### 社区贡献工具 除了官方提供的工具外,还有许多由社区成员制作的强大插件可以帮助更好地利用 AssetBundles: - **Asset Bundle Browser** 这是一个非常受欢迎的编辑器扩展,提供了一个图形界面来浏览项目中存在的所有 AssetBundles 及其内部结构。这对于调试分析哪些文件被打包进了哪个 bundle 非常有用。 - **Asset Bundle Manager** 此库旨在简化跨多个平台上部署更新 AssetBundles 的流程。它包含了自动化的版本控制系统以及增量更新的支持等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值