3、资源编辑器篇 -- 资源构建器(ResourceBuilder) 打包 资源信息 基于GF (EllanJiang / GameFramework)
GameFramework框架链接: https://github.com/EllanJiang/GameFramework
Tips:
1、在 1 资源收集器 的基础上
2、在 2 资源分析器 的基础上
3、准备需要构建的信息
3.1、从资源收集器中获取Resource资源信息
Resource[] resources = m_ResourceCollection.GetResources();
3.2、添加资源信息到 m_ResourceDatas
foreach (Resource resource in resources)
{
m_ResourceDatas.Add(resource.FullName, new ResourceData(resource.Name, resource.Variant, resource.FileSystem, resource.LoadType, resource.Packed, resource.GetResourceGroups(), resource.AssetCategory));
}
3.3、从资源管理器中获取Asset资源信息
Asset[] assets = m_ResourceCollection.GetAssets();
3.4、循环asset信息,从 资源分线器中 读取每个asset 的 独立资源信息,添加独立信息到list中
List<string> dependencyAssetNames = new List<string>();
DependencyData dependencyData = m_ResourceAnalyzerController.GetDependencyData(assetName);
Asset[] dependencyAssets = dependencyData.GetDependencyAssets();
foreach (Asset dependencyAsset in dependencyAssets)
{
dependencyAssetNames.Add(dependencyAsset.Name);
}
dependencyAssetNames.Sort();
3.5、同时,往指定Resource资源信息中添加 其对应包含的 asset 信息
m_ResourceDatas[asset.Resource.FullName].AddAssetData(asset.Guid, assetName, assetBytes.Length, assetHashCode, dependencyAssetNames.ToArray());
3.6、循环 m_ResourceDatas 信息,返回 对应的 Asset Bundle 构建信息 、资源信息,字节流资源信息 。
assetBundleBuildDatas = assetBundleBuildDataList.ToArray();
assetBundleResourceDatas = assetBundleResourceDataList.ToArray();
binaryResourceDatas = binaryResourceDataList.ToArray();
4、BuildResources 构建资源包信息,指定打包平台
4.1、删除原有的 .manifest 后缀的 文件
4.2、获取 AssetBundleManifest,这边 需要避免 编辑器模式相关 代码,否则 打包报错
AssetBundleManifest assetBundleManifest = BuildPipeline.BuildAssetBundles(workingPath, assetBundleBuildDatas, buildAssetBundleOptions, GetBuildTarget(platform));
(当前GF 项目代码中 编辑部分 未包含文件信息 相关选项,4.3 可以先不看,后续资源更新部分,会重新讲到新的编辑器代码部分,和文件流相关操作 )
4.3、创建文件块,这边不考虑单机这种情况,
if (OutputPackedSelected)
{
CreateFileSystems(GetPackedResourceDatas(), outputPackedPath, m_OutputPackedFileSystems);
}
4.3.1、从 资源收集器中 获取 资源信息的 是packed(只读包)的数据
GetPackedResourceDatas()
4.3.2、从 打包资源数据中 获取 FileSystem 字段分类值,获取 文件块 字符数组信息
string[] fileSystemNames = GetFileSystemNames(resourceDatas);
4.3.3、获取 文件系统管理器,并设置 文件信息读取帮助
m_FileSystemManager = EntityBuiltin.GetModule<IFileSystemManager>();
m_FileSystemManager.SetFileSystemHelper(new FileSystemHelper());
4.3.4、循环每个文件块,获取 打包资源数据中,当前文件块 关联的 资源信息 索引顺序 和 个数,创建文件块 指定文件夹,同时创建 对应 文件流,用于写入文件信息
4.4、处理AssetBundles(assetBundleResourceDatas)信息
4.4.1、获取AB 资源完整路径名称,根据名称 获取 对应的ResourceData 资源信息,拼接项目路径,得到文件 完成路径信息,获取文件字节流信息,生成hashcode等相关信息,判断是否需要加密,这部分代码可以重新设计,GF使用了异或(自行处理),写文件到指定位置,是否需要压缩,资源加密(自行处理)
4.4.2、添加信息到m_code 用于后续 版本信息文件创建
m_Codes.Add(new ResourceCode(platform, length, hashCode, zipLength, zipHashCode, assetCategory));
4.5、二进制这边不做处理,默认不适应,相关数据获取,在dataprovider 和 datatable 组件会重新讲到
4.6、创建 versionList相关信息(这边需要对代码进行调整 ,对应序列化和反序列化相关处理文件也需要调整)
VersionListData versionListData = ProcessUpdatableVersionList(outputFullPath, platform);
4.7、创建 只读区List相关信息(这边需要对代码进行调整 ,对应序列化和反序列化相关处理文件也需要调整)
ProcessReadOnlyVersionList(outputPackedPath, platform);
4.8、把构建信息 存到 Mongodb 中, 省去 version.txt 额外编辑