QuarkAsset是一套轻量级的插件化Unity资源加载方案。 内置AssetDatabae与AssetBundle加载模式。加载模式皆支持引用计数,可实时查看资源信息。快速开发阶段可采用AssetDatabase模式,无需进行ab构建。调试阶段可采用AssetBundle模式,轻松构建ab资源。在构建ab时,支持对资源的加密。在Runtime加载资源时,可通过对应的密钥对资源进行解密。支持编辑内对包体分割,有效控制颗粒度。支持查看ab的依赖关系。内置BuildPipeline,可通过命令行实现自动化资源构建。支持构建预设,可版本控制构建profile预设。Jenkins自动化部署测试已通过。
QuarkAsset是完全插件化的unity库,文件夹结构遵循unityPackage规范。
UPM本地导入。选择Assets/QuarkAsset文件夹,拷贝到工程目录的Packages目录下,完成导入。
UPM从git导入。url链接: https://github.com/DonnYep/QuarkAsset.git#upm
Quark编辑器打开路径为Window>QuarkAsset>QuarkAssetEdior
。
为实现团队协作,且灵活配置资源,Quark采用了scriptableObject
作为资源寻址配置。
配置文件可在Quark的编辑器最上方,点击CreateDataset
生成。
为方便阐述,下文统一采用dataset
称呼Quark的资源寻址配置。
Quark编辑器一共含三个选项卡,分别为:AssetDatabaseTab
、AssetBundleTab
与AssetDatasetTab
。
AssetDatabaseTab
用于为dataset
设置assetbundle与生成资源寻址信息.
AssetBundleTab
用于为dataset
生成assetbundle资源与相关处理。
AssetDatasetTab
用于为dataset
设置可识别的文件后缀名。
此页面显示dataset中包含的AssetBundle信息。
每一条bundle信息都可通过点击右键生成的菜单进行操作。
每一条object信息都可通过点击右键生成的菜单进行操作。
Mark as splittable
选择bundle,点击右键显示菜单,点击"Mark as splittable"选项,被选中的bundle会被标记为可分割的bundle,点击"Build"按钮,刷新信息。
分割bundle的逻辑为,若bundle存在子文件夹,则第一级的子文件夹被标记为新的bundle,在构建bundle时会生成新的bundle,同时父级bundle则不会再构建。
Splittable
与Extract
是互斥的。即Splittable为true时,Extract无法为true,反之亦然。
Mark as extract
选择bundle,点击右键显示菜单,点击"Mark as extract"选项,被选中的bundle会被标记为可分割的bundle,点击"Build"按钮,刷新信息。
当bundle被标记为Extract时,此bundle下的所有资源对象都将作为独立的assetbundle
进行构建。此功能适用于变更频繁的资产。
Extract
与Splittable
是互斥的。即Extract为true时,Splittable无法为true,反之亦然。
此Tab用于ab打包操作。
打包ab时需要选择ab所对应的平台。若需要拷贝到streamingAssets文件夹,则勾选CopyToStreamingAssets选项。
打包ab配置有两种选择,第一种是使用本地设置
,第二种是使用构建预设
。
本地设置
指打包ab的配置存储在本地设备。配置无法对其进行版本管理。构建预设
指生成一个预设文件,可以在不同机器上使用相同的配置进行ab打包,且可以被版本控制管理。配置打包设置时,在更改需要变更的参数后,其余参数推荐使用默认值。
Use build profile
选项,勾选后切换为预设构建。+
按钮,生成一个构建预设。QuarkConfig
脚本。QuarkAssetDataset
赋予build好的dataset,即完成配置。AssetBundle模式下默认采用StreamingAssets路径加载。
若build后的ab文件处于StreamingAssets目录下的其他路径,勾选EnableRelativeBuildPath
选项。勾选EnableRelativeBuildPath
表示为采用StreamingAssets
目录下的相对路径进行加载,需要在RelativeBuildPath
中填入相对路径的地址。
若在资源构建阶段进行了加密,则在Encryption折叠选项下填入对应的密钥与数字,Quark会在runtime自动解密。
QuarkRuntime加载资源会自动计算引用计数,并根据引用计数加载或卸载assetbundle,无需手动管理ab资源。
using Quark;
using Quark.Asset;
using System.IO;
using UnityEngine;
public class MyLauncher : MonoBehaviour
{
/// <summary>
/// QuarkAssetLoadMode下AssetDatabase模式所需的寻址数据。
/// <see cref="Quark.QuarkLoadMode"/>
/// </summary>
[SerializeField] QuarkDataset quarkDataset;
/// <summary>
/// ab Build 的相对地址。
/// </summary>
[SerializeField] string streamingRelativeBuildPath;
/// <summary>
/// 对称加密密钥。
/// </summary>
[SerializeField] string manifestAesKey;
/// <summary>
/// 加密偏移量。
/// </summary>
[SerializeField] ulong encryptionOffset;
private void Start()
{
//根据需要调用函数
}
void LanchAssetBundleMode()
{
//以AssetBundle模式启动
var myPath = Path.Combine(Application.streamingAssetsPath, streamingRelativeBuildPath);
QuarkResources.LaunchAssetBundleMode(myPath, () =>
{
//启动成功,进入游戏逻辑
}, (errorMsg) =>
{
//启动失败,处理异常
}, manifestAesKey, encryptionOffset);
}
void LanchAssetDatabaseMode()
{
//以AssetDatabase(unity editor 调试)模式启动。
QuarkResources.LaunchAssetDatabaseMode(quarkDataset, () =>
{
//启动成功,进入游戏逻辑
}, (errorMsg) =>
{
//启动失败,处理异常
});
}
}
Quark的运行时类为为QuarkResources
。
加载资源时输入的名称可采用以下三种范式:
加载&卸载时请注意以下内容:
var myAudio = QuarkResources.LoadAsset<AudioClip>("MyAudio");// 资源名加载
var myText = QuarkResources.LoadAsset<TextAsset>("MyText.json");//资源名.后缀名加载
var myTexture = QuarkResources.LoadAsset<Texture>("Assets/Textures/MyTexture.png");//完整路径加载。注意路径需要采用 / ,\\不支持!
QuarkResources.LoadAssetAsync<AudioClip>("MyAudio",res=>
//加载完成回调,获取资源, do sth
});
QuarkResources.LoadAssetAsync<TextAsset>("MyText.json",res=>
{
//加载完成回调,获取资源, do sth
});
QuarkResources.LoadAssetAsync<Texture>("Assets/Textures/MyTexture.png",res=>
{
//加载完成回调,获取资源, do sth
});
//异步加载场景
QuarkResources.LoadSceneAsync("MyScene",progress=>{Debug.Log(progress);},()=>{Debug.Log("Load Done");},false);
//资源名卸载单个资源
QuarkResources.UnloadAsset("MyAudio");
//资源名.后缀卸载单个资源
QuarkResources.UnloadAsset("MyText.json");
//资源路径卸载单个资源
QuarkResources.UnloadAsset("Assets/Textures/MyTexture.png");
//卸载场景
QuarkResources.UnloadSceneAsync("MyScene",progress=>{Debug.Log(progress);},()=>{Debug.Log("Unload Done"));
//卸载assetbundle
QuarkResources.UnloadAssetBundle("MyBundle",true);
//获取单个资源的状态信息
QuarkResources.GetObjectInfo(myAssetName, out var info);
//获取一个包体的状态信息
QuarkResources.GetBundleInfo(myBundleName, out var info);
Assets/QuarkAssetDataset.asset
//打包指定平台的资源
QuarkBuildPipeline.BuildAssetBundle(BuildTarget buildTarget);
//通过预设进行构建
QuarkBuildPipeline.BuildAssetBundleByProfile(string datasetPath, string buildProfilePath);
QuarkBuildPipeline.cs
类。Quark支持母包内嵌加热更下载。
目前支持StreamingAssets与persistentdatapath地址的同时加载。
QuarkUtility.Manifest.MergeManifest(srcManifest,diffManifest,out var mergedManifest);