diff --git a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateManifest.cs b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateManifest.cs
index b026ff35..a23dd021 100644
--- a/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateManifest.cs
+++ b/Assets/YooAsset/Editor/AssetBundleBuilder/BuildPipeline/BaseTasks/TaskCreateManifest.cs
@@ -30,7 +30,7 @@ namespace YooAsset.Editor
// 创建新补丁清单
PackageManifest manifest = new PackageManifest();
- manifest.FileVersion = YooAssetSettings.ManifestFileVersion;
+ manifest.FileVersion = ManifestDefine.FileVersion;
manifest.EnableAddressable = buildMapContext.Command.EnableAddressable;
manifest.LocationToLower = buildMapContext.Command.LocationToLower;
manifest.IncludeAssetGUID = buildMapContext.Command.IncludeAssetGUID;
diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/CatalogDefine.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/CatalogDefine.cs
new file mode 100644
index 00000000..918e7718
--- /dev/null
+++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/CatalogDefine.cs
@@ -0,0 +1,21 @@
+
+namespace YooAsset
+{
+ internal class CatalogDefine
+ {
+ ///
+ /// 文件极限大小(100MB)
+ ///
+ public const int FileMaxSize = 104857600;
+
+ ///
+ /// 文件头标记
+ ///
+ public const uint FileSign = 0x133C5EE;
+
+ ///
+ /// 文件格式版本
+ ///
+ public const string FileVersion = "1.0.0";
+ }
+}
\ No newline at end of file
diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/CatalogDefine.cs.meta b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/CatalogDefine.cs.meta
new file mode 100644
index 00000000..f03166e5
--- /dev/null
+++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/CatalogDefine.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: c6be7b8be0b51784997c959b370193e9
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/CatalogTools.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/CatalogTools.cs
new file mode 100644
index 00000000..0d45e132
--- /dev/null
+++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/CatalogTools.cs
@@ -0,0 +1,102 @@
+using System;
+using System.IO;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace YooAsset
+{
+ internal static class CatalogTools
+ {
+ ///
+ /// 序列化(JSON文件)
+ ///
+ public static void SerializeToJson(string savePath, DefaultBuildinFileCatalog catalog)
+ {
+ string json = JsonUtility.ToJson(catalog, true);
+ FileUtility.WriteAllText(savePath, json);
+ }
+
+ ///
+ /// 反序列化(JSON文件)
+ ///
+ public static DefaultBuildinFileCatalog DeserializeFromJson(string jsonContent)
+ {
+ return JsonUtility.FromJson(jsonContent);
+ }
+
+ ///
+ /// 序列化(二进制文件)
+ ///
+ public static void SerializeToBinary(string savePath, DefaultBuildinFileCatalog catalog)
+ {
+ using (FileStream fs = new FileStream(savePath, FileMode.Create))
+ {
+ // 创建缓存器
+ BufferWriter buffer = new BufferWriter(CatalogDefine.FileMaxSize);
+
+ // 写入文件标记
+ buffer.WriteUInt32(CatalogDefine.FileSign);
+
+ // 写入文件版本
+ buffer.WriteUTF8(CatalogDefine.FileVersion);
+
+ // 写入文件头信息
+ buffer.WriteUTF8(catalog.PackageName);
+ buffer.WriteUTF8(catalog.PackageVersion);
+
+ // 写入资源包列表
+ buffer.WriteInt32(catalog.Wrappers.Count);
+ for (int i = 0; i < catalog.Wrappers.Count; i++)
+ {
+ var fileWrapper = catalog.Wrappers[i];
+ buffer.WriteUTF8(fileWrapper.BundleGUID);
+ buffer.WriteUTF8(fileWrapper.FileName);
+ }
+
+ // 写入文件流
+ buffer.WriteToStream(fs);
+ fs.Flush();
+ }
+ }
+
+ ///
+ /// 反序列化(二进制文件)
+ ///
+ public static DefaultBuildinFileCatalog DeserializeFromBinary(byte[] binaryData)
+ {
+ // 创建缓存器
+ BufferReader buffer = new BufferReader(binaryData);
+
+ // 读取文件标记
+ uint fileSign = buffer.ReadUInt32();
+ if (fileSign != CatalogDefine.FileSign)
+ throw new Exception("Invalid catalog file !");
+
+ // 读取文件版本
+ string fileVersion = buffer.ReadUTF8();
+ if (fileVersion != CatalogDefine.FileVersion)
+ throw new Exception($"The catalog file version are not compatible : {fileVersion} != {CatalogDefine.FileVersion}");
+
+ DefaultBuildinFileCatalog catalog = new DefaultBuildinFileCatalog();
+ {
+ // 读取文件头信息
+ catalog.FileVersion = fileVersion;
+ catalog.PackageName = buffer.ReadUTF8();
+ catalog.PackageVersion = buffer.ReadUTF8();
+
+ // 读取资源包列表
+ int fileCount = buffer.ReadInt32();
+ catalog.Wrappers = new List(fileCount);
+ for (int i = 0; i < fileCount; i++)
+ {
+ var fileWrapper = new DefaultBuildinFileCatalog.FileWrapper();
+ fileWrapper.BundleGUID = buffer.ReadUTF8();
+ fileWrapper.FileName = buffer.ReadUTF8();
+ catalog.Wrappers.Add(fileWrapper);
+ }
+ }
+
+ return catalog;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/CatalogTools.cs.meta b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/CatalogTools.cs.meta
new file mode 100644
index 00000000..ca5dd4b7
--- /dev/null
+++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/CatalogTools.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: cf87ffe3b3de69942ac16640a330dd37
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileCatalog.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileCatalog.cs
index aad797bf..6c59e986 100644
--- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileCatalog.cs
+++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileCatalog.cs
@@ -15,14 +15,13 @@ namespace YooAsset
{
public string BundleGUID;
public string FileName;
-
- public FileWrapper(string bundleGUID, string fileName)
- {
- BundleGUID = bundleGUID;
- FileName = fileName;
- }
}
+ ///
+ /// 文件版本
+ ///
+ public string FileVersion;
+
///
/// 包裹名称
///
diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs
index 06ea1ae6..313a739e 100644
--- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs
+++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystem.cs
@@ -336,9 +336,9 @@ namespace YooAsset
string fileName = YooAssetSettingsData.GetManifestBinaryFileName(PackageName, packageVersion);
return PathUtility.Combine(_packageRoot, fileName);
}
- public string GetCatalogFileLoadPath()
+ public string GetCatalogBinaryFileLoadPath()
{
- return PathUtility.Combine(_packageRoot, DefaultBuildinFileSystemDefine.BuildinCatalogFileName);
+ return PathUtility.Combine(_packageRoot, DefaultBuildinFileSystemDefine.BuildinCatalogBinaryFileName);
}
///
diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemBuild.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemBuild.cs
index c5a76264..8ac5b494 100644
--- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemBuild.cs
+++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemBuild.cs
@@ -84,6 +84,7 @@ namespace YooAsset
// 创建内置清单实例
var buildinFileCatalog = new DefaultBuildinFileCatalog();
+ buildinFileCatalog.FileVersion = CatalogDefine.FileVersion;
buildinFileCatalog.PackageName = packageName;
buildinFileCatalog.PackageVersion = packageVersion;
@@ -97,7 +98,8 @@ namespace YooAsset
$"{packageName}_{packageVersion}.hash",
$"{packageName}_{packageVersion}.json",
$"{packageName}_{packageVersion}.report",
- DefaultBuildinFileSystemDefine.BuildinCatalogFileName
+ DefaultBuildinFileSystemDefine.BuildinCatalogJsonFileName,
+ DefaultBuildinFileSystemDefine.BuildinCatalogBinaryFileName
};
// 记录所有内置资源文件
@@ -114,7 +116,9 @@ namespace YooAsset
string fileName = fileInfo.Name;
if (fileMapping.TryGetValue(fileName, out string bundleGUID))
{
- var wrapper = new DefaultBuildinFileCatalog.FileWrapper(bundleGUID, fileName);
+ var wrapper = new DefaultBuildinFileCatalog.FileWrapper();
+ wrapper.BundleGUID = bundleGUID;
+ wrapper.FileName = fileName;
buildinFileCatalog.Wrappers.Add(wrapper);
}
else
@@ -123,16 +127,20 @@ namespace YooAsset
}
}
- // 创建输出目录
- string saveFilePath = $"{pacakgeDirectory}/{DefaultBuildinFileSystemDefine.BuildinCatalogFileName}";
- if (File.Exists(saveFilePath))
- File.Delete(saveFilePath);
-
// 创建输出文件
- File.WriteAllText(saveFilePath, JsonUtility.ToJson(buildinFileCatalog, false));
- UnityEditor.AssetDatabase.Refresh();
+ string jsonFilePath = $"{pacakgeDirectory}/{DefaultBuildinFileSystemDefine.BuildinCatalogJsonFileName}";
+ if (File.Exists(jsonFilePath))
+ File.Delete(jsonFilePath);
+ CatalogTools.SerializeToJson(jsonFilePath, buildinFileCatalog);
- Debug.Log($"Succeed to save buildin file catalog : {saveFilePath}");
+ // 创建输出文件
+ string binaryFilePath = $"{pacakgeDirectory}/{DefaultBuildinFileSystemDefine.BuildinCatalogBinaryFileName}";
+ if (File.Exists(binaryFilePath))
+ File.Delete(binaryFilePath);
+ CatalogTools.SerializeToBinary(binaryFilePath, buildinFileCatalog);
+
+ UnityEditor.AssetDatabase.Refresh();
+ Debug.Log($"Succeed to save buildin file catalog : {binaryFilePath}");
return true;
}
}
diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemDefine.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemDefine.cs
index 5a70375b..59a67980 100644
--- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemDefine.cs
+++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/DefaultBuildinFileSystemDefine.cs
@@ -4,8 +4,13 @@ namespace YooAsset
internal class DefaultBuildinFileSystemDefine
{
///
- /// 内置清单文件名称
+ /// 内置清单JSON文件名称
///
- public const string BuildinCatalogFileName = "BuildinCatalog.json";
+ public const string BuildinCatalogJsonFileName = "BuildinCatalog.json";
+
+ ///
+ /// 内置清单二进制文件名称
+ ///
+ public const string BuildinCatalogBinaryFileName = "BuildinCatalog.bytes";
}
}
\ No newline at end of file
diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/LoadBuildinCatalogFileOperation.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/LoadBuildinCatalogFileOperation.cs
index 2cd635cb..08ba4196 100644
--- a/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/LoadBuildinCatalogFileOperation.cs
+++ b/Assets/YooAsset/Runtime/FileSystem/DefaultBuildinFileSystem/Operation/internal/LoadBuildinCatalogFileOperation.cs
@@ -1,5 +1,4 @@
using System;
-using UnityEngine;
namespace YooAsset
{
@@ -14,10 +13,8 @@ namespace YooAsset
}
private readonly DefaultBuildinFileSystem _fileSystem;
- private UnityWebTextRequestOperation _webTextRequestOp;
+ private UnityWebDataRequestOperation _webDataRequestOp;
private ESteps _steps = ESteps.None;
- private string _textData = null;
-
internal LoadBuildinCatalogFileOperation(DefaultBuildinFileSystem fileSystem)
{
@@ -34,45 +31,36 @@ namespace YooAsset
if (_steps == ESteps.RequestData)
{
- if (_webTextRequestOp == null)
+ if (_webDataRequestOp == null)
{
- string filePath = _fileSystem.GetCatalogFileLoadPath();
+ string filePath = _fileSystem.GetCatalogBinaryFileLoadPath();
string url = DownloadSystemHelper.ConvertToWWWPath(filePath);
- _webTextRequestOp = new UnityWebTextRequestOperation(url);
- _webTextRequestOp.StartOperation();
- AddChildOperation(_webTextRequestOp);
+ _webDataRequestOp = new UnityWebDataRequestOperation(url);
+ _webDataRequestOp.StartOperation();
+ AddChildOperation(_webDataRequestOp);
}
- _webTextRequestOp.UpdateOperation();
- if (_webTextRequestOp.IsDone == false)
+ _webDataRequestOp.UpdateOperation();
+ if (_webDataRequestOp.IsDone == false)
return;
- if (_webTextRequestOp.Status == EOperationStatus.Succeed)
+ if (_webDataRequestOp.Status == EOperationStatus.Succeed)
{
_steps = ESteps.LoadCatalog;
- _textData = _webTextRequestOp.Result;
}
else
{
_steps = ESteps.Done;
Status = EOperationStatus.Failed;
- Error = _webTextRequestOp.Error;
+ Error = _webDataRequestOp.Error;
}
}
if (_steps == ESteps.LoadCatalog)
{
- if (string.IsNullOrEmpty(_textData))
- {
- _steps = ESteps.Done;
- Status = EOperationStatus.Failed;
- Error = $"Buildin catalog file content is empty !";
- return;
- }
-
try
{
- var catalog = JsonUtility.FromJson(_textData);
+ var catalog = CatalogTools.DeserializeFromBinary(_webDataRequestOp.Result);
if (catalog.PackageName != _fileSystem.PackageName)
{
_steps = ESteps.Done;
diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/DefaultWebServerFileSystem.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/DefaultWebServerFileSystem.cs
index b632a628..22d9b5d8 100644
--- a/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/DefaultWebServerFileSystem.cs
+++ b/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/DefaultWebServerFileSystem.cs
@@ -198,9 +198,9 @@ namespace YooAsset
string fileName = YooAssetSettingsData.GetManifestBinaryFileName(PackageName, packageVersion);
return PathUtility.Combine(FileRoot, fileName);
}
- public string GetCatalogFileLoadPath()
+ public string GetCatalogBinaryFileLoadPath()
{
- return PathUtility.Combine(_webPackageRoot, DefaultBuildinFileSystemDefine.BuildinCatalogFileName);
+ return PathUtility.Combine(_webPackageRoot, DefaultBuildinFileSystemDefine.BuildinCatalogBinaryFileName);
}
///
diff --git a/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/Operation/internal/LoadWebServerCatalogFileOperation.cs b/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/Operation/internal/LoadWebServerCatalogFileOperation.cs
index 93cf1482..d9aaeb64 100644
--- a/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/Operation/internal/LoadWebServerCatalogFileOperation.cs
+++ b/Assets/YooAsset/Runtime/FileSystem/DefaultWebServerFileSystem/Operation/internal/LoadWebServerCatalogFileOperation.cs
@@ -2,7 +2,6 @@
using System.IO;
using System.Collections;
using System.Collections.Generic;
-using UnityEngine;
namespace YooAsset
{
@@ -17,9 +16,8 @@ namespace YooAsset
}
private readonly DefaultWebServerFileSystem _fileSystem;
- private UnityWebTextRequestOperation _webTextRequestOp;
+ private UnityWebDataRequestOperation _webDataRequestOp;
private ESteps _steps = ESteps.None;
- private string _textData = null;
internal LoadWebServerCatalogFileOperation(DefaultWebServerFileSystem fileSystem)
{
@@ -36,45 +34,36 @@ namespace YooAsset
if (_steps == ESteps.RequestData)
{
- if (_webTextRequestOp == null)
+ if (_webDataRequestOp == null)
{
- string filePath = _fileSystem.GetCatalogFileLoadPath();
+ string filePath = _fileSystem.GetCatalogBinaryFileLoadPath();
string url = DownloadSystemHelper.ConvertToWWWPath(filePath);
- _webTextRequestOp = new UnityWebTextRequestOperation(url);
- _webTextRequestOp.StartOperation();
- AddChildOperation(_webTextRequestOp);
+ _webDataRequestOp = new UnityWebDataRequestOperation(url);
+ _webDataRequestOp.StartOperation();
+ AddChildOperation(_webDataRequestOp);
}
- _webTextRequestOp.UpdateOperation();
- if (_webTextRequestOp.IsDone == false)
+ _webDataRequestOp.UpdateOperation();
+ if (_webDataRequestOp.IsDone == false)
return;
- if (_webTextRequestOp.Status == EOperationStatus.Succeed)
+ if (_webDataRequestOp.Status == EOperationStatus.Succeed)
{
_steps = ESteps.LoadCatalog;
- _textData = _webTextRequestOp.Result;
}
else
{
_steps = ESteps.Done;
Status = EOperationStatus.Failed;
- Error = _webTextRequestOp.Error;
+ Error = _webDataRequestOp.Error;
}
}
if (_steps == ESteps.LoadCatalog)
{
- if (string.IsNullOrEmpty(_textData))
- {
- _steps = ESteps.Done;
- Status = EOperationStatus.Failed;
- Error = $"Buildin catalog file content is empty !";
- return;
- }
-
try
{
- var catalog = JsonUtility.FromJson(_textData);
+ var catalog = CatalogTools.DeserializeFromBinary(_webDataRequestOp.Result);
if (catalog.PackageName != _fileSystem.PackageName)
{
_steps = ESteps.Done;
diff --git a/Assets/YooAsset/Runtime/ResourcePackage/ManifestTools.cs b/Assets/YooAsset/Runtime/ResourcePackage/ManifestTools.cs
index ffb7b5e1..c5a28ba5 100644
--- a/Assets/YooAsset/Runtime/ResourcePackage/ManifestTools.cs
+++ b/Assets/YooAsset/Runtime/ResourcePackage/ManifestTools.cs
@@ -8,7 +8,6 @@ namespace YooAsset
{
internal static class ManifestTools
{
-#if UNITY_EDITOR
///
/// 序列化(JSON文件)
///
@@ -160,7 +159,7 @@ namespace YooAsset
InitManifest(manifest);
return manifest;
}
-#endif
+
#region 解析资源清单辅助方法
public static void InitManifest(PackageManifest manifest)