Unity5-ABSystem(三):AssetBundle加载

2023-05-16

  • Unity特殊路径
    • Resources
    • StreamingAssetsPath
    • PersistentDataPath
    • DataPath
  • 同步加载
    • 核心函数
    • 安卓平台下不能同步加载问题
    • 示例
  • 异步加载
    • 核心函数
    • 示例
    • WWW异步加载
  • 资源加载
    • 核心函数

  加载一事,就要先从路径说起了。

Unity特殊路径

  在加载AssetBundle时,要给出AssetBundle文件路径,Unity有很多特殊路径,这里列出部分与加载相关的路径。这些路径在不同平台下是不相同的,并可能包含项目或公司名字。下文中出现的类似myProject、myCompany应换成你工程所对应的名字。

Resources

  Resources文件可以在根目录下,也可以在子目录下,只要叫Resources就好。Resources目录下所有资源将被打包进游戏存放资源的archive中,Resources目录在应用中也就不复存在,但加载时仍使用曾在Resource下的路径。
  该目录下所有资源会被压缩,只读不可写,使用Resources.Load()接口加载。

StreamingAssetsPath

  StreamingAssets目录必须在Assets根目录下,该目录下所有资源也会被打包到游戏里,不同于Resources目录,该目录下的资源不会进行压缩,同样是只读不可写的。Unity基本也没有提供从该路径下直接读取资源的方法,只有www可以加载audioClip、texture和二进制文件。但Unity提供了从该目录加载AssetBundle的方法,我们一般直接在这个目录下存放AssetBundle文件。可以通过Application.streamingAssetsPath访问该路径。
  
  各平台StreamingAssets路径打印:
  Win:E:/myProj/Assets/StreamingAssets
  Mac : /myProj/Assets/StreamingAssets
  Andorid:jar:file:///data/app/com.myCompany.myProj-1/base.apk!/assets
  iOS: /var/containers/Application/E5543D66-83F3-476D-8A8F-49D5332B3763/myProj.app/Data/Raw

PersistentDataPath

  该目录为应用程序沙盒目录,应用程序安装后才会出现。该目录独特之处在于是可写的,所以我们一般将下载的AssetBundle存放于此。使用Application.persistentDataPath访问。
  各平台PersistentDataPath路径打印:
  Win:C:/Users/lodypig/Appdata/LocalLow/myCompany/myProj
  Mac : /Users/lodypig/Library/Application Support/myCompany/myProj
  Andorid:/data/data/com.myCompany.myProj/files
  iOS: /var/mobile/Containers/Data/Appliction/A112252D-6B0E-459Z-9D49-CD3EAC6D47D/Documents

DataPath

  应用程序目录,即Assets目录。使用Appliction.dataPath访问。
  各平台DataPath路径:
  Win:E:/myProj/Assets
  Mac : /myProj/Assets/
  Andorid:/data/app/com.myCompany.myProj-1/base.apk!
  iOS: /var/containers/Application/E5543D66-83F3-476D-8A8F-49D5332B3763/myProj.app/Data


同步加载

核心函数

AssetBundle AssetBundle.LoadFromFile(string path);

安卓平台下不能同步加载问题

  安卓平台下,直接使用Application.streamingAssetsPath进行加载会报cannot open archive的错误,原因是加载时路径不对。可以返回上面看一下,安卓平台下Application.streamingAssetsPath以jar:file://开头,跟其他人都不一样。将这段去掉就能够正常加载。而去掉后等价于Application.dataPath + “!assets”,所以在Android下我们用该路径加载。

示例

public class AssetBundleLoader {
    // 根据不同平台,声明StreamingAssetsPath路径
    public static readonly string STREAMING_ASSET_PATH =
        #if UNITY_ANDROID
             Application.dataPath + "!assets";   // 安卓平台
        #else  
             Application.streamingAssetsPath;  // 其他平台
        #endif

    // 从StreamingAssetsPath加载
    public static AssetBundle LoadFromStreamingAssetsPath(string assetbundle) {
        return AssetBundle.LoadFromFile(STREAMING_ASSET_PATH + "/" + assetbundle);
    }

