Unity-WebGL加载AB包

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

一、前景回顾

上文写到PC、IOS、Android项目加载ab包资源,地址:

二、WebGL打包AB包

打包的步骤和上文中的操作相同,唯一的不同就是在Build页面里Build Target选择WebGL。

Unity-WebGL加载AB包,webgl

 

三、WebGL加载AB包 

(1)内置渲染管线

当项目使用内置渲染管线时,所有材质的Shader为Standard。

Unity-WebGL加载AB包,webgl

(2)通用渲染管线URP

1、当项目为URP时,首先需要在Package Manager里导入Universal RP,如图

Unity-WebGL加载AB包,webgl

2、Create—Rendering—URP Assets(with Universal Render)来创建URP配置文件,如图

Unity-WebGL加载AB包,webgl

3、在Edit—Project Settings—Graphics,修改为刚才创建的文件。这一步操作完成后,场景中的物体材质可能会变成了洋红色。此时项目已由内置着色器转换为URP着色器。

Unity-WebGL加载AB包,webgl

4、Edit—Render Pipeline—Universal Render Pipeline—Upgrade Project Materials to UniversalRP Materials更新材质。 也可以手动修改材质的Shader为Universal Render Pipeline/Lit。如图

Unity-WebGL加载AB包,webgl

5、在软件中运行项目,加载出来的材质是洋红色的(不用担心)。

Unity-WebGL加载AB包,webgl

6、导出项目在本地浏览器加载,加载出来的模型材质是正常的。

Unity-WebGL加载AB包,webgl

四、加载ab包脚本

WebGL使用UnityWebRequest加载依赖和ab包
   
    //主包
    private AssetBundle abMain = null;

    //依赖
    private AssetBundleManifest abMainfest = null;

    //缓存字典,防止多次加载
    private Dictionary<string, AssetBundle> abDic = new Dictionary<string, AssetBundle>();

    /// <summary>
    /// 平台对应的路径
    /// </summary>
    private string PathURL = Application.streamingAssetsPath + "/";

    /// <summary>
    /// 平台对应的主包名称
    /// </summary>
    private string MainABName = "WebGL";


    //UnityWebRequest加载依赖
    private IEnumerator LoadDependences(string abName)
    {
        //加载主包
        if (abMain == null)
        {
            UnityWebRequest abRequest = UnityWebRequestAssetBundle.GetAssetBundle(PathURL + MainABName);
            yield return abRequest.SendWebRequest();
            abMain = DownloadHandlerAssetBundle.GetContent(abRequest);
            //获取主包下的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 (!abDic.ContainsKey(dependences[i]))
                {
                    UnityWebRequest DepRequest = UnityWebRequestAssetBundle.GetAssetBundle(PathURL + dependences[i]);
                    yield return DepRequest.SendWebRequest();
                    ab = DownloadHandlerAssetBundle.GetContent(DepRequest);
                    abDic.Add(dependences[i], ab);
                }
            }
        }
    }

    //UnityWebRequest加载
    public void LoadByRequest<T>(string abName, string resName, UnityAction<T> callBack) where T : Object
    {
        StartCoroutine(ReallyLoadByRequest<T>(abName, resName, callBack));
    }
    private IEnumerator ReallyLoadByRequest<T>(string abName, string resName, UnityAction<T> callBack) where T : Object
    {
        yield return StartCoroutine(LoadDependences(abName));
        if (!abDic.ContainsKey(abName))
        {
            UnityWebRequest abRequest3 = UnityWebRequestAssetBundle.GetAssetBundle(PathURL + abName);
            yield return abRequest3.SendWebRequest();
            AssetBundle ab = DownloadHandlerAssetBundle.GetContent(abRequest3);
            abDic[abName] = ab;
        }
        T loadedResource = abDic[abName].LoadAsset<T>(resName);
        callBack(loadedResource as T);
    }

    //单个包卸载
    public void UnLoad(string abName)
    {
        if (abDic.ContainsKey(abName))
        {
            abDic[abName].Unload(false);
            //注意缓存需一并移除
            abDic.Remove(abName);
        }
    }
    //所有包卸载
    public void UnLoadAll()
    {
        AssetBundle.UnloadAllAssetBundles(true);
        //注意清空缓存
        abDic.Clear();
        abMain = null;
        abMainfest = null;
    }

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

    public void TestOne()
    {
        LoadByRequest<GameObject>("bigrack", "BigRack", (obj) =>
        {
            for (int i = 0; i < bigRackPos.Length; i++)
            {
                //实例化预设
                Instantiate(obj, bigRackPos[i].position, Quaternion.identity);
            }
        });
    }

    public void TestTwo()
    {
        LoadByRequest<GameObject>("smallrack", "SmallRack", (obj) =>
        {
            for (int i = 0; i < smallRackPos.Length; i++)
            {
                //实例化预设
                Instantiate(obj, smallRackPos[i].position, Quaternion.Euler(0, 90, 0));
            }
        });
    }

五、求解

