unity资源加载
打包的资源
- Android
所有资源打包在 unityLibrary\src\main\assets\bin\Data\data.unity3d- 场景存放在 level[n]
- 共享资源存放在 sharedassets[n].asset
- Resources文件夹下的资源存放在 resources.asset
- iOS
- 场景存放在 Data\level[n]
- 共享资源存放在 sharedassets[0].asset
- Resources文件夹下的资源存放在 resources.asset
Resources.Load
-
参考 Unity User Manual (2019.4 LTS)/Working in Unity/资源工作流程/Scripting with Assets/在运行时加载资源
-
目的
在游戏运行时根据需要动态加载资源,注意资源还是在安装包中 -
原理
根据creator推测其原理是unity内部对每个资源分配uid,打包时是用uid替换文件路径,
如果文件在Resources下则会把uid和原始文件路径的映射关系保存在一个配置文件中,
加载时先把路径映射成uid,再用uid加载文件 -
资源配置
在Project下的任意文件夹中创建的Resources文件夹,其下的文件如果被场景引用,将打包进sharedassets[level].assets
否则所有Resources文件夹下的资源将被打包成resources.assets,
因此不同目录下的Resources文件夹下的资源最好有不同的路径,以免冲突 -
资源加载
在运行时用Resources.Load动态加载,要用相对Resources的路径,且不带扩展名
如:Assets/Resources/a/glass.png或Assets/MyResource/Resources/a/glass.png
在运行时都是用Resources.Load(“a/glass”,typeof(Texture2D) as Texture2D来加载 -
资源卸载
Resources.UnloadAsset不会卸载资源,要用UnloadUnusedAssets -
查找脚本
Resources.FindObjectsOfTypeAll
Streaming Assets
-
目的
直接使用原始文件,比如视频文件,有些播放器需要直接使用文件路径去访问 -
原理
位于 StreamingAssets 目录下的文件将不进行打包操作,以原始文件路径直接存储 -
资源配置
在Assets目录下建一目录StreamingAssets,把资源放到该目录下 -
资源加载
目标机器的StreamingAssets目录 Application.streamingAssetsPath 跟平台有关:- Editor 或 win Application.streamingAssetsPath = Application.dataPath + “/StreamingAssets”;
- ios 平台 Application.streamingAssetsPath = Application.dataPath + “/Raw”
- android 平台 Application.streamingAssetsPath = “jar:file://” + Application.dataPath + “!/assets”
存储在压缩文件中,必须使用 UnityWebRequest 加载文件 - webGL 平台没有权限访问
- 其它平台直接使用:
GameObject cam = GameObject.Find("Main Camera"); videoPlayer = cam.AddComponent<UnityEngine.Video.VideoPlayer>(); // Obtain the location of the video clip. videoPlayer.url = Path.Combine(Application.streamingAssetsPath, "SampleVideo_1280x720_5mb.mp4");
AssetBundle
-
参考 Unity User Manual (2019.4 LTS)/Working in Unity/资源工作流程/AssetBundle
-
目的
把一些资源打包成一个文件,可以从外部进行加载,外部可以通过从网络下载的方式来实现更新 -
资源配置
参考 Unity User Manual (2019.4 LTS)/Working in Unity/资源工作流程/AssetBundle/AssetBundle 工作流程
5.x版本对生成assetBundle进行一定的支持,在每个资源的属性窗口右下角 AssetBundle 栏有2个选项- 左边选择该资源所属分组(也就是包名),支持目录结构用"/"
- 右边选择变体名称(也就是包的后缀名,不能是预留的txt rar等,需要才加不需要留空)
包名和后缀名相同的资源会打在同一个包里, - 注意相同包名的要么都有后缀,要么都没有后缀,不能同时存在 aaa 和 aaa.abb
- 注意如果文件夹设置包名,该文件夹下没设置包名的资源将被打进文件夹所在包名
-
资源打包
参考 Unity User Manual (2019.4 LTS)/Working in Unity/资源工作流程/AssetBundle/构建 AssetBundle-
资源分组后可以执行下面脚本将各资源分组打包并放入目标目录,目标目录是以工程路径(Assets的上一层)为相对目录
// 将这段代码放到 Assets/Editor/XXX.cs 中 // 通过 菜单Assets->Build AssetBundles 执行 [MenuItem("Assets/Build AssetBundles")] static void BuildAllAssetBundles() { // 打包输出目录 string assetBundleDirectory = "Assets/AssetBundleOut"; if (!Directory.Exists(assetBundleDirectory)) { Directory.CreateDirectory
-