Unity中Resources资源动态加载知识点详解

一、特殊文件夹

1.工程路径获取

(1)注意

【1】该方式 获取到的路径 一般情况下只在编辑模式下使用
【2】我们不会在实际发布游戏后还使用该路径
【3】游戏发布过后该路径就不存在了 

(2)使用

print(Application.dataPath);

2.Resources 资源文件夹

(1)路径获取

【1】一般不获取,只能使用Resources相关API进行加载
【2】如果硬要获取 可以用工程路径拼接

print(Application.dataPath + "/Resources");

(2)注意

        需要我们自己将创建

(3)作用

【1】需要通过Resources相关API动态加载的资源需要放在其中
【2】该文件夹下所有文件都会被打包出去
【3】打包时Unity会对其压缩加密
【4】该文件夹打包后只读,只能通过Resources相关API加载

3.StreamingAssets 流动资源文件夹

(1)路径获取

 print(Application.streamingAssetsPath);

(2)注意

        需要我们自己将创建

(3)作用

【1】打包出去不会被压缩加密,可以任由我们摆布
【2】移动平台只读,PC平台可读可写
【3】可以放入一些需要自定义动态加载的初始资源

4.persistentDataPath 持久数据文件夹

(1)路径获取

print(Application.persistentDataPath);

(2)注意

        不需要我们自己将创建

(3)作用

【1】固定数据文件夹
【2】所有平台都可读可写
【3】一般用于放置动态下载或者动态创建的文件,游戏中创建或者获取的文件都放在其中

5.Plugins 插件文件夹

 (1)路径获取

        一般不获取

(2)注意

        需要我们自己将创建

(3)作用

【1】插件文件夹
【2】不同平台的插件相关文件放在其中,比如IOS和Android平台

6.Editor 编辑器文件夹

(1)路径获取

【1】一般不获取

【2】如果硬要获取 可以用工程路径拼接

        print(Application.dataPath + "/Editor");

(2)注意

        需要我们自己将创建

(3)作用

【1】编辑器文件夹
【2】开发Unity编辑器时,编辑器相关脚本放在该文件夹中
【3】该文件夹中内容不会被打包出去

7.默认资源文件夹 Standard Assets

(1)路径获取

        一般不获取

(2)注意

        需要我们自己将创建

(3)作用

【1】默认资源文件夹
【2】一般Unity自带资源都放在这个文件夹下
【3】代码和资源优先被编译


二、Resources资源同步加载

1.Resources资源动态加载的作用

(1)通过代码动态加载Resources文件夹下指定路径资源
(2)避免繁琐的拖曳操作

2.常用资源类型

(1)预设体对象——GameObject
(2)音效文件——AudioClip
(3)文本文件——TextAsset
(4)图片文件——Texture
(5)其它类型——需要什么用什么类型

注意:

(1)预设体对象加载需要实例化
(2)其它资源加载一般直接用

3.资源同步加载 普通方法

        在一个工程当中 Resources文件夹 可以有多个 通过API加载时 它会自己去这些同名的Resources文件夹中去找资源打包时 Resources文件夹 里的内容 都会打包在一起

(1)预设体对象

第一步:要去加载预设体的资源文件(本质上 就是加载 配置数据 在内存中)

Object obj = Resources.Load("Cube");

第二步:如果想要在场景上 创建预设体 一定是加载配置文件过后 然后实例化

 Instantiate(obj);

(2)音效资源

第一步:就是加载数据

        Object obj3 = Resources.Load("Music/BKMusic");

第二步:使用数据,我们不需要实例化音效切片,我们只需要把数据赋值到正确的脚本上即可

        audioS.clip = obj3 as AudioClip;
        audioS.Play();

(3)文本资源

        文本资源支持的格式
        .txt
        .xml
        .bytes
        .json
        .html
        .csv
        .....

        TextAsset ta = Resources.Load("Txt/Test") as TextAsset;
        //文本内容
        print(ta.text);
        //字节数据组
        //print(ta.bytes);

