Unity-AssetBundle Browser 打包和加载

这篇具有很好参考价值的文章主要介绍了Unity-AssetBundle Browser 打包和加载。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、AssetBundle Browser资源的导入

进入unity手册中,搜素 Unity Asset Bundle Browser 工具,选择你使用的版本号,根据显示出的操作进行资源导入即可。

注:有的版本可能没有资源链接,可以百度一下有很多。

assetbundle browser,unity,游戏引擎

二、AssetBundle Browser 打包

1、制作预制体(省略) 
2、选择一个预制体,在Inspector窗口下方,设置预制体的ab包名(包名只能为小写字母)

assetbundle browser,unity,游戏引擎

assetbundle browser,unity,游戏引擎

3、包体设置
在Window-AssetBundle Browser出现操作页面。

assetbundle browser,unity,游戏引擎

这是刚才把两个预制体设置为ab包,现在两个包后面显示黄色感叹号,这是因为两个预制体里有相同的材质和预制体。 如果直接打包这两个包体存在相同的资源,包体会大,还会重复加载资源。我们这里把相同的资源存放到另外的包体中当作依赖来加载。
4、处理依赖资源
在左侧区域右键-Add new bundle命名为rackmat,把其中一个包体里带有黄色感叹号的资源拖到rackmat里。

assetbundle browser,unity,游戏引擎

5、输出打包
在Build页面,设置打包的配置,选择要打包的平台,勾选Clear Folders重新打包时会清除之前打包的文件。 点击Build后,资源会打包的输出路径的位置,同时也会复制出一个StreamingAssets文件夹,里面也会有一份打包文件。

assetbundle browser,unity,游戏引擎

               

assetbundle browser,unity,游戏引擎assetbundle browser,unity,游戏引擎

                        输出的文件                                                              复制出的文件 

三、AssetBundle Browser 加载

    
    /// <summary>
    /// 缓存加载的AssetBundle,防止多次加载
    /// </summary>
    private Dictionary<string, AssetBundle> m_abDic = new Dictionary<string, AssetBundle>();

    /// <summary>
    /// 它保存了各个AssetBundle的依赖信息
    /// </summary>
    private AssetBundleManifest abMainfest = null;

     /// <summary>
    /// 主包
    /// </summary>
    private AssetBundle abMain = null;

    /// <summary>
    /// 打包成不同平台对应的路径
    /// </summary>
    private string PathURL
    {
      get
        {

        #if UNITY_EDITOR || UNITY_STANDALONE
                return Application.dataPath + "/StreamingAssets/";
        #elif UNITY_IPHONE
                return Application.dataPath + "/Raw/";
        #elif UNITY_ANDROID
                return Application.dataPath + "!/assets/";
        #endif
        }
    }
     
    /// <summary>
    /// 打包成不同平台对应的主包名称
    /// </summary>
    private string MainABName
    {
        get
        {
        #if UNITY_EDITOR || UNITY_STANDALONE
                return "StandaloneWindows";
        #elif UNITY_IPHONE
                return "IOS";
        #elif UNITY_ANDROID
                return "Android";
        #endif
        }
    }
1、先加载主包,就是包含所有依赖信息的包。
2、通过主包文件,就可以看到当前一共有三个ab包分别是bigrack、smallrack和rackmat,和上文创建的ab包一致。在上文中,把bigrack和samllrack的材质和其他共同资源放到了rackmat包里,所以rackmat是bigrack和smallrack的依赖包。

assetbundle browser,unity,游戏引擎

                                                                        依赖包信息 

3、当加载ab包时,先通过主包查看它是否有依赖,如果有就加载它加入到字典中,方便下次再次加载,然后再加载ab包。
    
    // 初始化,加载AssetBundleManifest,方便后面查找依赖

    public void Init(string abName)
    {
        //加载主包
        if (abMain == null)
        {
            abMain = AssetBundle.LoadFromFile(PathURL + MainABName);
            //获取主包下的AssetBundleManifest资源文件(存有依赖信息)
            abMainfest = abMain.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
        }

        //加载依赖
        AssetBundle ab = null;
        string[] dependences = abMainfest.GetAllDependencies(abName);
        if (dependences.Length > 0)
        {
            for (int i = 0; i < dependences.Length; i++)
            {
                if (!m_abDic.ContainsKey(dependences[i]))
                {
                    ab = AssetBundle.LoadFromFile(PathURL + dependences[i]);
                    m_abDic.Add(dependences[i], ab);
                }
            }
        }
        //加载ab包
        if (!m_abDic.ContainsKey(abName))
        {
            ab = AssetBundle.LoadFromFile(PathURL + abName);
            m_abDic[abName] = ab;
        }
    }

