feat : add IBuiltinFileAccessor

This commit is contained in:
何冠峰
2026-05-28 10:37:42 +08:00
parent 9e969d34f6
commit aff50317cb
5 changed files with 80 additions and 6 deletions

View File

@@ -145,5 +145,10 @@ namespace YooAsset
/// 内置资源包解包策略 <see cref="IBundleUnpackPolicy"/> /// 内置资源包解包策略 <see cref="IBundleUnpackPolicy"/>
/// </summary> /// </summary>
BundleUnpackPolicy, BundleUnpackPolicy,
/// <summary>
/// 内置文件访问器 <see cref="IBuiltinFileAccessor"/>
/// </summary>
BuiltinFileAccessor,
} }
} }

View File

@@ -145,6 +145,11 @@ namespace YooAsset
/// 自定义参数:内置资源包解包策略 /// 自定义参数:内置资源包解包策略
/// </summary> /// </summary>
internal IBundleUnpackPolicy BundleUnpackPolicy { get; private set; } internal IBundleUnpackPolicy BundleUnpackPolicy { get; private set; }
/// <summary>
/// 自定义参数:内置文件访问器
/// </summary>
internal IBuiltinFileAccessor BuiltinFileAccessor { get; private set; }
#endregion #endregion
/// <summary> /// <summary>
@@ -293,6 +298,10 @@ namespace YooAsset
{ {
BundleUnpackPolicy = FileSystemHelper.CastParameter<IBundleUnpackPolicy>(paramName, value); BundleUnpackPolicy = FileSystemHelper.CastParameter<IBundleUnpackPolicy>(paramName, value);
} }
else if (paramName == nameof(EFileSystemParameter.BuiltinFileAccessor))
{
BuiltinFileAccessor = FileSystemHelper.CastParameter<IBuiltinFileAccessor>(paramName, value);
}
else else
{ {
throw new ArgumentException($"Unrecognized parameter name: '{paramName}'.", nameof(paramName)); throw new ArgumentException($"Unrecognized parameter name: '{paramName}'.", nameof(paramName));

View File

@@ -13,7 +13,8 @@ namespace YooAsset
None, None,
CheckFileExist, CheckFileExist,
TryCopyFile, TryCopyFile,
UnpackFile, TryCopyByAccessor,
TryCopyByRequest,
Done, Done,
} }
@@ -55,6 +56,8 @@ namespace YooAsset
if (_steps == ESteps.TryCopyFile) if (_steps == ESteps.TryCopyFile)
{ {
// 注意Android/OpenHarmony 平台 File.Exists 无法识别包体内文件。
// 该步骤仅对 StreamingAssets 为真实文件系统目录的平台Windows/iOS/Mac生效。
if (File.Exists(_sourceFilePath)) if (File.Exists(_sourceFilePath))
{ {
try try
@@ -66,21 +69,43 @@ namespace YooAsset
} }
catch (Exception ex) catch (Exception ex)
{ {
YooLogger.LogWarning($"Failed to copy builtin file: {ex.Message}."); _steps = ESteps.Done;
_steps = ESteps.UnpackFile; SetError($"Failed to copy builtin file: {ex.Message}.");
YooLogger.LogError(Error);
} }
} }
else else
{ {
_steps = ESteps.UnpackFile; if (_fileSystem.BuiltinFileAccessor != null)
_steps = ESteps.TryCopyByAccessor;
else
_steps = ESteps.TryCopyByRequest;
} }
} }
if (_steps == ESteps.UnpackFile) if (_steps == ESteps.TryCopyByAccessor)
{
try
{
FileUtility.EnsureParentDirectoryExists(_destFilePath);
byte[] data = _fileSystem.BuiltinFileAccessor.ReadAllBytes(_sourceFilePath);
File.WriteAllBytes(_destFilePath, data);
_steps = ESteps.Done;
SetResult();
}
catch (Exception ex)
{
_steps = ESteps.Done;
SetError($"Failed to copy builtin file by accessor: {ex.Message}.");
YooLogger.LogError(Error);
}
}
if (_steps == ESteps.TryCopyByRequest)
{ {
if (_downloadFileRequest == null) if (_downloadFileRequest == null)
{ {
// TODO: 团结引擎在某些安卓机型红米通过UnityWebRequest拷贝包内文件会小概率失败!需要借助其它方式来拷贝包内文件 // TODO: 团结引擎在某些安卓机型红米通过UnityWebRequest拷贝包内文件会小概率失败。
string url = DownloadUrlHelper.ToLocalFileUrl(_sourceFilePath); string url = DownloadUrlHelper.ToLocalFileUrl(_sourceFilePath);
var args = new DownloadFileRequestArgs( var args = new DownloadFileRequestArgs(
url: url, url: url,

View File

@@ -0,0 +1,24 @@
namespace YooAsset
{
/// <summary>
/// 内置文件访问器接口,提供对 StreamingAssets 目录的直接访问能力。
/// </summary>
/// <remarks>
/// Android 平台,可通过第三方库(如 BetterStreamingAssets实现该接口提供同步文件读取能力。</para>
/// </remarks>
public interface IBuiltinFileAccessor
{
/// <summary>
/// 检查内置文件是否存在
/// </summary>
/// <param name="filePath">内置文件路径</param>
bool FileExists(string filePath);
/// <summary>
/// 读取内置文件的所有字节
/// </summary>
/// <param name="filePath">内置文件路径</param>
byte[] ReadAllBytes(string filePath);
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 0942e034de20eff458c1fdb0ab745fda
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: