在Unity工程,所有的资源存放在Assets目录下,包括脚步、贴图、模型、材质、Prefab等等。
Prefab是Unity提供一个以yaml表示的资源序列化文件。通常我们通过Prefab去整合其他资源来使用。
Unity通过Prefab去存储一个GameObject,GameObject上有多个Compoent以及一些其他属性。
Unity会帮助我们自动化的管理被Prefab依赖到的所有资源的引用,自动加载卸载。
Assets目录
在Assets目录下的资源都可以通过一个Editor接口去加载。
AssetDatabase.LoadAssetAtPath<T>(assetPath)可以加载到这个路径下的资源。
注意这里的assetPath是从Assets目录开始的一个全路径,并且带扩展名。
AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Resources/Model/Cube.prefab");
但在打包的时候只有特定目录的资源才会被打进包。
Resources目录
Resources目录下的资源,以及被该目录下资源引用到的资源都会被打到包里面去。
我们可以通过Resources.Load<T>(path)加载资源。
注意这里的path是相对于Resources目录的相对路径,并且没有扩展名。
// assetPath = "Assets/Resources/Model/Cube.prefab"
Resources.Load<GameObject>("Model/Cube");
StreamingAssets目录
StreamingAssets目录下的资源也会被打倒包里面去,不过Unity不会对这目录下的资源做任何处理。
通常这个目录存放文本、音频、视频、以及AssetBundle。
通过WWW和AssetBundle我们都可以加载在这个目录的AssetBundle资源
注意Android的加载路径需要使用 Application.dataPath+”!assets”来加载
SteamingAssetsPath官方文档
// 通过www加载
string url = System.IO.Path.Combine(Application.streamingAssetsPath, "Cube.assetbundle");
WWW www = new WWW(url);
yield return www;
AssetBundle assetBundle = www.assetBundle as AssetBundle;
// Android平台 AssetBundle加载
string path = string.Format("{0}!assets/Cube.assetbundle", Application.dataPath);
AssetBundle assetBundle2 = AssetBundle.LoadFromFile(path);
// 其他平台 AssetBundle加载
string path2 = System.IO.Path.Combine(Application.streamingAssetsPath, "Cube.assetbundle");
AssetBundle assetBundle3 = AssetBundle.LoadFromFile(path2);
总结
资源管理一直是性能问题的核心,了解Unity对资源加载的设计,设计自己的资源管理器。
同时针对不同平台,不同机型定制对应的资源管理策略。