在WebGL项目中加载ab包,不能同时加载加载多个ab包。
测试代码中,我写了两个方法来加载两个ab包,如果我把这两个方法写在Start方法里同时运行,就会报错并且第二个方法加载不出来。
    private void Start()
    {
        TestOne();
        TestTwo();
    }
错误显示
The AssetBundle 'G:/Unity Project/cgf/MyScene/NormalAssetBundle/Assets/StreamingAssets/WebGL' can't be loaded because another AssetBundle with the same files is already loaded.

代码有问题,路过的大佬帮忙纠正一下,好人一生平安。文章来源地址https://www.toymoban.com/news/detail-838555.html

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

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

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

相关文章

  • Unity WebGL 关于构建webgl应用模板设置

    如果你想要修改unity 自带的webgl 启动样式,那么你需要在unity Assets 文件夹目录下添加如下目录   WebGLTemplates 目录是 unity 指定名称的目录,你可以在这个目录下新建你自己的模板目录 名字随意,然后在你需要找一下 你unity 的Default模板文件 ,在你unity 安装目录的  EditorDat

    2024年02月12日
    浏览(35)
  • Openlayers使用WebGL加载多种自定义图标矢量点

    使用OpenLayers的 WebGLPointsLayer 加载海量矢量点(100W),并使用 多种自定义图标样式 。 你需要满足以下环境要求: 支持WebGL 的浏览器(Chrome、Firefox、Safari和Edge等)。 计算机具有一定的图形处理能力( 显卡 )。 一定的计算机 内存和网络带宽 。 一点耐心 1.创建一个 包含所有

    2024年04月11日
    浏览(31)
  • unity webgl 系列(2):从webgl内存中下载文件到本地硬盘

    前面是将文件上传到webgl进程,本篇是将文件从webgl进程中下载文件到浏览器的下载目录中。 通用,只需要 二进制数组和文件名。 添加一段代码 解释:接收三个字符串:由文件二进制转换出来的二进制字符串、xxx.yy文件名、文件类型。 统一经过Pointer_stringify转化为js字符串,

    2024年04月17日
    浏览(27)
  • Unity WebGL实战笔记

    笔者版本为:Unity2021.3.8f1 Unity提供了WebGL平台来,支持在浏览器中实时对3D图形应用交互。 模版 Player-Resolution and Presentation-WebGL Template 默认是Default,这个模版有加载进度条,且在程序出错会弹出提示框。还有一个Minimal模版,没有进度条加载等流程,且程序出错无提示信息。

    2024年02月02日
    浏览(40)
  • Unity WebGL三维地球

    1.支持arcgis,天地图,bingmap,谷歌地图,高德地图等影像加载 2.支持高程三维地形加载 3.支持在线,离线数据加载 4.支持unity坐标和经纬度坐标互相转换 5.支持fbx模型放置在地球上 6.支持倾斜摄影数据放置在地球上 7.支持pc,webgl平台发布 weixin:huazaikv 相关视频: unity三维地球_W

    2024年02月12日
    浏览(25)
  • unity WebGL 发布服务后出错

    解决办法:需要在IIS中添加unity3d和unityweb两个mime 1、电脑怎么添加mime 2、UNITY3D WEBGL IIS发布添加MIME类型 我在添加unity3d和unityweb两个mime后 已经解决此问题

    2024年02月11日
    浏览(38)
  • Unity WebGL获取地址栏参数

    1、在Assets/Plugins/WebGL文件夹下创建MyPlugin.jslib文件 文件内容: 2、创建脚本显示地址 3、BuildAndRun或者打包后用IIS部署一个服务器运行就行了

    2024年02月15日
    浏览(32)
  • Unity WebGL发布页面报错

    1、报错内容 Unable to parse Build/test.framework.js.gz! This can happen if build compression was enabled but web server hosting the content was misconfigured to not serve the file with HTTP Response Header \\\"Content-Encoding: gzip\\\" present. Check browser Console and Devtools Network tab to debug. 2、报错页面 解决方案,在Unity的WebGL Player S

    2024年02月16日
    浏览(29)
  • Unity打包WebGL: 导入Vue

    1.1 任务 记录将 Unity 项目打包成 WebGL ,并集成到 Vue 项目中的过程。 1.2 环境 Unity : 2021.3 Vue : 2 2.1 UI 界面 2.2 添加插件 构建 WebGL 项目需要添加一个 .jslib 文件,用于 Unity 脚本函数与 JavaScript 函数交互 详细内容参考:Unity(WebGL)与JS通讯2022最新姿势 web.jslib 文件内容 2.3 添加脚

    2024年02月11日
    浏览(29)
  • unity发布WebGl在手机上的横屏适配,webgl横版游戏在手机上直接转横屏

    unity版本2020.1 问题:webgl的横版游戏 1920*1080,在手机上适配的不好,还是竖屏显示, 使用官方的说明,说是只在全屏模式下能旋转,也不好用,可能直接旋转也不会达到理想的效果 解决方案: 1.我这边使用的方案是UI的适配,UGUI,采用的是两套UI,根据不同平台加载不同的资源

    2024年02月02日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包