首先,我们要先知道Unity加载资源一共都有哪些方式进行加载(这里说的资源加载都是怎么把资源从硬盘加载到内存中):
1.Resource
Resource加载是资源加载最基础的方式,通过Resource加载的资源有一些条件和限制:
1.资源一定要放在项目的Resource文件夹下
2.打包时会把资源打在包内,会导致包体增大,而且资源无法热更,想更新资源一定要重新打包
3.Resource内的资源大小有限制,好像最多只能加载2G?
用法:
1 2 |
//加载Resource文件夹下名字叫xxx的资源 Resources.Load<GameObject>("xxx"); |
2.AssetDataBase
AssetDataBase在我们之前做编辑器的时候有用到,可以在编辑器下加载任意路径下的任意资源。
1 2 3 4 5 6 |
//只能在编辑器下使用,真机不行,打包出去也不行 //这里的Path要包含后缀名~要稍微注意下 GameObject go = AssetDatabase.LoadAssetAtPath<GameObject>(path); //加载指定资源所有引用的资源(虽然我还不知道啥资源是带引用资源的,也许是切了很多子图的图片?) AssetDatabase.LoadAllAssetRepresentationsAtPath(mAssetPath); |
3.AssetBundle
AssetBundle算是万能的方案,编辑器下可以用,真机可以用,打包出去也可以用,但是没有完美的方案,AssetBundle的缺点就是使用之前需要把资源打成AB包后才能使用。
1 2 3 4 5 6 |
//要先把AssetBundle加载到内存里 var mAssetBundle = AssetBundle.LoadFromFile(FilePath); //然后再把AB内的资源加载到内存里 mAssetBundle.LoadAsset<GameObject>("xxx"); //如果资源有子资源可以通过这个接口获取子资源信息(也许是切了很多子图的图片) mAssetBundle.LoadAssetWithSubAssets<Sprite>(path) |
4.ResourceManager
目前还没啥需求,只是有几个想法:
1.根据AB的依赖关系Manifest,建立一张AB的查找表
2.加载过的资源可以缓存对应的依赖关系或引用,当资源多次加载时可以省下很多操作步骤
3.加载出的资源可以进行引用计数,根据引用计数决定AB包是否需要卸载
4.编辑器下加载资源可以使用AssetDataBase进行加载,实际打包时使用AB进行加载,同时支持在编辑器下读取AB资源(测试AB)。