4、同步加载 

    //====================同步加载方式=================

    /// <summary>
    /// 指定类型同步加载
    /// </summary>
    /// <param name="abName">ab包名</param>
    /// <param name="resName">包里资源的具体名(预制体)</param>
    /// <returns></returns>
    public Object LoadAssetBundle(string abName, string resName)
    {
        Init(abName);
        Object obj = m_abDic[abName].LoadAsset(resName);
        return obj;
    }

    //泛型
    public T LoadAssetBundle<T>(string abName, string resName) where T : Object
    {
        Init(abName);
        T obj = m_abDic[abName].LoadAsset<T>(resName);
        return obj;
    }

5、异步加载 

    //====================异步加载方式=================

    /// <summary>
    /// 指定类型异步加载
    /// </summary>
    /// <param name="abName">ab包名</param>
    /// <param name="resName">包里资源的具体名(预制体)</param>
    /// <param name="callBack">回调函数</param>
     public void LoadAssetAsync(string abName, string resName, UnityAction<Object> callBack)
    {
        StartCoroutine(ReallyLoadResAsync(abName, resName, callBack));
    }
    private IEnumerator ReallyLoadResAsync(string abName, string resName, UnityAction<Object> callBack)
    {
        Init(abName);
        AssetBundleRequest abRuqest = m_abDic[abName].LoadAssetAsync(resName);
        yield return abRuqest;
        callBack(abRuqest.asset);
    }


    //泛型
    public void LoadAssetAsync<T>(string abName, string resName, UnityAction<T> callBack) where T : Object
    {
        StartCoroutine(ReallyLoadResAsync<T>(abName, resName, callBack));
    }
    private IEnumerator ReallyLoadResAsync<T>(string abName, string resName, UnityAction<T> callBack) where T : Object
    {
        Init(abName);
        AssetBundleRequest abRuqest = m_abDic[abName].LoadAssetAsync<T>(resName);
        yield return abRuqest;
        callBack(abRuqest.asset as T);
    }

6、卸载ab包 
    //====================AB包的两种卸载方式=================

    //单个包卸载
    public void UnLoad(string abName)
    {
        if (m_abDic.ContainsKey(abName))
        {
            m_abDic[abName].Unload(false);
            //注意缓存需一并移除
            m_abDic.Remove(abName);
        }
    }

    //所有包卸载
    public void UnLoadAll()
    {
        AssetBundle.UnloadAllAssetBundles(true);
        //注意清空缓存
        m_abDic.Clear();
        abMain = null;
        abMainfest = null;
    }

7、测试
  
    public Transform[] bigRackPos;
    public Transform[] smallRackPos;

    private void Start()
    {
        LoadRack();
        LoadRackAsync();
    }

    //同步加载 
    public void LoadRack()
    {
        GameObject prefab = AssetBundleLoaderMgr.Instance.LoadAssetBundle<GameObject>("smallrack", "SmallRack");
        for (int i = 0; i < smallRackPos.Length; i++)
        {
            //实例化预设
            Instantiate(prefab, smallRackPos[i].position, Quaternion.Euler(0, 90, 0));
        }
    }
    //异步加载
    public void LoadRackAsync()
    {
        AssetBundleLoaderMgr.Instance.LoadAssetRequest<GameObject>("bigrack", "BigRack", (obj) =>
         {
             for (int i = 0; i < bigRackPos.Length; i++)
             {
                 //实例化预设
                 Instantiate(obj, bigRackPos[i].position, Quaternion.identity);
             }
         });
    }

8、成功加载出ab包 

assetbundle browser,unity,游戏引擎

注:当前这些方法适合PC、IOS、Android项目加载ab包资源,对于WebGL项目加载ab包资源就不适用了。由于WebGL的特殊性,我会专门写一篇针对web的ab包加载。

 文章来源地址https://www.toymoban.com/news/detail-849544.html

