一、特殊文件夹
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();
974

被折叠的 条评论
为什么被折叠?



