Unity 从服务器加载AssetBundle资源写入本地内存,并将下载保存的AB资源从本地内存加载至场景

这篇具有很好参考价值的文章主要介绍了Unity 从服务器加载AssetBundle资源写入本地内存,并将下载保存的AB资源从本地内存加载至场景。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

从服务器加载资源:

AB资源打包后有一个【目录文件】AssetBundle,他保存了所有AB资源的路径与名称,

通过aLLAssetBundleURL链接路径 组拼 从【目录文件】获得的AB资源的名字,然后再协程方法内编写相关代码,从而实现从服务器加载资源的功能。详细见代码。文章来源地址https://www.toymoban.com/news/detail-540417.html

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using System.IO;

public class DownLoadAssetBundle : MonoBehaviour
{
    //AB资源文件保存在服务器中的位置(我的服务器寄了,加载不到了)
    private string mainAssetBundleURL = @"http://120.24.90.173/Luademo/AssetBundles/AssetBundles";
    private string aLLAssetBundleURL = @"http://120.24.90.173/Luademo/AssetBundles/";
    
    void Start()
    {
        StartCoroutine("DownLoadMainAssetBundle");
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            LoadAssetBundle();
        }
    }
    
    /// <summary>
    /// 下载主[目录]AssetBundle文件
    /// </summary>
    IEnumerator DownLoadMainAssetBundle()
    {
        //创建一个获取 AssetBundle 文件的 web 请求.
        UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(mainAssetBundleURL);

        //发送这个 web 请求.
        yield return request.SendWebRequest();

        //从 web 请求中获取内容,会返回一个 AssetBundle 类型的数据.
        AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);

        if (ab == null)
        {
            Debug.Log("not ab");
        }

        //从这个“目录文件 AssetBundle”中获取 manifest 数据.
        AssetBundleManifest manifest = ab.LoadAsset<AssetBundleManifest>("AssetBundleManifest");

        //获取这个 manifest 文件中所有的 AssetBundle 的名称信息.
        string[] names = manifest.GetAllAssetBundles();
        for (int i = 0; i < names.Length; i++)
        {
            //组拼出下载的路径链接.
            Debug.Log(aLLAssetBundleURL + names[i]);

            //下载单个AssetBundle文件加载到场景中.
            //StartCoroutine(DownLoadSingleAssetBundle(aLLAssetBundleURL + names[i]));
            
            //下载AssetBundle并保存到本地.
            StartCoroutine(DownLoadAssetBundleAndSave(aLLAssetBundleURL + names[i]));
        }

    }

    /// <summary>
    /// 下载单个AssetBundle文件加载到场景中
    /// </summary>
    IEnumerator DownLoadSingleAssetBundle(string url)
    {
        UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url);
        yield return request.SendWebRequest();
        AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);

        //通过获取到的 AssetBundle 对象获取内部所有的资源的名称(路径),返回一个数组.
        string[] names = ab.GetAllAssetNames();
        for (int i = 0; i < names.Length; i++)
        {
            //Debug.Log(names[i]);

            //截取路径地址中的文件名,且无后缀名. 需要引入 System.IO 命名空间.
            string tempName = Path.GetFileNameWithoutExtension(names[i]);
            Debug.Log(tempName);

            //实例化.
            GameObject obj = ab.LoadAsset<GameObject>(tempName);
            GameObject.Instantiate<GameObject>(obj);
        }
    }

    /// <summary>
    /// 下载AssetBundle并保存到本地
    /// </summary>
    IEnumerator DownLoadAssetBundleAndSave(string url)
    {
        //UnityWebRequestAssetBundle.GetAssetBundle(string uri)使用这个API下载回来的资源它是不支持原始数据访问的.
        UnityWebRequest request = UnityWebRequest.Get(url);
        yield return request.SendWebRequest();

        //表示下载状态是否完毕.
        if (request.isDone)
        {
            //使用 IO 技术把这个 request 对象存储到本地.(需要后缀)
            //SaveAssetBundle(Path.GetFileName(url), request.downloadHandler.data, request.downloadHandler.data.Length);
            SaveAssetBundle2(Path.GetFileName(url), request);
        }
    }

    /// <summary>
    /// 方法1
    /// 存储AssetBundle为本地文件
    /// </summary>
    private void SaveAssetBundle(string fileName, byte[] bytes, int count)
    {
        //创建一个文件信息对象.
        FileInfo fileInfo = new FileInfo(Application.streamingAssetsPath + "//" + fileName);

        //通过文件信息对象的“创建”方法,得到一个文件流对象.
        FileStream fs = fileInfo.Create();

        //通过文件流对象,往这个文件内写入信息.
        //fs.Write(字节数组, 开始位置, 数据长度);
        fs.Write(bytes, 0, count);

        //文件写入存储到硬盘,关闭文件流对象,销毁文件对象.
        fs.Flush();
        fs.Close();
        fs.Dispose();

        Debug.Log(fileName + "下载完毕");
    }

    /// <summary>
    /// 方法2
    /// 存储AssetBundle为本地文件
    /// </summary>
    private void SaveAssetBundle2(string fileName, UnityWebRequest request)
    {
        //构造文件流.
        FileStream fs = File.Create(Application.streamingAssetsPath + "//" + fileName);

        //将字节流写入文件里,request.downloadHandler.data可以获取到下载资源的字节流.
        fs.Write(request.downloadHandler.data, 0, request.downloadHandler.data.Length);

        //文件写入存储到硬盘,关闭文件流对象,销毁文件对象.
        fs.Flush();
        fs.Close();
        fs.Dispose();

        Debug.Log(fileName + "下载完毕");
    }

    /// <summary>
    /// 从本地加载 AB 资源并实例化
    /// </summary>
    private void LoadAssetBundle()
    {
        //从本地加载 AB 资源到内存.
        AssetBundle assetBundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/player1.ab");

        //从 AB 资源中获取资源.
        GameObject player = assetBundle.LoadAsset<GameObject>("Necromancer");

        GameObject.Instantiate<GameObject>(player, Vector3.zero, Quaternion.identity);
    }
}

