mirror of
https://github.com/tuyoogame/YooAsset.git
synced 2026-05-28 11:38:47 +00:00
feat : add IBuiltinFileAccessor
This commit is contained in:
@@ -145,5 +145,10 @@ namespace YooAsset
|
||||
/// 内置资源包解包策略 <see cref="IBundleUnpackPolicy"/>
|
||||
/// </summary>
|
||||
BundleUnpackPolicy,
|
||||
|
||||
/// <summary>
|
||||
/// 内置文件访问器 <see cref="IBuiltinFileAccessor"/>
|
||||
/// </summary>
|
||||
BuiltinFileAccessor,
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
|
||||
@@ -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,
|
||||
|
||||
24
Assets/YooAsset/Runtime/Interfaces/IBuiltinFileAccessor.cs
Normal file
24
Assets/YooAsset/Runtime/Interfaces/IBuiltinFileAccessor.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0942e034de20eff458c1fdb0ab745fda
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user