    // PersistantDataPath加载
    public static AssetBundle LoadFromPersistantDataPath(string assetbundle) {
        return AssetBundle.LoadFromFile(Application.persistentDataPath+ "/" + assetbundle)
    }
}

异步加载

核心函数

AssetBundleCreateRequest AssetBundle.LoadFromFileAsync(string path, uint crc = 0, ulong offset = 0);

示例

public class AssetBundleLoader : MonoBehaviour {
    // 声明StreamingAssetsPath如上
    public static readonly string STREAMING_ASSET_PATH = ...
    // 协程实现
    static IEnumerator LoadAsyncCoroutine(string path, Action<AssetBundle> callback) {
        AssetBundleCreateRequest abcr = AssetBundle.LoadFromFileAsync(path);
        yield return abcr;        
        callback(abcr.assetBundle);
    }

    // 开启协程
    static bool LoadAssetbundleAsync(string finalPath, Action<AssetBundle> callback)
    {
        StartCoroutine(LoadAsyncCoroutine(finalPath, callback));
    }

    // 从StreamingAssetsPath异步加载
    public static AssetBundle LoadFromStreamingAssetsPathAsync(string assetbundle) {
        return LoadAssetbundleAsync(STREAMING_ASSET_PATH + "/" + assetbundle);
    }

    // PersistantDataPath异步加载
    public static AssetBundle LoadFromPersistantDataPathAsync(string assetbundle) {
        return LoadAssetbundleAsync(Application.persistentDataPath+ "/" + assetbundle)
    }
}

WWW异步加载

  除了使用AssetBundle.LoadFromFileAsync外,还可以使用www异步加载AssetBundle。

public class AssetBundleLoader : MonoBehaviour {
    // WWW加载时StreamingAsset各平台路径
    public static readonly string WWW_STREAM_ASSET_PATH =
        #if UNITY_ANDROID
            Application.streamingAssetsPath;      // 路径与上面不同,安卓直接用这个
        #elif 
            "file://" + Application.streamingAssetsPath;  // 反而其他平台加file://
        #endif


    // www协程实现
    static IEnumerator LoadFromWWWCoroutine(string path, Action<AssetBundle> callback)
    {
        WWW www = new WWW(path);
        yield return www;
        callback(www.assetBundle);
        www.Dispose();
        www = null;
    }

    //开启协程
    static bool LoadAssetbundleAsync(string finalPath, Action<AssetBundle> callback)
    {
        StartCoroutine(LoadFromWWWCoroutine(finalPath, callback));
    }

    // 从StreamingAssetsPath异步加载
    public static AssetBundle LoadFromStreamingAssetsPathAsync(string assetbundle) {
        return LoadAssetbundleAsync(STREAMING_ASSET_PATH + "/" + assetbundle);
    }

    // PersistantDataPath异步加载
    public static AssetBundle LoadFromPersistantDataPathAsync(string assetbundle) {
        return LoadAssetbundleAsync(Application.persistentDataPath+ "/" + assetbundle)
}

  以上三种方式都可以从一个完整的StreamingAssetsPath下,加载到一个AssetBundle对象。接着我们要从AssetBundle对象中,加载出可爱的资源们。

资源加载

核心函数

    Object AssetBundle.LoadAsset(string assetName, Type resType);
    AssetBundleRequest AssetBundle.LoadAssetAsync(string assetName, Type resType);

  没什么好说的,上代码吧,看参数名和接口应该就能明白。同样是同步和异步两种方式。

// 同步
public UnityEngine.Object Load(AssetBundle assetbundle, string assetName, Type resType)
{
    return assetBundle.LoadAsset(assetName, resType);
}

// 一部
IEnumerator LoadAssetAsyncCoroutine(AssetBundle ab, string name, Type resType, Action<UnityEngine.Object> callback)
{
        AssetBundleRequest request = ab.LoadAssetAsync(name, resType);   

        // 等待加载完成
        while (!request.isDone)
        {
            yield return false;
        }
    callback(request.asset);   // 回调上层
}

