day20 资源管理
一,Resources类读取资源
1,Resources类
Load 从Resources文件夹加载单个资源(可指定类型)
LoadAll 从Resources文件夹加载多个资源(可指定类型)
LoadAsync 异步从Resources文件夹加载单个资源
UnloadAsset 从内存卸载资源
UnloadUnusedAssets 卸载用不到的资源
2,Resources.Load
//通过名称获取资源
Resources.Load ("glass")
//通过名称获取指定类型的资源
Resources.Load (“glass")
//通过名称获取指定类型的资源
Resources.Load("glass" ,typeof(Texture)) as Texture
void Start()
{ GameObject go = GameObject.CreatePrimitive(PrimitiveType.Plane);
Renderer rend = go.GetComponent();
rend.material.mainTexture = Resources.Load("glass") as Texture; }
3,常见的资源类型
GameObject 预制体
Mateiral 材质
Texture 纹理
Sprite 精灵(小图片)
Shader 着色器
Mesh 网格
AudioClip 音频
二,AssetBundle类打包资源
1,AssetBundle简介
AssetBundle是Unity引擎提供的一种资源压缩文件, 文件扩展名通常为unity3d或assetbundle。
流程:开发者对资源进行打包后上传到网络服务器上, 使用者的客户端从网络上加载资源包,进而获取最新资源。
用途:更新资源(如:游戏封面发生变化);
压缩资源,减少所占空间
特点:资源使用灵活
问题:压缩失败,丢失关联,内存溢出,加载失败...
2,BuildPipeline类
BuildPipeline.BuildAssetBundles 打包资源
outputPath 资源打包的生成路径
assetBundleOptions AssetBundle 打包设置
targetPlatform AssetBundle 目标平台
3, 打包所有:
[MenuItem("AssetsBundle/Build All")]
static void BuildAllAssets()
{
string path = Application.dataPath + "/Test_AssetsBundles";
BuildPipeline.BuildAssetBundles(path,BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows);
AssetDatabase.Refresh();
}
4, 打包单个例子
[MenuItem("AssetsBundle/Build Single")]
static void BuildSingleAssets()
{
string path = Application.dataPath + "/Test_AssetsBundles";
AssetBundleBuild[] builds = new AssetBundleBuild[1];
//打包的名字
builds[0].assetBundleName = "Sphere";
//打包资源的路径
builds[0].assetNames = new string[] { "Assets/Sphere.prefab" }; BuildPipeline.BuildAssetBundles(path,builds,BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows);
AssetDatabase.Refresh();
}
5,依赖
如果资源存在依赖,打包时需连同依赖资源一起打包
三,AssetBundle加载资源
1,加载流程:
资源清单->清单说明->依赖文件->目标文件
2,下载资源清单
//服务器地址
string Cdn = "http://127.0.0.1/";
//额外的清单地址,清单文件名称与它所生成的文件夹名称一致,本例中为
AssetBundles string mUrl = Cdn + "AssetBundles";
//先下载清单
WWW mwww = WWW.LoadFromCacheOrDownload(mUrl, 1);
//等待下载
yield return mwww;
3,下载清单说明Manifest
//获取到清单
AssetBundle mab = mwww.assetBundle;
//找到清单所对应的说明文件Manifest
//字符串为AssetBundleManifest,固定写法
AssetBundleManifest mainfest = (AssetBundleManifest)mab.LoadAsset("AssetBundleManifest");
//暂不销毁资源 mab.Unload(false);
4,下载依赖资源
//需要加载的的资源,例中是一个预设体
string realName = "prefab.redcube";
//获取此资源的依赖文件
string[] dps = mainfest.GetAllDependencies(realName);
//创建依赖资源列表
AssetBundle[] abs = new AssetBundle[dps.Length];
//逐个下载放入列表
for (int i = 0; i < dps.Length; i++)
{
//服务器地址 + 依赖资源名称
string dUrl = Cdn + dps[i];
//下载依赖资源
WWW dwww = WWW.LoadFromCacheOrDownload(dUrl, mainfest.GetAssetBundleHash(dps[i])); //等待下载
yield return dwww;
//导入列表
abs[i] = dwww.assetBundle;
//获取所有资源(调试使用)
object[] o = abs[i].LoadAllAssets();
//打印依赖资源名称验证(调试使用)
Debug.Log((o[0] as Material).name); }
5,下载目标资源
//依赖资源下载完毕之后,下载主资源
WWW www = WWW.LoadFromCacheOrDownload(Cdn + realName, mainfest.GetAssetBundleHash(realName));
//等待下载
yield return www;
//异常处理
if (!string.IsNullOrEmpty(www.error))
{ Debug.Log(www.error); }
else {
//获取资源
AssetBundle ab = www.assetBundle;
//获取所有资源
object[] oo = ab.LoadAllAssets();
//获取预设体
GameObject gobj = oo[0] as GameObject;
if (gobj != null)
//加载当场景
Instantiate(gobj);
//暂不销毁资源
ab.Unload(false); }
//暂不销毁依赖资源,方便下面继续使用,如果不在需要可以销毁
foreach (AssetBundle ab in abs)
{
//暂不销毁资源
ab.Unload(false);
}
例子:切换场景
IEnumerator loadscene()
{
string path = "file://" + Application.dataPath + "/Test_AssetsBundles/scene01";
WWW sceneTask = WWW.LoadFromCacheOrDownload(path, 0);
yield return sceneTask;
//获取sceneTask的AssetBundle,把场景加载到内存中
AssetBundle ab = sceneTask.assetBundle;
//跳转到01场景
AsyncOperation operation = SceneManager.LoadSceneAsync("01");
sceneTask.Dispose();
}