欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

3、资源编辑器篇 -- 资源构建器(ResourceBuilder) 打包 资源信息 基于GF (EllanJiang / GameFramework)

程序员文章站 2022-07-14 11:17:50
...

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 额外编辑

 

3、资源编辑器篇 -- 资源构建器(ResourceBuilder) 打包 资源信息 基于GF (EllanJiang / GameFramework)