  除了这些外,加载资源还有LoadAllAssetsAsync、LoadAllAssets等方法,加载AssetBundle还有LoadFromMemory、LoadFromMemoryAsync方法。原理类似,不再赘述。详情见Unity官方网站。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity5-ABSystem(三):AssetBundle加载 的相关文章

  • java基础编程案例

    java编程案例 案例一 xff1a 飞机票查看优惠系统案例二 xff1a 获取素数案例三 xff1a 验证码模块案例四 xff1a 数组元素的复制案例五 xff1a 评委打分案例六 xff1a 数字加密程序案例七 xff1a 模拟双色球系
  • Java基础之集合框架--Collections工具类之max()方法

    max 方法一个参数的源码 xff1a public static lt T extends Object amp Comparable lt super T gt gt T max Collection lt extends T gt c
  • python创建一个txt文件

    创建一个txt文件 xff0c 文件名为mytxtfile 并向文件写入msg 注意文件的路径不要错 xff0c 还有文件的格式 创建一个txt文件 xff0c 文件名为mytxtfile 并向文件写入msg def text create
  • Android--Jetpack的使用(一)

    目录 1 ViewModel 2 ViewModel 43 LiveData 3 ViewModel 43 LiveData 43 dataBinding 4 ViewModel 43 SavedStateHandle 43 LiveDat
  • Git 常用命令

    一 Git常用命令 1 配置用户名 xff08 上传代码的用户名 xff09 xff1a git config global user name 34 ljs 34 2 配置用户邮箱 xff08 其他作者联系你的邮箱 xff09 xff1a
  • 游戏开发图书推荐--我读过的技术经典图书

    很多同学问我学游戏开发应该看些什么书 xff0c 我在这里抛砖引玉 xff0c 给一份推荐表 xff0c 希望大家共同提高 由于本人英文不太好 xff0c 推荐的大部书籍都是国人编写的 xff0c 有些经典的外文图书可能是翻译不好 xff0
  • Git中使用.gitignore忽略文件的推送

    1 简介 在使用Git管理自己的代码版本时 xff0c 由于编译生成的中间文件 xff0c Git使用SHA 1算法来对文件进行加密 xff0c 进而得出来一个40位的十六进制加密字符串 325525d8b1f67b5ddd37956a8a

随机推荐

  • AFNetWorking3.0处理请求头和请求内容

    今天要处理用户的相关信息 xff0c 需要在HTTP请求中添加请求头 xff0c 网上大部分资料都是针对AFNetWorking2 0的 xff0c 我用3 0版本实现了相关功能 xff0c 见下面代码 首先是请求的URL xff0c sp
  • chrome浏览器安装插件,提示程序包无效

    chrome浏览器安装插件的时候 xff0c 如果提示 程序包无效 xff1a CRX HEADER INVALID xff0c 导致插件安装不上去 xff0c 这个时候该怎么办呢 xff1f 通常 xff0c 这种错误在chrome浏览器
  • viewpage+radiogroup

    lt xml version 61 34 1 0 34 encoding 61 34 utf 8 34 gt lt LinearLayout xmlns android 61 34 http schemas android com apk
  • 线程执行设置超时时间

    import java util concurrent 记录 xff0c 备忘 线程执行设置超时时间 public class Main2 定义线程池 xff0c 推荐手动创建线程池 xff1a https blog csdn net LL
  • Java集合工具类Collections常用方法详解

    文章目录 1 Collections介绍2 Collections常用方法2 1 reverse 2 2 sort 2 3 swap 2 4 min 和max 2 5 copy 2 6 fill 2 7 replaceAll 2 8 shu
  • 智慧小区智能物业管理系统综合解决方案

    因为传统的办公方式效率低 xff0c 工作强度大 人们需耗费大量的时间和精力去手工处理那些繁杂 重复的工作 xff0c 而手工处理的延时和差错 xff0c 正是现代化管理中应该去除的弊端 又由于物业管理企业的启动基金不足 xff0c 多种经
  • LAMP基础搭建

    目录 一 LAMP 1 LAMP环境 2 组成部分 xff08 1 xff09 Linux xff08 平台 xff09 xff08 2 xff09 Apache xff08 前台 xff09 xff08 3 xff09 Mysq xff0
  • python获取子窗口句柄

