Asset Bundle

using UnityEngine;
using System.Collections;
using UnityEditor;
/// <summary>
/// 脚本位置:Editor文件夹下
/// 脚本功能:打包
/// </summary>
public class CreateAssetBundle:Editor
{
    // 打包unity场景文件
    [MenuItem("Assets/Build AssetBundle Scene")]
    static void MyBuild(){
        // 需要打包的场景名字
        string [] levels =  {"Assets/2.unity"};
        // 注意这里【区别】通常我们打包,第2个参数都是指定文件夹目录,在此方法中,此参数表示具体【打包后文件的名字】
        // 记得指定目标平台,不同平台的打包文件是不可以通用的。最后的BuildOptions要选择流格式
        BuildPipeline.BuildPlayer(levels, Application.dataPath+"/Scene.unity3d", BuildTarget.Android, BuildOptions.BuildAdditionalStreamedScenes);
        // 刷新,可以直接在Unity工程中看见打包后的文件
        AssetDatabase.Refresh();
        
    }


}

using UnityEngine;
using System.Collections;

/// <summary>
/// 脚本位置:需要加载物体的场景中任意物体上
/// 脚本功能:加载物体
/// </summary>
public class LoadAssetBundle : MonoBehaviour
{
        
    private string url;
    private string assetname;

    void Start ()
    {
        // 下载压缩包,写出具体的名字
        url = "file://" + Application.dataPath + "/Scene.unity3d";

        // unity预制体名字,即被打包的场景名字叫 2
        assetname = "2";

        StartCoroutine (Download ());
    }

    IEnumerator Download ()
    {

        WWW www = new WWW (url);
        yield return www;
        if (www.error != null) {
            Debug.Log ("下载失败");
        } else {
            AssetBundle bundle = www.assetBundle;
            Application.LoadLevel ("2");
            print ("跳转场景");
            // AssetBundle.Unload(false),释放AssetBundle文件内存镜像,不销毁Load创建的Assets对象
            // AssetBundle.Unload(true),释放AssetBundle文件内存镜像同时销毁所有已经Load的Assets内存镜像
            bundle.Unload (false);
        }

        // 中断正在加载过程中的WWW
        www.Dispose ();
    }

}



    public string path;
    public string file;


    void Start()
    {
        StartCoroutine("Load");
    }


    IEnumerator Load()
    {
        string _path = "file:///" + Application.dataPath + "/" + path;
        WWW www = WWW.LoadFromCacheOrDownload(_path, 1);
        yield return www;
        AssetBundle ab = www.assetBundle;
        AssetBundleRequest request = ab.LoadAssetAsync(file);
        yield return request;
        GameObject prefab = request.asset as GameObject;
        Instantiate(prefab, Vector3.zero, Quaternion.identity);


        //clean
        ab.Unload(false);
        www.Dispose();
    }

### 关于 Unity 中 Asset Bundle 的资源打包与管理 #### 定义与作用 Asset Bundles 是一种用于在运行时按需加载资源的技术,在 Unity 游戏开发中广泛应用。这不仅有助于减少初始安装包大小,还能实现热更新等功能[^1]。 #### 创建过程 对于资源打包而言,开发者可以先给目标资源设定特定标签以便识别。完成这些预处理操作之后,借助 Unity 提供的标准 API 函数来执行实际的打包流程。例如: ```csharp using UnityEngine; public static class BuildAssetBundles { [MenuItem("Assets/Build AssetBundles")] private static void Build() { string path = "Assets/AssetBundles"; if (!System.IO.Directory.Exists(path)) System.IO.Directory.CreateDirectory(path); BuildPipeline.BuildAssetBundles(path, BuildAssetBundleOptions.None, EditorUserBuildSettings.activeBuildTarget); } } ``` 这段脚本展示了如何定义一个菜单项用来触发构建 AssetBundle 过程,并指定了输出路径以及一些选项参数[^2]。 #### 加载方式 当需要从已有的 .ab 文件中读取并实例化对象时,则可以通过如下方法实现: ```csharp using UnityEngine; public class LoadFromFileExample : MonoBehaviour { void Start () { // 加载单个 AB 包 AssetBundle ab = AssetBundle.LoadFromFile("path/to/myassetbundle"); // 如果要加载多个依赖相同的共享库的 AB 包 AssetBundle abShare = AssetBundle.LoadFromFile("path/to/sharedassets"); // 可选:加载指定名称的游戏物体资产 GameObject go = ab.LoadAsset<GameObject>("MyGameObjectName"); Instantiate(go); // 或者一次性加载所有的游戏物体到列表里再逐一实例化它们 Object[] objs = ab.LoadAllAssets<GameObject>(); foreach (var obj in objs) { Instantiate(obj); } // 记得释放不再使用的 AB 包以节省内存空间 ab.Unload(false); abShare.Unload(false); } } ``` 上述代码片段提供了两种不同的加载策略——既可以单独获取某个具体类型的资源也可以批量取得一组同类型的数据集;同时强调了适时卸载不再必要的 bundle 来优化性能的重要性。 #### 工具支持 为了简化这一系列复杂的工作流,Unity 社区贡献了许多实用插件。比如 `Asset Bundle Browser` 就是一个非常受欢迎的选择之一。它允许用户直观地浏览项目内的所有 asset bundles 并对其进行调试分析。不同版本号之间的差异在于集成位置的不同而已[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值