到了这里,关于Unity 从服务器加载AssetBundle资源写入本地内存,并将下载保存的AB资源从本地内存加载至场景的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Springboot 使用thymeleaf 服务器无法加载resources中的静态资源异常处理

    Springboot使用thymeleaf,并 连接远程数据库 启动时,无法加载resources中的静态资源 浏览器报错 后端启动时报错 前端打开页面时后端报错 打包编译项目,显示找不到js、css、html等静态资源,但本地路径并没有写错,于是我去找编译文件,查看是不是静态资源没有编译到,打开项

    2024年02月04日
    浏览(51)
  • unity unityWebRequest 通过http下载服务器资源

    直接下载不显示进度 显示下载进度 //注册事件的方法 private void OnDownloadAssets()//下载资源 { GameController.Instance.StartCoroutine(DownloadFormServer_IE(url, savePath)); }

    2024年02月21日
    浏览(49)
  • Unity动态加载外部服务器上的FBX模型

    去年某项目需要从后端服务器上加载FBX模型,但是整个项目中只有很少的地方需要用到动态模型替换,并且项目交付后需要外行人员也能轻松上手更换需要动态加载的模型,所以需要实现一个简单的模型打包和动态模型加载功能。 1.创建一个新的脚本,编写如下代码 2.回到

    2024年02月11日
    浏览(49)
  • 【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日
    浏览(30)
  • Unity AssetBundle资源热更插件

    取消 IsEditorMode 勾选: 采用AssetBundle的方式加载游戏内的资源 激活 IsEditorMode 勾选: 使用AssetDatabase.LoadAssetAtPath的方式加载 仅Editor 温馨提示: IsEditorMode 受到宏限制 如果你非 UNITY_EDITOR模式下 ( 当年在真机的时候 ) IsEditorMode强制为False 避免用户打包后忘记关了 新建一个AssetBundl

    2024年02月11日
    浏览(45)
  • Unity-AssetBundle Browser 打包和加载

    进入unity手册中,搜素 Unity Asset Bundle Browser 工具,选择你使用的版本号,根据显示出的操作进行资源导入即可。 注:有的版本可能没有资源链接,可以百度一下有很多。 1、制作预制体(省略)  2、选择一个预制体,在Inspector窗口下方,设置预制体的ab包名(包名只能为小写字

    2024年04月13日
    浏览(37)
  • Unity AssetBundle批量打包、加载(场景、Prefab)完整流程

    1、文章介绍 2、具体思路和写法         (1)AB包的打包         (2)AB包的加载         (3)AB包卸载 3、结语 本篇博客主要起记录和学习作用,简单的介绍一下AB包批量的打包和加载AB包的方式,若各位同学有幸看到本篇博客,希望能够对你有所帮助。 (1)

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

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

    2024年02月06日
    浏览(44)
  • Unity的AssetBundle资源运行内存管理的再次深入思考

      大家好,我是阿赵。   这篇文章我想写了很久,是关于Unity项目使用AssetBundle加载资源时的内存管理的。这篇文章不会分享代码,只是分享思路,思路不一定正确,欢迎讨论。   对于Unity引擎的资源内存管理,我猜很多朋友都存在一定的疑惑。疑惑的点有非常多,包

    2024年03月22日
    浏览(38)
  • Unity中使用AssetBundle打包与加载的注意事项

    一、使用AssetBundle进行打包与加载 个人觉得可以参考以下两篇博客,这个网上相关教程很多,还不明白的可以去百度,或者给我留言。 Unity 打包与加载AssetBundle(加载对应的依赖) Unity中的AssetBundle 二、使用AssetBundle进行加载的时候注意事项: 注意事项一:AssetBundle名字和设置

    2024年02月11日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包