com.alicizax.unity.tuyoogam.../Runtime/ResourcePackage/Operation/InitializationOperation.cs

129 lines
4.2 KiB
C#
Raw Normal View History

2025-02-28 16:11:01 +08:00
using System.Collections.Generic;
using System.Linq;
2025-01-09 11:31:04 +08:00
namespace YooAsset
{
2025-02-28 16:11:01 +08:00
public class InitializationOperation : AsyncOperationBase
2025-01-09 11:31:04 +08:00
{
private enum ESteps
{
None,
2025-02-28 16:11:01 +08:00
Prepare,
ClearOldFileSystem,
2025-01-09 11:31:04 +08:00
InitFileSystem,
2025-02-28 16:11:01 +08:00
CheckInitResult,
2025-01-09 11:31:04 +08:00
Done,
}
2025-02-28 16:11:01 +08:00
private readonly PlayModeImpl _impl;
private readonly List<FileSystemParameters> _parametersList;
private List<FileSystemParameters> _cloneList;
2025-01-09 11:31:04 +08:00
private FSInitializeFileSystemOperation _initFileSystemOp;
private ESteps _steps = ESteps.None;
2025-02-28 16:11:01 +08:00
internal InitializationOperation(PlayModeImpl impl, List<FileSystemParameters> parametersList)
2025-01-09 11:31:04 +08:00
{
_impl = impl;
2025-02-28 16:11:01 +08:00
_parametersList = parametersList;
2025-01-09 11:31:04 +08:00
}
2025-02-28 16:11:01 +08:00
internal override void InternalStart()
2025-01-09 11:31:04 +08:00
{
2025-02-28 16:11:01 +08:00
_steps = ESteps.Prepare;
2025-01-09 11:31:04 +08:00
}
2025-02-28 16:11:01 +08:00
internal override void InternalUpdate()
2025-01-09 11:31:04 +08:00
{
if (_steps == ESteps.None || _steps == ESteps.Done)
return;
2025-02-28 16:11:01 +08:00
if (_steps == ESteps.Prepare)
2025-01-09 11:31:04 +08:00
{
2025-02-28 16:11:01 +08:00
if (_parametersList == null || _parametersList.Count == 0)
2025-01-09 11:31:04 +08:00
{
_steps = ESteps.Done;
Status = EOperationStatus.Failed;
2025-02-28 16:11:01 +08:00
Error = "The file system parameters is empty !";
2025-01-09 11:31:04 +08:00
return;
}
2025-02-28 16:11:01 +08:00
foreach (var fileSystemParam in _parametersList)
2025-01-09 11:31:04 +08:00
{
2025-02-28 16:11:01 +08:00
if (fileSystemParam == null)
{
_steps = ESteps.Done;
Status = EOperationStatus.Failed;
Error = "An empty object exists in the list!";
return;
}
2025-01-09 11:31:04 +08:00
}
2025-02-28 16:11:01 +08:00
_cloneList = _parametersList.ToList();
_steps = ESteps.ClearOldFileSystem;
2025-01-09 11:31:04 +08:00
}
2025-02-28 16:11:01 +08:00
if (_steps == ESteps.ClearOldFileSystem)
2025-01-09 11:31:04 +08:00
{
2025-02-28 16:11:01 +08:00
// 注意:初始化失败后可能会残存一些旧的文件系统!
foreach (var fileSystem in _impl.FileSystems)
2025-01-09 11:31:04 +08:00
{
2025-02-28 16:11:01 +08:00
fileSystem.OnDestroy();
2025-01-09 11:31:04 +08:00
}
2025-02-28 16:11:01 +08:00
_impl.FileSystems.Clear();
_steps = ESteps.InitFileSystem;
2025-01-09 11:31:04 +08:00
}
2025-02-28 16:11:01 +08:00
if (_steps == ESteps.InitFileSystem)
2025-01-09 11:31:04 +08:00
{
2025-02-28 16:11:01 +08:00
if (_cloneList.Count == 0)
2025-01-09 11:31:04 +08:00
{
_steps = ESteps.Done;
Status = EOperationStatus.Succeed;
}
else
{
2025-02-28 16:11:01 +08:00
var fileSystemParams = _cloneList[0];
_cloneList.RemoveAt(0);
2025-01-09 11:31:04 +08:00
2025-02-28 16:11:01 +08:00
IFileSystem fileSystemInstance = fileSystemParams.CreateFileSystem(_impl.PackageName);
if (fileSystemInstance == null)
{
_steps = ESteps.Done;
Status = EOperationStatus.Failed;
Error = "Failed to create file system instance !";
return;
}
2025-01-09 11:31:04 +08:00
2025-02-28 16:11:01 +08:00
_impl.FileSystems.Add(fileSystemInstance);
_initFileSystemOp = fileSystemInstance.InitializeFileSystemAsync();
_initFileSystemOp.StartOperation();
AddChildOperation(_initFileSystemOp);
_steps = ESteps.CheckInitResult;
2025-01-09 11:31:04 +08:00
}
}
2025-02-28 16:11:01 +08:00
if (_steps == ESteps.CheckInitResult)
2025-01-09 11:31:04 +08:00
{
2025-02-28 16:11:01 +08:00
_initFileSystemOp.UpdateOperation();
Progress = _initFileSystemOp.Progress;
if (_initFileSystemOp.IsDone == false)
2025-01-09 11:31:04 +08:00
return;
2025-02-28 16:11:01 +08:00
if (_initFileSystemOp.Status == EOperationStatus.Succeed)
2025-01-09 11:31:04 +08:00
{
2025-02-28 16:11:01 +08:00
_steps = ESteps.InitFileSystem;
2025-01-09 11:31:04 +08:00
}
else
{
_steps = ESteps.Done;
Status = EOperationStatus.Failed;
2025-02-28 16:11:01 +08:00
Error = _initFileSystemOp.Error;
2025-01-09 11:31:04 +08:00
return;
}
}
}
2025-04-01 21:12:28 +08:00
internal override string InternalGetDesc()
{
return $"PlayMode : {_impl.PlayMode}";
}
2025-01-09 11:31:04 +08:00
}
}