赞
踩
1.TerrainData文件切割成小块以后,分别打包成单独的AssetsBundle文件,如果不对依赖的资源进行bundleName进行设置,就会出现这部分依赖资源重复打包的问题。单独设置bundleName以后,所有依赖的资源都打包成了单独的文件。解决了资源重复打包的问题。
2.资源依赖的信息是记录在.manifest文件里的,但是记录的是绝对路径。因为项目制作过程中是分为1:资源整合项目,2正式工程项目,两个项目来使用的。所以,自动生成的依赖信息不能直接使用。(暂时还没有测试在同一个工程下的自动加载依赖资源的功能。)所以,加载后的地形丢失了所有的贴图和模型资源。为了解决这个问题,先使用了一个最简单粗暴的方式。
将所有的依赖资源设置为相同的bundleName,这样所有的依赖资源就直接打包到了同一个文件中。然后,在地图初始化的时候,首先将依赖资源的ab包读取到内存中。代码如下
- private void LoadWorldMapDepend()
- {
- string url = Application.dataPath + "/Resources/WorldMap/ABS/Windows/worldmapdepend";
-
- AssetBundle assetBundle = AssetBundle.LoadFromFile(url);
- string[] assetsName = assetBundle.GetAllAssetNames();
- for (int i = 0; i < assetsName.Length; i++)
- {
- assetBundle.LoadAsset(assetsName[i]);
- }
- }
这种方式解决了依赖资源无法加载的问题,但是存在的问题也很明显。首先地图切割本身就是因为地图规模的庞大,所以,地图里的依赖资源量一定很大,不加区别的打包到同一个文件,然后全部解压到内存中,会造成严重的内存浪费。所以,后期还要通过其他方式进行优化。初步考虑的方案是,仍然沿用自动生成的.manifest文件,在拷贝文件的过程中,把文本信息中记录的路径信息进行修改,这个方案留在之后进行尝试。
3.(未解决)地形资源在加载的时候,虽然依赖资源都已经可以正常使用,但是仍然会有LogError信息:
TerrainData is missing splat texture index(texture name), make sure it is marked for read/write in the importer.
大量的Console信息输出,也会对性能产生很严重的影响。不知道TerrainData在初始化的时候是怎样的逻辑,所以不好判断产生这个问题的原因。留在以后去解决。
=========================2018.5.22=========================
关于上次遗留方案的尝试记录:
AB文件在打包的时候会生成一个与存储文件夹的名字一致的ab文件,这个文件中包含所有资源之间的依赖关系。可以通过这样的方式加载出来:
- AssetBundle asset = AssetBundle.LoadFromFile(manifestPath);
- manifest = asset.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
可以通过AssetBundleManifest的方法GetAllDependencies(string name)获得特定的ab文件依赖的资源的ab包名字。
新的问题:
1.从AB文件中加载的地形,在编辑器中可以正常应用所需要的贴图资源,打包成PC版以后,贴图资源丢失了。
2.AB文件加载后,在内存中属于非托管的,所以必须调用unload()方法,才能从内存中释放掉。但是依赖资源的ab包加载后如果调用Unload()方法,地形的贴图资源就会丢失。
解决方案:问题1通过查看运行log
第一行提示,shader丢失。原因是项目中除了AB包中的地形文件外,没有其他的Terrain文件,所以在打包的过程中没有对Nature/Terrain/Diffuse的引用。按照提示,把需要的Shader添加到Graphices中就可以了。Editor->Graphics
保存,打包,OK!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。