(4)图片

tex = Resources.Load("Tex/TestJPG") as Texture;

(5)其它类型 需要什么类型 就用什么类型就行

(6)资源同名怎么办?

Resources.Load加载同名资源时 无法准确加载出你想要的内容

        可以使用另外的API

【1】加载指定类型的资源

tex = Resources.Load("Tex/TestJPG", typeof(Texture)) as Texture;
ta = Resources.Load("Tex/TestJPG", typeof(TextAsset)) as TextAsset;

【2】加载指定名字的所有资源

 Object[] objs = Resources.LoadAll("Tex/TestJPG");
 foreach (Object item in objs)
 {
     if (item is Texture)
     { 

     }
     else if(item is TextAsset)
     {

     }
 }

4.资源同步加载 泛型方法

TextAsset ta2 = Resources.Load<TextAsset>("Tex/TestJPG");
print(ta2.text);

tex = Resources.Load<Texture>("Tex/TestJPG");


三、Resources资源异步加载

1.Resources异步加载是什么?

        Resources异步加载 就是内部新开一个线程进行资源加载 不会造成主线程卡顿

        同步加载中,如果我们加载过大的资源可能会造成程序卡顿。卡顿的原因就是从硬盘上把数据读取到内存中是需要进行计算的。越大的资源耗时越长,就会造成掉帧卡顿

2.Resources异步加载方法

(1)注意

        异步加载 不能马上得到加载的资源 至少要等一帧。

(2)方法

【1】通过异步加载中的完成事件监听 使用加载的资源

ResourceRequest rq = Resources.LoadAsync<Texture>("Tex/TestJPG");
rq.completed += LoadOver;

private void LoadOver( AsyncOperation rq)
{
    print("加载结束");
    //asset 是资源对象 加载完毕过后 就能够得到它
    tex = (rq as ResourceRequest).asset as Texture;
    print(Time.frameCount);
}

【2】通过协程 使用加载的资源

StartCoroutine(Load());

IEnumerator Load()
{
    //迭代器函数 当遇到yield return时  就会 停止执行之后的代码
    //然后 协程协调器 通过得到 返回的值 去判断 下一次执行后面的步骤 将会是何时
    ResourceRequest rq = Resources.LoadAsync<Texture>("Tex/TestJPG");
    print(Time.frameCount);
    //第一部分
    //Unity 自己知道 该返回值 意味着你在异步加载资源 
    //yield return rq;
    //Unity 会自己判断 该资源是否加载完毕了 加载完毕过后 才会继续执行后面的代码
    print(Time.frameCount);
    
    //判断资源是否加载结束
    while(!rq.isDone)
    {
        //打印当前的 加载进度 
        //该进度 不会特别准确 过渡也不是特别明显
        print(rq.progress);
        yield return null;
    }
    tex = rq.asset as Texture;

    //yield return null;
    ////第二部分
    //yield return new WaitForSeconds(2f);
    ////第三部分
}


四、Resources资源卸载

1.Resources重复加载资源会浪费内存吗?

        其实Resources加载一次资源过后,该资源就一直存放在内存中作为缓存,第二次加载时发现缓存中存在该资源,会直接取出来进行使用,所以,多次重复加载不会浪费内存,但是会浪费性能(每次加载都会去查找取出,始终伴随一些性能消耗)

2.如何手动释放掉缓存中的资源

(1)卸载指定资源

语法:Resources.UnloadAsset 方法

注意:该方法 不能释放 GameObject对象,因为它会用于实例化对象,它只能用于一些,不需要实例化的内容,比如 图片 和 音效 文本等等一般情况下,我们很少单独使用它。

GameObject obj = Resources.Load<GameObject>("Cube");
//即使是没有实例化的 GameObject对象也不能进行卸载
Resources.UnloadAsset(obj);

(2)卸载未使用的资源

        一般在过场景时和GC一起使用

Resources.UnloadUnusedAssets();
GC.Collect();

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值