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"/>
/// </summary>
BundleUnpackPolicy,
/// <summary>
/// 内置文件访问器 <see cref="IBuiltinFileAccessor"/>
/// </summary>
BuiltinFileAccessor,
}
}

View File

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

View File

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