Update document
|
@ -1,6 +1,6 @@
|
||||||
# 资源构建
|
# 资源构建
|
||||||
|
|
||||||
![image](./Image/AssetBuilder-img1.png)
|
![image](./Image/AssetBuilder-img1.jpg)
|
||||||
|
|
||||||
### 界面介绍
|
### 界面介绍
|
||||||
|
|
||||||
|
@ -50,9 +50,7 @@
|
||||||
|
|
||||||
HashName:哈希值
|
HashName:哈希值
|
||||||
|
|
||||||
HashName_Extension:哈希值+后缀名
|
BundleName_HashName:资源包名+哈希值
|
||||||
|
|
||||||
HashName_BundleName_Extension:资源包名+哈希值+后缀名
|
|
||||||
|
|
||||||
- **Copy Buildin File Option**
|
- **Copy Buildin File Option**
|
||||||
|
|
||||||
|
@ -78,17 +76,23 @@
|
||||||
|
|
||||||
补丁包文件夹里包含补丁清单文件,资源包文件,构建报告文件等。
|
补丁包文件夹里包含补丁清单文件,资源包文件,构建报告文件等。
|
||||||
|
|
||||||
![image](./Image/AssetBuilder-img4.png)
|
![image](./Image/AssetBuilder-img2.jpg)
|
||||||
|
|
||||||
### 补丁清单
|
### 补丁清单
|
||||||
|
|
||||||
补丁清单是一个Json格式的文本文件。
|
补丁清单文件是上图中以PatchManifest开头命名的文件。
|
||||||
|
|
||||||
AssetList组记录的是主资源对象列表。
|
- PatchManifest_DefaultPackage_xxxxxx.hash
|
||||||
|
|
||||||
BundleList组记录的是资源包列表。
|
记录了补丁清单文件的哈希值。
|
||||||
|
|
||||||
![image](./Image/AssetBuilder-img2.png)
|
- PatchManifest_DefaultPackage_xxxxxx.json
|
||||||
|
|
||||||
|
该文件为Json文本格式,主要用于开发者预览信息。
|
||||||
|
|
||||||
|
- PatchManifest_DefaultPackage_xxxxxx.bytes
|
||||||
|
|
||||||
|
该文件为二进制格式,主要用于程序内读取加载。
|
||||||
|
|
||||||
### Jenkins支持
|
### Jenkins支持
|
||||||
|
|
||||||
|
@ -109,10 +113,10 @@ private static void BuildInternal(BuildTarget buildTarget)
|
||||||
buildParameters.BuildPipeline = EBuildPipeline.BuiltinBuildPipeline;
|
buildParameters.BuildPipeline = EBuildPipeline.BuiltinBuildPipeline;
|
||||||
buildParameters.BuildMode = EBuildMode.ForceRebuild;
|
buildParameters.BuildMode = EBuildMode.ForceRebuild;
|
||||||
buildParameters.PackageName = "DefaultPackage";
|
buildParameters.PackageName = "DefaultPackage";
|
||||||
buildParameters.PackageVersion = "1.0.0";
|
buildParameters.PackageVersion = "1.0";
|
||||||
buildParameters.VerifyBuildingResult = true;
|
buildParameters.VerifyBuildingResult = true;
|
||||||
buildParameters.CompressOption = ECompressOption.LZ4;
|
buildParameters.CompressOption = ECompressOption.LZ4;
|
||||||
buildParameters.OutputNameStyle = EOutputNameStyle.HashName_Extension;
|
buildParameters.OutputNameStyle = EOutputNameStyle.HashName;
|
||||||
buildParameters.CopyBuildinFileOption = ECopyBuildinFileOption.None;
|
buildParameters.CopyBuildinFileOption = ECopyBuildinFileOption.None;
|
||||||
|
|
||||||
// 执行构建
|
// 执行构建
|
||||||
|
@ -122,6 +126,10 @@ private static void BuildInternal(BuildTarget buildTarget)
|
||||||
{
|
{
|
||||||
Debug.Log($"构建成功 : {buildResult.OutputPackageDirectory}");
|
Debug.Log($"构建成功 : {buildResult.OutputPackageDirectory}");
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.LogError($"构建失败 : {buildResult.FailedInfo}");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 从构建命令里获取参数示例
|
// 从构建命令里获取参数示例
|
||||||
|
|
|
@ -1,10 +1,14 @@
|
||||||
# 资源收集
|
# 资源收集
|
||||||
|
|
||||||
![image](./Image/AssetCollector-img1.png)
|
![image](./Image/AssetCollector-img1.jpg)
|
||||||
|
|
||||||
左侧为分组列表,右侧为该分组的配置界面。
|
左侧为分组列表,右侧为该分组的配置界面。
|
||||||
|
|
||||||
导出按钮可以将配置数据导出为XML文件,导入按钮可以导入保存的XML文件。
|
导入按钮:可以导入保存的XML文件。
|
||||||
|
|
||||||
|
导出按钮:可以将配置数据导出为XML文件。
|
||||||
|
|
||||||
|
修复按钮:在配置里的文件夹挪动位置之后,可以通过该按钮按钮来修正。
|
||||||
|
|
||||||
**注意**:该工具仅支持Unity2019.4+
|
**注意**:该工具仅支持Unity2019.4+
|
||||||
|
|
||||||
|
@ -13,11 +17,15 @@
|
||||||
- Show Packages
|
- Show Packages
|
||||||
|
|
||||||
是否展示资源包列表视图。
|
是否展示资源包列表视图。
|
||||||
|
|
||||||
|
- Show Editor Alias
|
||||||
|
|
||||||
|
是否显示为中文模式。
|
||||||
|
|
||||||
- Enable Addressable
|
- Enable Addressable
|
||||||
|
|
||||||
启用可寻址资源定位系统。
|
启用可寻址资源定位系统。
|
||||||
|
|
||||||
- Unique Bundle Name
|
- Unique Bundle Name
|
||||||
|
|
||||||
资源包名追加PackageName作为前缀。
|
资源包名追加PackageName作为前缀。
|
||||||
|
@ -36,10 +44,10 @@
|
||||||
//自定义扩展范例
|
//自定义扩展范例
|
||||||
public class DisableGroup : IActiveRule
|
public class DisableGroup : IActiveRule
|
||||||
{
|
{
|
||||||
public bool IsActiveGroup()
|
public bool IsActiveGroup()
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
````
|
````
|
||||||
|
|
||||||
|
@ -83,18 +91,18 @@
|
||||||
|
|
||||||
- AddressByFileName 以文件名为定位地址。
|
- AddressByFileName 以文件名为定位地址。
|
||||||
|
|
||||||
- AddressByGrouperAndFileName 以分组名称+文件名为定位地址。
|
- AddressByGrouperAndFileName 以分组名+文件名为定位地址。
|
||||||
|
|
||||||
- AddressByCollectorAndFileName 以收集器名+文件名为定位地址。
|
- AddressByFolderAndFileName 以文件夹名+文件名为定位地址。
|
||||||
|
|
||||||
````c#
|
````c#
|
||||||
//自定义扩展范例
|
//自定义扩展范例
|
||||||
public class AddressByFileName : IAddressRule
|
public class AddressByFileName : IAddressRule
|
||||||
{
|
{
|
||||||
string IAddressRule.GetAssetAddress(AddressRuleData data)
|
string IAddressRule.GetAssetAddress(AddressRuleData data)
|
||||||
{
|
{
|
||||||
return Path.GetFileNameWithoutExtension(data.AssetPath);
|
return Path.GetFileNameWithoutExtension(data.AssetPath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
````
|
````
|
||||||
|
|
||||||
|
@ -102,21 +110,28 @@
|
||||||
|
|
||||||
打包规则,规则可以自定义扩展。下面是内置规则:
|
打包规则,规则可以自定义扩展。下面是内置规则:
|
||||||
|
|
||||||
- PackSeparately 以收集文件路径作为资源包名,每个资源文件单独打包。
|
- PackSeparately 以文件路径作为资源包名,每个资源文件单独打包。
|
||||||
- PackDirectory 以收集文件所在的文件夹路径作为资源包名,该文件夹下所有文件打进一个资源包。
|
- PackDirectory 以文件所在的文件夹路径作为资源包名,该文件夹下所有文件打进一个资源包。
|
||||||
- PackTopDirectory 以收集器路径下顶级文件夹为资源包名,该文件夹下所有文件打进一个资源包。
|
- PackTopDirectory 以收集器下顶级文件夹为资源包名,该文件夹下所有文件打进一个资源包。
|
||||||
- PackCollector 以收集器路径作为资源包名,收集的所有文件打进一个资源包。
|
- PackCollector 以收集器路径作为资源包名,收集的所有文件打进一个资源包。
|
||||||
- PackGrouper 以分组名称作为资源包名,收集的所有文件打进一个资源包。
|
- PackGroup 以分组名称作为资源包名,收集的所有文件打进一个资源包。
|
||||||
- PackRawFile 目录下的资源文件会被处理为原生资源包。
|
- PackRawFile 目录下的资源文件会被处理为原生资源包。
|
||||||
|
|
||||||
````c#
|
````c#
|
||||||
//自定义扩展范例
|
//自定义扩展范例
|
||||||
public class PackDirectory : IPackRule
|
public class PackDirectory : IPackRule
|
||||||
{
|
{
|
||||||
string IPackRule.GetBundleName(PackRuleData data)
|
PackRuleResult IPackRule.GetBundleName(PackRuleData data)
|
||||||
{
|
{
|
||||||
return Path.GetDirectoryName(data.AssetPath); //"Assets/Config/test.txt" --> "Assets/Config"
|
//"Assets/Config/test.txt" --> "Assets/Config"
|
||||||
}
|
string bundleName = Path.GetDirectoryName(data.AssetPath);
|
||||||
|
PackRuleResult result = new PackRuleResult(bundleName, DefaultPackRule.AssetBundleFileExtension);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
bool IPackRule.IsRawFilePackRule()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
````
|
````
|
||||||
|
|
||||||
|
@ -133,13 +148,17 @@
|
||||||
//自定义扩展范例
|
//自定义扩展范例
|
||||||
public class CollectScene : IFilterRule
|
public class CollectScene : IFilterRule
|
||||||
{
|
{
|
||||||
public bool IsCollectAsset(FilterRuleData data)
|
public bool IsCollectAsset(FilterRuleData data)
|
||||||
{
|
{
|
||||||
return Path.GetExtension(data.AssetPath) == ".unity";
|
return Path.GetExtension(data.AssetPath) == ".unity";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
````
|
````
|
||||||
|
|
||||||
|
- **UserData**
|
||||||
|
|
||||||
|
用户自定义数据,可以帮助定制化AddressRule和PackRule。
|
||||||
|
|
||||||
- **AssetTags**
|
- **AssetTags**
|
||||||
|
|
||||||
资源分类标签列表,该收集器下收集的资源会全部被打上该标签。
|
资源分类标签列表,该收集器下收集的资源会全部被打上该标签。
|
||||||
|
|
|
@ -4,22 +4,40 @@
|
||||||
|
|
||||||
如果是本地测试,可以在本地创建一个WEB服务器,然后将补丁包拷贝到WEB服务器下。
|
如果是本地测试,可以在本地创建一个WEB服务器,然后将补丁包拷贝到WEB服务器下。
|
||||||
|
|
||||||
**按照游戏版本目录部署**
|
**部署目录**
|
||||||
|
|
||||||
在业务开发过程中,每个游戏版本实际都会创建一个SVN分支,该分支工程内每次构建的补丁包上传到对应的CDN目录下即可。
|
在业务开发过程中,发版本之前都会创建一个SVN或GIT分支,以分支工程为基础去构建APP。
|
||||||
|
|
||||||
````
|
````
|
||||||
CDN
|
CDN
|
||||||
└─android
|
└─android
|
||||||
├─v1.0
|
├─v1.0(APP版本)
|
||||||
├─v1.1
|
├─v1.1(APP版本)
|
||||||
└─v2.0
|
└─v2.0(APP版本)
|
||||||
└─iphone
|
└─iphone
|
||||||
├─v1.0
|
├─v1.0(APP版本)
|
||||||
├─v1.1
|
├─v1.1(APP版本)
|
||||||
└─v2.0
|
└─v2.0(APP版本)
|
||||||
````
|
````
|
||||||
|
|
||||||
**游戏版本说明**
|
**APP版本说明**
|
||||||
|
|
||||||
|
v1.0 代表的是APP版本,不是资源版本。在没有更换安装包的情况下,不需要新增加APP版本目录。
|
||||||
|
|
||||||
|
例如:我们游戏的当前APP版本是v1.0,那么每次生成的补丁文件全部覆盖到v1.0的目录下即可。
|
||||||
|
|
||||||
|
下面的示例里一共上传过2次补丁包。第二次上传的补丁包会把第一次的版本记录文件(PatchManifest_DefaultPackage.version)覆盖掉。当我们想回退资源版本的时候,把第一次生成的版本记录文件覆盖到同目录下即可。
|
||||||
|
|
||||||
|
````
|
||||||
|
v1.0(游戏版本)
|
||||||
|
├─PatchManifest_DefaultPackage.version
|
||||||
|
├─PatchManifest_DefaultPackage_2023-02-01-654.hash
|
||||||
|
├─PatchManifest_DefaultPackage_2023-02-01-654.bytes
|
||||||
|
├─PatchManifest_DefaultPackage_2023-02-12-789.hash
|
||||||
|
├─PatchManifest_DefaultPackage_2023-02-12-789.bytes
|
||||||
|
├─2bb5a28d37dabf27df8bc6a4706b8f80.bundle
|
||||||
|
├─2dbea9c3056c8839bc03d80a2aebd105.bundle
|
||||||
|
├─6e8c3003a64ead36a0bd2d5cdebfbcf4.bundle
|
||||||
|
...
|
||||||
|
````
|
||||||
|
|
||||||
v1.0 代表的是游戏版本,不是资源版本。在没有更换安装包的前提下,不需要递增这个游戏版本。每次生成的补丁包只需要覆盖掉当前游戏版本目录下即可。
|
|
||||||
|
|
|
@ -73,15 +73,17 @@ private class QueryStreamingAssetsFileServices : IQueryServices
|
||||||
{
|
{
|
||||||
public bool QueryStreamingAssets(string fileName)
|
public bool QueryStreamingAssets(string fileName)
|
||||||
{
|
{
|
||||||
// 注意:使用了BetterStreamingAssets插件,使用前需要初始化该插件!
|
// StreamingAssetsHelper.cs是太空战机里提供的一个查询脚本。
|
||||||
string buildinFolderName = YooAssets.GetStreamingAssetBuildinFolderName();
|
string buildinFolderName = YooAssets.GetStreamingAssetBuildinFolderName();
|
||||||
return BetterStreamingAssets.FileExists($"{buildinFolderName}/{fileName}");
|
return StreamingAssetsHelper.FileExists($"{buildinFolderName}/{fileName}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
````
|
````
|
||||||
|
|
||||||
### 源代码解析
|
### 源代码解析
|
||||||
|
|
||||||
|
Package.InitializeAsync()方法解析。
|
||||||
|
|
||||||
- 编辑器模拟模式
|
- 编辑器模拟模式
|
||||||
|
|
||||||
每次启动调用EditorSimulateModeHelper.SimulateBuild()方法,都会在底层执行一次模拟构建(Simulate Build)。
|
每次启动调用EditorSimulateModeHelper.SimulateBuild()方法,都会在底层执行一次模拟构建(Simulate Build)。
|
||||||
|
@ -90,11 +92,11 @@ private class QueryStreamingAssetsFileServices : IQueryServices
|
||||||
|
|
||||||
- 单机运行模式
|
- 单机运行模式
|
||||||
|
|
||||||
在初始化的时候,会直接读取内置清单文件(StreamingAssets文件夹里的文件),最后根据加载的清单去验证沙盒里缓存的文件。
|
在初始化的时候,会直接读取内置清单文件(StreamingAssets文件夹里的文件),最后初始化缓存系统。
|
||||||
|
|
||||||
- 联机运行模式
|
- 联机运行模式
|
||||||
|
|
||||||
在初始化的时候,会优先从沙盒里加载清单,如果沙盒里不存在,则会尝试加载内置清单并将其拷贝到沙盒里。最后根据加载的清单去验证沙盒里缓存的文件。
|
在初始化的时候,会优先从沙盒里加载清单,如果沙盒里不存在,则会尝试加载内置清单并将其拷贝到沙盒里。最后初始化缓存系统。
|
||||||
|
|
||||||
**注意**:如果沙盒清单和内置清单都不存在,初始化也会被判定为成功!
|
**注意**:如果沙盒清单和内置清单都不存在,初始化也会被判定为成功!
|
||||||
|
|
||||||
|
|
|
@ -16,8 +16,8 @@ private IEnumerator UpdateStaticVersion()
|
||||||
if (operation.Status == EOperationStatus.Succeed)
|
if (operation.Status == EOperationStatus.Succeed)
|
||||||
{
|
{
|
||||||
//更新成功
|
//更新成功
|
||||||
string PackageVersion = operation.PackageVersion;
|
string packageVersion = operation.PackageVersion;
|
||||||
Debug.Log($"Updated package Version : {PackageVersion}");
|
Debug.Log($"Updated package Version : {packageVersion}");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -66,7 +66,7 @@ private IEnumerator UpdatePatchManifest()
|
||||||
|
|
||||||
用于下载更新资源标签指定的资源包文件。
|
用于下载更新资源标签指定的资源包文件。
|
||||||
|
|
||||||
- YooAssets.CreateBundleDownloader(string[] locations, int downloadingMaxNumber, int failedTryAgain, int timeout)
|
- YooAssets.CreateBundleDownloader(AssetInfo[] assetInfos, int downloadingMaxNumber, int failedTryAgain, int timeout)
|
||||||
|
|
||||||
用于下载更新指定的资源列表依赖的资源包文件。
|
用于下载更新指定的资源列表依赖的资源包文件。
|
||||||
|
|
||||||
|
@ -131,25 +131,37 @@ private IEnumerator Start()
|
||||||
// 如果获取远端资源版本失败,说明当前网络无连接。
|
// 如果获取远端资源版本失败,说明当前网络无连接。
|
||||||
// 在正常开始游戏之前,需要验证本地清单内容的完整性。
|
// 在正常开始游戏之前,需要验证本地清单内容的完整性。
|
||||||
string packageVersion = package.GetPackageVersion();
|
string packageVersion = package.GetPackageVersion();
|
||||||
var operation = package.CheckPackageContentsAsync(packageVersion);
|
var operation = package.PreDownloadPackageAsync(packageVersion);
|
||||||
yield return operation;
|
yield return operation;
|
||||||
if (operation.Status == EOperationStatus.Succeed)
|
if (operation.Status != EOperationStatus.Succeed)
|
||||||
{
|
{
|
||||||
StartGame();
|
ShowMessageBox("请检查本地网络,有新的游戏内容需要更新!");
|
||||||
|
yield break;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
int downloadingMaxNum = 10;
|
||||||
|
int failedTryAgain = 3;
|
||||||
|
int timeout = 60;
|
||||||
|
var downloader = operation.CreatePatchDownloader(downloadingMaxNum, failedTryAgain, timeout);
|
||||||
|
if (downloader.TotalDownloadCount > 0)
|
||||||
{
|
{
|
||||||
// 资源内容本地并不完整,需要提示玩家联网更新。
|
// 资源内容本地并不完整,需要提示玩家联网更新。
|
||||||
ShowMessageBox("请检查本地网络,有新的游戏内容需要更新!");
|
ShowMessageBox("请检查本地网络,有新的游戏内容需要更新!");
|
||||||
|
yield break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 开始游戏
|
||||||
|
StartGame();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
````
|
````
|
||||||
|
|
||||||
### 源代码解析
|
### 源代码解析
|
||||||
|
|
||||||
|
Package.UpdatePackageManifestAsync()方法解析。
|
||||||
|
|
||||||
- 联机运行模式
|
- 联机运行模式
|
||||||
|
|
||||||
UpdatePackageManifestAsync()为资源清单更新方法。该方法的内部实现原理如下:
|
通过传入的清单版本,优先比对当前激活清单的版本,如果相同就直接返回成功。如果有差异就从缓存里去查找匹配的清单,如果缓存里不存在,就去远端下载并保存到沙盒里。最后加载沙盒内匹配的清单文件。
|
||||||
|
|
||||||
![image](./Image/CodeTutorial2-img1.png)
|
|
||||||
|
|
|
@ -6,7 +6,9 @@
|
||||||
- LoadAssetAsync() 异步加载资源对象
|
- LoadAssetAsync() 异步加载资源对象
|
||||||
- LoadSubAssetsSync() 同步加载子资源对象
|
- LoadSubAssetsSync() 同步加载子资源对象
|
||||||
- LoadSubAssetsAsync() 异步加载子资源对象
|
- LoadSubAssetsAsync() 异步加载子资源对象
|
||||||
|
- LoadSceneSync() 同步加载场景
|
||||||
- LoadSceneAsync() 异步加载场景
|
- LoadSceneAsync() 异步加载场景
|
||||||
|
- LoadRawFileSync() 同步获取原生文件
|
||||||
- LoadRawFileAsync() 异步获取原生文件
|
- LoadRawFileAsync() 异步获取原生文件
|
||||||
|
|
||||||
**统一约定**
|
**统一约定**
|
||||||
|
@ -152,6 +154,7 @@ IEnumerator Start()
|
||||||
yield return handle;
|
yield return handle;
|
||||||
byte[] fileData = handle.GetRawFileData();
|
byte[] fileData = handle.GetRawFileData();
|
||||||
string fileText = handle.GetRawFileText();
|
string fileText = handle.GetRawFileText();
|
||||||
|
string filePath = handle.GetRawFilePath();
|
||||||
}
|
}
|
||||||
````
|
````
|
||||||
|
|
||||||
|
@ -160,7 +163,7 @@ IEnumerator Start()
|
||||||
通过资源标签来获取资源信息列表。
|
通过资源标签来获取资源信息列表。
|
||||||
|
|
||||||
````c#
|
````c#
|
||||||
private GetAssetInfosByTag(string tag)
|
void GetAssetInfosByTag(string tag)
|
||||||
{
|
{
|
||||||
AssetInfo[] assetInfos = package.GetAssetInfos(tag);
|
AssetInfo[] assetInfos = package.GetAssetInfos(tag);
|
||||||
foreach (var assetInfo in assetInfos)
|
foreach (var assetInfo in assetInfos)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# 全局配置
|
# 全局配置
|
||||||
|
|
||||||
![image](./Image/Settings-img1.png)
|
![image](./Image/Settings-img1.jpg)
|
||||||
|
|
||||||
通过右键创建配置文件(Project窗体内右键 -> Create -> YooAsset -> Create Setting)
|
通过右键创建配置文件(Project窗体内右键 -> Create -> YooAsset -> Create Setting)
|
||||||
|
|
||||||
|
@ -8,7 +8,5 @@
|
||||||
|
|
||||||
配置说明:
|
配置说明:
|
||||||
|
|
||||||
- **Asset Bundle File Variant** : AssetBundle资源包后缀名
|
|
||||||
- **Raw File Variant** : 原生资源包后缀名
|
|
||||||
- **Patch Manifest File Name** : 补丁清单文件名称
|
- **Patch Manifest File Name** : 补丁清单文件名称
|
||||||
|
|
||||||
|
|
After Width: | Height: | Size: 60 KiB |
Before Width: | Height: | Size: 46 KiB |
After Width: | Height: | Size: 89 KiB |
Before Width: | Height: | Size: 74 KiB |
Before Width: | Height: | Size: 48 KiB |
After Width: | Height: | Size: 166 KiB |
Before Width: | Height: | Size: 88 KiB |
Before Width: | Height: | Size: 32 KiB |
After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 21 KiB |
After Width: | Height: | Size: 44 KiB |
Before Width: | Height: | Size: 26 KiB |
|
@ -1,6 +1,6 @@
|
||||||
# 着色器变种收集
|
# 着色器变种收集
|
||||||
|
|
||||||
![image](./Image/ShaderVariantCollector-img1.png)
|
![image](./Image/ShaderVariantCollector-img1.jpg)
|
||||||
|
|
||||||
点击搜集变种按钮开始收集,请耐心等待结束。
|
点击搜集变种按钮开始收集,请耐心等待结束。
|
||||||
|
|
||||||
|
|