到了这里,关于Unity-AssetBundle Browser 打包和加载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity】AssetBundle加载与卸载

    需要注意的是同一个ab包一次只能加载一个,不可以同时加载, 报错: The AssetBundle \\\'xxxxx\\\' can\\\'t be loaded because another AssetBundle with the same files is already loaded. 如果AB包已经加载过则先进行卸载: 1、卸载全部的目前没有使用的资源: Resources.UnloadUnusedAssets() 2、卸载 AssetBundle 释放其

    2024年04月25日
    浏览(31)
  • [游戏开发][Unity]Assetbundle打包篇(1)打包流程介绍

    打包与资源加载框架目录 先捋一下打AB包的整体思路,首先,Unity4.6版本之后就使用了全新的打包接口 无论是全新打包还是增量打包都是使用这个API,所以一切的一切,都要围绕这个API开始讲起。 该API有四个参数 string outputPath AssetBundleBuild[] builds BuildAssetBundleOptions assetBundle

    2024年02月10日
    浏览(40)
  • [游戏开发][Unity]Assetbundle打包篇(2)打包资源配置篇

    打包与资源加载框架目录 可视化配置的方式有很多种,Json、XML、以及Unity内置的ScriptableObject序列化 配置文件里要有哪些内容呢,很显然,最重要的就是目标文件路径,其次是权重类型,权重类型有:必要打包型、被引用打包型、忽略类型。为何会有忽略类型呢,是因为我们

    2024年02月09日
    浏览(43)
  • Unity引擎打包AssetBundle后模型网格数据丢失问题

    大家好,我是阿赵。 在项目里面,有时候会遇到这样一个问题。在Unity编辑器里面编写了一个shader,在编辑器看,效果都是没有问题的。但如果把资源打包成AssetBundle后,会发现shader的表现不对了。遇到了这种问题的时候,一般人会各自的怀疑,怀疑是不是shader写得不对,导

    2024年02月07日
    浏览(53)
  • Unity 解决SpriteAtlas图集打包AssetBundle白图问题

    之前文档上说勾选了Include in build之后,就不需要自己增加一个Binding脚本,但是仍然会弹出警告,并且会出现白图现象 Tight Packing 勾选之后当Sprite有透明通道可能会出现错位 不推荐勾选 选项取消勾选之后打包AssetBundle会报警告 并且出现白图现象 那是因为没有进行bing  Sprite

    2024年02月11日
    浏览(42)
  • Unity的AssetBundle系统来动态加载FBX模型

    在Unity中,可以使用C#脚本和Unity的AssetBundle系统来动态加载FBX模型。以下是一个简单的示例,演示如何动态加载FBX模型: 准备FBX模型 首先,准备一个或多个FBX模型,并将它们导入到Unity项目中。确保每个FBX模型都有一个独立的游戏对象,并且已经被正确地设置为“Static”或“

    2024年02月06日
    浏览(44)
  • 【Unity】AssetBundle资源异步加载以及AB包卸载

    以下代码是基于上一篇文章《AssetBundle资源同步加载》的代码新增了异步加载和AB包卸载功能,有兴趣的同学可以去看看我的上一篇文章。 由于异步加载需要配合协程进行功能开发,所以我对之前封装的AB包资源加载管理器进行修改,改为继承MonoBehaviour的单例模式。 主要修改

    2023年04月08日
    浏览(38)
  • Unity3D打包Assetbundle丢失Shader问题

    详情见:https://www.pianshen.com/article/5391338163/ 1、Unity3D在打包Assetbundle时,可能会遇到Shader丢失的问题,解决方法:打开 Edit-Project Settings-Graphics,在Always Included Shaders列表添加上所需的shader ,再打包即可。 2、参考 3、原文复制 Scriptable RenderLoop settings This is an experimental setting wh

    2023年04月22日
    浏览(60)
  • Unity AssetsBundle一键为需要打包的预制体设置assetBundle名

    直接看代码:

    2024年02月11日
    浏览(31)
  • [游戏开发][Unity]Assetbundle打包篇(5)使用Manifest二次构建资源索引

    打包与资源加载框架目录 正文开始前,先把打包代码放过来,请注意,前面的代码已省略,自己去对比前面的文章。本篇文章从第一次执行打包代码开始。 第一次调用BuildPipeline.BuildAssetBundles打包API后(详见代码第七行),会返回AssetBundleManifest的引用, 【疑问】: BuildPipe

    2024年02月03日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包