    2022 09 17 python获取子窗口句柄 python获取窗口句柄 python获取进程 python获取电脑微信小游戏的窗口句柄 上图为按键精灵的工具 python3 xff0c 简单的获取了下句柄 xff0c 想改改内存的 xf
  • Linux多线程编程(三)-----生产者与消费者(条件变量,信号量)

    Linux多线程编程 xff08 一 xff09 xff1a http blog csdn net llzk article details 55670172 Linux多线程编程 xff08 二 xff09 xff1a http blog
  • 微策略的笔试题

    觉得在收获Offer的季节应该为自己积累些人品了 xff0c 在这里将今天的情况向所有求Offer的童鞋分享下 从上个周末开始反应迟钝的我终于有了些求Offer的感觉 xff0c 几天参加了4场面试 xff0c 基本上没觉得有很大的挑战 x
  • 线程池定时任务添加任务以及停止线程

    最近有个需求 就是项目启动的时候需要创建个线程池去执行 而且有时间周期 而且根绝不同的情况可以随时通过接口停止该线程 1首先创建个线程池 默认核心为10 static ScheduledExecutorService threadPool
  • 冰冻三尺非一日之寒-自学篇 浅谈个人学习方法

    昨晚还在看比赛 xff08 war3 xff09 xff0c 小源跑过来问我明天1024 xff0c 不写篇文章么 xff0c 想想也是 xff0c 1024这也算个热点 xff0c 赶紧来蹭蹭 xff0c 哈 xff0c 开个玩笑 上次谈
  • 【附源码】Java计算机毕业设计社区团购服务系统(程序+LW+部署)

    项目运行 环境配置 xff1a Jdk1 8 43 Tomcat7 0 43 Mysql 43 HBuilderX xff08 Webstorm也行 xff09 43 Eclispe xff08 IntelliJ IDEA Eclispe
  • iOS---iOS10适配iOS当前所有系统的远程推送

    一 iOS推送通知简介 众所周知苹果的推送通知从iOS3开始出现 每一年都会更新一些新的用法 譬如iOS7出现的Silent remote notifications 远程静默推送 iOS8出现的Category 分类 也可称之为快捷回复
  • iOS总结_UI层自我复习总结

    UI层复习笔记 在main文件中 xff0c UIApplicationMain函数一共做了三件事 根据第三个参数创建了一个应用程序对象 默认写nil xff0c 即创建的是UIApplication类型的对象 xff0c 此对象看成是整个
  • 【疯狂造轮子-iOS】JSON转Model系列之一

    1 前言 之前一直看别人的源码 xff0c 虽然对自己提升比较大 xff0c 但毕竟不是自己写的 xff0c 很容易遗忘 这段时间准备自己造一些轮子 xff0c 主要目的还是为了提升自身实力 xff0c 总不能一遇到问题就Google 之前
  • 解决fastboot 刷 system.img 尺寸限制问题

    fastboot S xxxM flash system system img 其中 S 后面为单次上传大小 C platform tools gt fastboot S 300M flash system system img sendi
  • 修改Gnome Terminal窗口的默认大小

    修改Gnome Terminal窗口的默认大小 以前一直比较别扭的是 xff0c Gnome Terminal窗口打开时总那么小 曾经找半天也不知道在哪里改 xff0c 甚至在官方论坛里也没查到 今天偶然间想到那个Preferred App
  • 前端基础练习题

    变量命名规则 xff1a 1 只能由字母 数字 下划线 美元符号组成 xff0c 并且不能以数字开头 2 变量命名要有意义 xff0c 杜绝a01 b0046 3 变量遵循小驼峰规则 第一个单词全小写 xff0c 从第二个单词开始 xff0
  • Unity5-ABSystem(三):AssetBundle加载

    Unity特殊路径 ResourcesStreamingAssetsPathPersistentDataPathDataPath 同步加载 核心函数安卓平台下不能同步加载问题示例 异步加载 核心函数示例WWW异步加载 资源加载 核心函数 加