Resources资源同步加载与异步加载

Resources资源同步加载

Resources资源动态加载的作用

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

常用资源类型

预设体对象——GameObject
 音效文件——AudioClip
 文本文件——TextAsset
 图片文件——Texture
 其它类型——需要什么用什么类型
  注意:预设体对象加载需要实例化,其它资源加载一般直接用。

资源同步加载普通方法

用Resources.Load()方法可以加载Resources文件夹下的资源,其中参数传入的是资源名称(如果Resources下面还有文件夹,用”/”分割文件名和资源名称)
注意:在一个工程当中 Resources文件夹可以有多个。通过API加载时它会自己去这些同名的Resources文件夹中去找资源。打包时 Resources文件夹 里的内容 都会打包在一起

(1)加载预设体对象
第一步:把预设体资源文件加载出来(本质上就是把预制体的配置数据加载到内存中去)
Object obj = Resources.Load(“Cube”);
第二步:如果想要在场景上创建这个预制体,加载之后还要实例化
Instantiate(obj);

(2)加载音效资源
第一步:加载数据

Object BGM = Resources.Load("Music/BackgroundMusic");//Music是文件夹名

第二步:使用音频数据,我们不需要实例化加载的AudioClip, 我们只需要把数据赋值给相应的AudioSource音乐播放组件。

audioSource.clip = BGM as AudioClip; 
 audioSource.Play();

(3)加载文本资源
Resources.Load能够加载的文本文件格式:.txt、xml、bytes、json、html、csv
加载数据:
TextAsset ta = Resources.Load("Txt/Test") as TextAsset;
获取文本内容 ta.text
获取文本的字节数组 ta.bytes

(4)资源同名怎么办
Resources.Load加载同名资源时,无法准确加载出你想要的内容,但可以用第二个参数去指定资源的类型,比如

		tex = Resources.Load("Tex/TestJPG", typeof(Texture)) as Texture;//加载名为TestJPG的图片资源
		
		ta = Resources.Load("Tex/TestJPG", typeof(TextAsset)) as TextAsset; /加载名为TestJPG的文本资源

(5)加载指定名字的所有资源

        Object[] objs = Resources.LoadAll("Tex/TestJPG");

资源同步加载泛型方法

在之前的内容中,Resources.Load加载出来的资源类型都是Object类型,使用时需要用as去做强制转换。
这种方式比较笨拙。我们可以使用泛型同步加载的方法,在方法调用时就用泛型参数指定好加载资源的类型。

  		 TextAsset ta2 = Resources.Load("Tex/TestJPG");

上面的代码加载了类型为TextAsset的资源TestJPG,通过泛型程序会帮我们找到指定类型的资源,并且返回的数据也是你指定的类型。这样就省去了用as强制转换的步骤。所以这种方式会更加常用。

Resources资源异步加载

Resources异步加载是什么、

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

Resources异步加载方法

注意:异步加载 不能马上得到加载的资源 至少要等一帧。
异步加载有两种方法:
(1)通过异步加载中的完成事件监听使用加载的资源
Resources资源同步加载与异步加载_第1张图片

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

(2)通过协程使用加载的资源

void Start(){
	StartCoroution(Load());
}

Resources资源同步加载与异步加载_第2张图片
使用协程函数去加载资源可以在加载过程中的每一帧去做一些关于资源加载的处理(例如显示加载的进度等)
Resources资源同步加载与异步加载_第3张图片

两种异步加载方式的优缺点
1.完成事件监听异步加载
好处:写法简单
坏处:只能在资源加载结束后 进行处理
类似于线性加载

 2.协程异步加载
    好处:可以在协程中处理复杂逻辑,比如同时加载多个资源,比如进度条更新
    坏处:写法稍麻烦
    类似于并行加载

资源卸载

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

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

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

(1)卸载指定资源:
Resources.UnloadAsset 方法
注意:
该方法不能释放GameObject对象。因为它会用于实例化对象。
它只能用于一些 不需要实例化的内容。比如图片、音效、文本等等
一般情况下,我们很少单独使用它。
(2)卸载未使用的资源
Resources.UnloadUnusedAssets
注意:
一般在过场景时和GC一起使用
Resources.UnloadUnusedAssets();
动手实践:Ctrl+7打开Unity调试面板,查看资源加载后的内存大小和资源卸载后的内存大小。

你可能感兴趣的:(Unity引擎,c#,unity,游戏程序)