mirror of
https://github.com/tuyoogame/YooAsset.git
synced 2026-05-26 10:40:14 +00:00
feat : web play mode support remote services
WebPlayMode支持跨域加载。
This commit is contained in:
@@ -333,14 +333,18 @@ namespace YooAsset
|
||||
private enum ESteps
|
||||
{
|
||||
None,
|
||||
CreateFileSystem,
|
||||
InitWebFileSystem,
|
||||
CreateWebServerFileSystem,
|
||||
InitWebServerFileSystem,
|
||||
CreateWebRemoteFileSystem,
|
||||
InitWebRemoteFileSystem,
|
||||
CheckResult,
|
||||
Done,
|
||||
}
|
||||
|
||||
private readonly WebPlayModeImpl _impl;
|
||||
private readonly WebPlayModeParameters _parameters;
|
||||
private FSInitializeFileSystemOperation _initWebFileSystemOp;
|
||||
private FSInitializeFileSystemOperation _initWebServerFileSystemOp;
|
||||
private FSInitializeFileSystemOperation _initWebRemoteFileSystemOp;
|
||||
private ESteps _steps = ESteps.None;
|
||||
|
||||
internal WebPlayModeInitializationOperation(WebPlayModeImpl impl, WebPlayModeParameters parameters)
|
||||
@@ -350,54 +354,107 @@ namespace YooAsset
|
||||
}
|
||||
internal override void InternalOnStart()
|
||||
{
|
||||
_steps = ESteps.CreateFileSystem;
|
||||
_steps = ESteps.CreateWebServerFileSystem;
|
||||
}
|
||||
internal override void InternalOnUpdate()
|
||||
{
|
||||
if (_steps == ESteps.None || _steps == ESteps.Done)
|
||||
return;
|
||||
|
||||
if (_steps == ESteps.CreateFileSystem)
|
||||
if (_steps == ESteps.CreateWebServerFileSystem)
|
||||
{
|
||||
if (_parameters.WebFileSystemParameters == null)
|
||||
if (_parameters.WebServerFileSystemParameters == null)
|
||||
{
|
||||
_steps = ESteps.Done;
|
||||
Status = EOperationStatus.Failed;
|
||||
Error = "Web file system parameters is null";
|
||||
_steps = ESteps.CreateWebRemoteFileSystem;
|
||||
return;
|
||||
}
|
||||
|
||||
_impl.WebFileSystem = PlayModeHelper.CreateFileSystem(_impl.PackageName, _parameters.WebFileSystemParameters);
|
||||
if (_impl.WebFileSystem == null)
|
||||
_impl.WebServerFileSystem = PlayModeHelper.CreateFileSystem(_impl.PackageName, _parameters.WebServerFileSystemParameters);
|
||||
if (_impl.WebServerFileSystem == null)
|
||||
{
|
||||
_steps = ESteps.Done;
|
||||
Status = EOperationStatus.Failed;
|
||||
Error = "Failed to create web file system";
|
||||
Error = "Failed to create web server file system";
|
||||
return;
|
||||
}
|
||||
|
||||
_steps = ESteps.InitWebFileSystem;
|
||||
_steps = ESteps.InitWebServerFileSystem;
|
||||
}
|
||||
|
||||
if (_steps == ESteps.InitWebFileSystem)
|
||||
if (_steps == ESteps.InitWebServerFileSystem)
|
||||
{
|
||||
if (_initWebFileSystemOp == null)
|
||||
_initWebFileSystemOp = _impl.WebFileSystem.InitializeFileSystemAsync();
|
||||
if (_initWebServerFileSystemOp == null)
|
||||
_initWebServerFileSystemOp = _impl.WebServerFileSystem.InitializeFileSystemAsync();
|
||||
|
||||
Progress = _initWebFileSystemOp.Progress;
|
||||
if (_initWebFileSystemOp.IsDone == false)
|
||||
Progress = _initWebServerFileSystemOp.Progress;
|
||||
if (_initWebServerFileSystemOp.IsDone == false)
|
||||
return;
|
||||
|
||||
if (_initWebFileSystemOp.Status == EOperationStatus.Succeed)
|
||||
if (_initWebServerFileSystemOp.Status == EOperationStatus.Succeed)
|
||||
{
|
||||
_steps = ESteps.Done;
|
||||
Status = EOperationStatus.Succeed;
|
||||
_steps = ESteps.CreateWebRemoteFileSystem;
|
||||
}
|
||||
else
|
||||
{
|
||||
_steps = ESteps.Done;
|
||||
Status = EOperationStatus.Failed;
|
||||
Error = _initWebFileSystemOp.Error;
|
||||
Error = _initWebServerFileSystemOp.Error;
|
||||
}
|
||||
}
|
||||
|
||||
if (_steps == ESteps.CreateWebRemoteFileSystem)
|
||||
{
|
||||
if (_parameters.WebRemoteFileSystemParameters == null)
|
||||
{
|
||||
_steps = ESteps.CheckResult;
|
||||
return;
|
||||
}
|
||||
|
||||
_impl.WebRemoteFileSystem = PlayModeHelper.CreateFileSystem(_impl.PackageName, _parameters.WebRemoteFileSystemParameters);
|
||||
if (_impl.WebRemoteFileSystem == null)
|
||||
{
|
||||
_steps = ESteps.Done;
|
||||
Status = EOperationStatus.Failed;
|
||||
Error = "Failed to create web remote file system";
|
||||
return;
|
||||
}
|
||||
|
||||
_steps = ESteps.InitWebRemoteFileSystem;
|
||||
}
|
||||
|
||||
if (_steps == ESteps.InitWebRemoteFileSystem)
|
||||
{
|
||||
if (_initWebRemoteFileSystemOp == null)
|
||||
_initWebRemoteFileSystemOp = _impl.WebServerFileSystem.InitializeFileSystemAsync();
|
||||
|
||||
Progress = _initWebRemoteFileSystemOp.Progress;
|
||||
if (_initWebRemoteFileSystemOp.IsDone == false)
|
||||
return;
|
||||
|
||||
if (_initWebRemoteFileSystemOp.Status == EOperationStatus.Succeed)
|
||||
{
|
||||
_steps = ESteps.CheckResult;
|
||||
}
|
||||
else
|
||||
{
|
||||
_steps = ESteps.Done;
|
||||
Status = EOperationStatus.Failed;
|
||||
Error = _initWebRemoteFileSystemOp.Error;
|
||||
}
|
||||
}
|
||||
|
||||
if (_steps == ESteps.CheckResult)
|
||||
{
|
||||
if(_impl.WebServerFileSystem == null && _impl.WebRemoteFileSystem == null)
|
||||
{
|
||||
_steps = ESteps.Done;
|
||||
Status = EOperationStatus.Failed;
|
||||
Error = "Not found any file system !";
|
||||
}
|
||||
else
|
||||
{
|
||||
_steps = ESteps.Done;
|
||||
Status = EOperationStatus.Succeed;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,8 @@ namespace YooAsset
|
||||
internal class WebPlayModeImpl : IPlayMode, IBundleQuery
|
||||
{
|
||||
public readonly string PackageName;
|
||||
public IFileSystem WebFileSystem { set; get; }
|
||||
public IFileSystem WebServerFileSystem { set; get; } //可以为空!
|
||||
public IFileSystem WebRemoteFileSystem { set; get; } //可以为空!
|
||||
|
||||
|
||||
public WebPlayModeImpl(string packageName)
|
||||
@@ -30,21 +31,42 @@ namespace YooAsset
|
||||
|
||||
void IPlayMode.UpdatePlayMode()
|
||||
{
|
||||
if (WebFileSystem != null)
|
||||
WebFileSystem.OnUpdate();
|
||||
if (WebServerFileSystem != null)
|
||||
WebServerFileSystem.OnUpdate();
|
||||
|
||||
if (WebRemoteFileSystem != null)
|
||||
WebRemoteFileSystem.OnUpdate();
|
||||
}
|
||||
|
||||
RequestPackageVersionOperation IPlayMode.RequestPackageVersionAsync(bool appendTimeTicks, int timeout)
|
||||
{
|
||||
var operation = new RequestPackageVersionImplOperation(WebFileSystem, appendTimeTicks, timeout);
|
||||
OperationSystem.StartOperation(PackageName, operation);
|
||||
return operation;
|
||||
if (WebRemoteFileSystem != null)
|
||||
{
|
||||
var operation = new RequestPackageVersionImplOperation(WebRemoteFileSystem, appendTimeTicks, timeout);
|
||||
OperationSystem.StartOperation(PackageName, operation);
|
||||
return operation;
|
||||
}
|
||||
else
|
||||
{
|
||||
var operation = new RequestPackageVersionImplOperation(WebServerFileSystem, appendTimeTicks, timeout);
|
||||
OperationSystem.StartOperation(PackageName, operation);
|
||||
return operation;
|
||||
}
|
||||
}
|
||||
UpdatePackageManifestOperation IPlayMode.UpdatePackageManifestAsync(string packageVersion, int timeout)
|
||||
{
|
||||
var operation = new UpdatePackageManifestImplOperation(this, WebFileSystem, packageVersion, timeout);;
|
||||
OperationSystem.StartOperation(PackageName, operation);
|
||||
return operation;
|
||||
if (WebRemoteFileSystem != null)
|
||||
{
|
||||
var operation = new UpdatePackageManifestImplOperation(this, WebRemoteFileSystem, packageVersion, timeout); ;
|
||||
OperationSystem.StartOperation(PackageName, operation);
|
||||
return operation;
|
||||
}
|
||||
else
|
||||
{
|
||||
var operation = new UpdatePackageManifestImplOperation(this, WebServerFileSystem, packageVersion, timeout); ;
|
||||
OperationSystem.StartOperation(PackageName, operation);
|
||||
return operation;
|
||||
}
|
||||
}
|
||||
PreDownloadContentOperation IPlayMode.PreDownloadContentAsync(string packageVersion, int timeout)
|
||||
{
|
||||
@@ -55,50 +77,50 @@ namespace YooAsset
|
||||
|
||||
ClearAllBundleFilesOperation IPlayMode.ClearAllBundleFilesAsync()
|
||||
{
|
||||
var operation = new ClearAllBundleFilesImplOperation(this, WebFileSystem, null, null);
|
||||
var operation = new ClearAllBundleFilesImplOperation(this, WebServerFileSystem, WebRemoteFileSystem, null);
|
||||
OperationSystem.StartOperation(PackageName, operation);
|
||||
return operation;
|
||||
}
|
||||
ClearUnusedBundleFilesOperation IPlayMode.ClearUnusedBundleFilesAsync()
|
||||
{
|
||||
var operation = new ClearUnusedBundleFilesImplOperation(this, WebFileSystem, null, null);
|
||||
var operation = new ClearUnusedBundleFilesImplOperation(this, WebServerFileSystem, WebRemoteFileSystem, null);
|
||||
OperationSystem.StartOperation(PackageName, operation);
|
||||
return operation;
|
||||
}
|
||||
|
||||
ResourceDownloaderOperation IPlayMode.CreateResourceDownloaderByAll(int downloadingMaxNumber, int failedTryAgain, int timeout)
|
||||
{
|
||||
List<BundleInfo> downloadList = PlayModeHelper.GetDownloadListByAll(ActiveManifest, WebFileSystem);
|
||||
List<BundleInfo> downloadList = PlayModeHelper.GetDownloadListByAll(ActiveManifest, WebServerFileSystem, WebRemoteFileSystem);
|
||||
var operation = new ResourceDownloaderOperation(PackageName, downloadList, downloadingMaxNumber, failedTryAgain, timeout);
|
||||
return operation;
|
||||
}
|
||||
ResourceDownloaderOperation IPlayMode.CreateResourceDownloaderByTags(string[] tags, int downloadingMaxNumber, int failedTryAgain, int timeout)
|
||||
{
|
||||
List<BundleInfo> downloadList = PlayModeHelper.GetDownloadListByTags(ActiveManifest, tags, WebFileSystem);
|
||||
List<BundleInfo> downloadList = PlayModeHelper.GetDownloadListByTags(ActiveManifest, tags, WebServerFileSystem, WebRemoteFileSystem);
|
||||
var operation = new ResourceDownloaderOperation(PackageName, downloadList, downloadingMaxNumber, failedTryAgain, timeout);
|
||||
return operation;
|
||||
}
|
||||
ResourceDownloaderOperation IPlayMode.CreateResourceDownloaderByPaths(AssetInfo[] assetInfos, int downloadingMaxNumber, int failedTryAgain, int timeout)
|
||||
{
|
||||
List<BundleInfo> downloadList = PlayModeHelper.GetDownloadListByPaths(ActiveManifest, assetInfos, WebFileSystem);
|
||||
List<BundleInfo> downloadList = PlayModeHelper.GetDownloadListByPaths(ActiveManifest, assetInfos, WebServerFileSystem, WebRemoteFileSystem);
|
||||
var operation = new ResourceDownloaderOperation(PackageName, downloadList, downloadingMaxNumber, failedTryAgain, timeout);
|
||||
return operation;
|
||||
}
|
||||
ResourceUnpackerOperation IPlayMode.CreateResourceUnpackerByAll(int upackingMaxNumber, int failedTryAgain, int timeout)
|
||||
{
|
||||
List<BundleInfo> unpcakList = PlayModeHelper.GetUnpackListByAll(ActiveManifest, WebFileSystem);
|
||||
List<BundleInfo> unpcakList = PlayModeHelper.GetUnpackListByAll(ActiveManifest, WebServerFileSystem, WebRemoteFileSystem);
|
||||
var operation = new ResourceUnpackerOperation(PackageName, unpcakList, upackingMaxNumber, failedTryAgain, timeout);
|
||||
return operation;
|
||||
}
|
||||
ResourceUnpackerOperation IPlayMode.CreateResourceUnpackerByTags(string[] tags, int upackingMaxNumber, int failedTryAgain, int timeout)
|
||||
{
|
||||
List<BundleInfo> unpcakList = PlayModeHelper.GetUnpackListByTags(ActiveManifest, tags, WebFileSystem);
|
||||
List<BundleInfo> unpcakList = PlayModeHelper.GetUnpackListByTags(ActiveManifest, tags, WebServerFileSystem, WebRemoteFileSystem);
|
||||
var operation = new ResourceUnpackerOperation(PackageName, unpcakList, upackingMaxNumber, failedTryAgain, timeout);
|
||||
return operation;
|
||||
}
|
||||
ResourceImporterOperation IPlayMode.CreateResourceImporterByFilePaths(string[] filePaths, int importerMaxNumber, int failedTryAgain, int timeout)
|
||||
{
|
||||
List<BundleInfo> importerList = PlayModeHelper.GetImporterListByFilePaths(ActiveManifest, filePaths, WebFileSystem);
|
||||
List<BundleInfo> importerList = PlayModeHelper.GetImporterListByFilePaths(ActiveManifest, filePaths, WebServerFileSystem, WebRemoteFileSystem);
|
||||
var operation = new ResourceImporterOperation(PackageName, importerList, importerMaxNumber, failedTryAgain, timeout);
|
||||
return operation;
|
||||
}
|
||||
@@ -110,9 +132,15 @@ namespace YooAsset
|
||||
if (packageBundle == null)
|
||||
throw new Exception("Should never get here !");
|
||||
|
||||
if (WebFileSystem.Belong(packageBundle))
|
||||
if (WebServerFileSystem != null && WebServerFileSystem.Belong(packageBundle))
|
||||
{
|
||||
BundleInfo bundleInfo = new BundleInfo(WebFileSystem, packageBundle);
|
||||
BundleInfo bundleInfo = new BundleInfo(WebServerFileSystem, packageBundle);
|
||||
return bundleInfo;
|
||||
}
|
||||
|
||||
if (WebRemoteFileSystem != null && WebRemoteFileSystem.Belong(packageBundle))
|
||||
{
|
||||
BundleInfo bundleInfo = new BundleInfo(WebRemoteFileSystem, packageBundle);
|
||||
return bundleInfo;
|
||||
}
|
||||
|
||||
|
||||
@@ -181,10 +181,20 @@ namespace YooAsset
|
||||
if (_playMode == EPlayMode.WebPlayMode)
|
||||
{
|
||||
var webPlayModeParams = parameters as WebPlayModeParameters;
|
||||
var fileSystemClassName = webPlayModeParams.WebFileSystemParameters.FileSystemClass;
|
||||
if (fileSystemClassName == typeof(DefaultCacheFileSystem).FullName
|
||||
|| fileSystemClassName == typeof(DefaultBuildinFileSystem).FullName)
|
||||
throw new Exception($"{fileSystemClassName} not support {nameof(EPlayMode.WebPlayMode)}");
|
||||
if (webPlayModeParams.WebServerFileSystemParameters != null)
|
||||
{
|
||||
var fileSystemClassName = webPlayModeParams.WebServerFileSystemParameters.FileSystemClass;
|
||||
if (fileSystemClassName == typeof(DefaultCacheFileSystem).FullName
|
||||
|| fileSystemClassName == typeof(DefaultBuildinFileSystem).FullName)
|
||||
throw new Exception($"{fileSystemClassName} not support {nameof(EPlayMode.WebPlayMode)}");
|
||||
}
|
||||
if (webPlayModeParams.WebRemoteFileSystemParameters != null)
|
||||
{
|
||||
var fileSystemClassName = webPlayModeParams.WebRemoteFileSystemParameters.FileSystemClass;
|
||||
if (fileSystemClassName == typeof(DefaultCacheFileSystem).FullName
|
||||
|| fileSystemClassName == typeof(DefaultBuildinFileSystem).FullName)
|
||||
throw new Exception($"{fileSystemClassName} not support {nameof(EPlayMode.WebPlayMode)}");
|
||||
}
|
||||
}
|
||||
}
|
||||
private void InitializeOperation_Completed(AsyncOperationBase op)
|
||||
|
||||
Reference in New Issue
Block a user