Resources资源加载
Contents
Resources资源加载
- 通过代码动态加载Resources文件夹下指定路径资源
- 在一个工程中 Resources文件夹可以有多个 打包时所有Resources文件夹里的资源都会被整合在一起
- 避免繁琐的拖拽操作
常用的资源类型
- 预设体对象 GameObject
- 预设图对象加载需要实例化 其他资源加载一般可以直接用
- 音效文件 AudioClip
- 文本文件 TestAsset
- 图片文件 Texture
- 其他类型 需要什么就用什么类型
资源加载 普通方法
Object obj = Resources.Load("Cube");
Resources.load<GameObject>("Cube");//泛型Resources异步加载资源
- 异步加载不能马上得到加载的资源 至少要等一帧
- 异步加载就是内部新开一个线程进行资源加载 不会造成主线程卡顿
ResourceRequest rq = Resources.LoadAsync<GameObject>("路径");
//在加载完成后 会调用completed事件 参数AsyncOperation
rq.completed += LoadOver;
private void LoadOver( AsyncOperation rq)
{
print("加载结束");
//asset 是资源对象 加载完毕过后 就能够得到它
obj = (rq as ResourceRequest).asset as GameObject;
}通过携程加载资源
StartCoroutine(Load());
IEnumerator Load()
{
ResourceRequest rq = Resources.LoadAsync<GameObject>("路径");
//携程返回值yield return asyncOperation;等异步操作结束后再执行后续代码
//ResourceRequest继承自asyncOperation
//yield return rq;判断资源是否加载结束
while(!rq.isDone)
{
//打印当前的 加载进度
//该进度 不会特别准确 过渡也不是特别明显
print(rq.progress);
yield return null;
}
obj = rq.asset as GameObject;
}卸载资源
- 该方法不能释放GameObject对象 因为他会用于实例化对象
- 只能用于一些 不需要实例化的内容 图片 音效 文本等等
- 一般情况下很少单独使用它
var tex = Resources.Load<Testure>("Tex/TestJPG");
Resources.UnloadAsset(tex);卸载未使用的资源
//一般在过场景时和GC一起使用
Resources.UnloadUnusedAssets();
GC.Clollect();异步加载场景
AsyncOperation ao = SceneManager.LoadSceneAsync("场景名");
ao.completed +=(a)=>{
Debug.log("场景加载完了");
}通过携程异步加载场景
在加载场景时 unity会删除当前场景下所有的对象,携程脚本依附的物体如果被删除 那么携程就不会执行了所以需要特殊处理
IEnumerator LoadScene(string name)
{
//第一步
//异步加载场景
AsyncOperation ao = SceneManager.LoadSceneAsync(name);
//Unity内部的 协程协调器 发现是异步加载类型的返回对象 那么就会等待
//等待异步加载结束后 才会继续执行 迭代器函数中后面的步骤
print("异步加载过程中 打印的信息");
//协程的好处 是异步加载场景时 我可以在加载的同时 做一些别的逻辑
while(!ao.isDone)
{
print(ao.progress);
yield return null;
}
}