新增 FlowScope Git 包雏形

This commit is contained in:
JSD\13999
2026-06-04 14:54:49 +08:00
parent 37e6d4ca57
commit f5887da9fb
127 changed files with 5330 additions and 0 deletions

View File

@@ -0,0 +1,70 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using FlowScope.Resources;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityAddressables = UnityEngine.AddressableAssets.Addressables;
namespace FlowScope.Addressables
{
public sealed class AddressablesResourceBackend : IResourceBackend
{
public string Name => "Addressables";
public async Task<T> LoadAsync<T>(string key, CancellationToken cancellationToken)
where T : class
{
cancellationToken.ThrowIfCancellationRequested();
var handle = UnityAddressables.LoadAssetAsync<T>(key);
try
{
await WaitWithCancellation(handle.Task, cancellationToken);
}
catch (OperationCanceledException)
{
UnityAddressables.Release(handle);
throw;
}
if (handle.OperationException != null ||
handle.Status != AsyncOperationStatus.Succeeded ||
handle.Result == null)
{
var exception = new InvalidOperationException(
$"Failed to load Addressables resource '{key}' as {typeof(T).Name} from backend '{Name}'.",
handle.OperationException);
UnityAddressables.Release(handle);
throw exception;
}
return handle.Result;
}
public void Release<T>(string key, T asset)
where T : class
{
UnityAddressables.Release(asset);
}
private static async Task WaitWithCancellation(Task task, CancellationToken cancellationToken)
{
if (!cancellationToken.CanBeCanceled)
{
await task;
return;
}
var cancellation = new TaskCompletionSource<bool>();
using (cancellationToken.Register(() => cancellation.TrySetResult(true)))
{
if (await Task.WhenAny(task, cancellation.Task) == cancellation.Task)
{
throw new OperationCanceledException(cancellationToken);
}
}
await task;
}
}
}

View File

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

View File

@@ -0,0 +1,38 @@
using System.Threading;
using System.Threading.Tasks;
using FlowScope.Addressables;
namespace FlowScope.Resources
{
public sealed class AddressablesResourceService : IResourceService, ICompletedResourceService
{
private readonly ResourceService _inner;
public AddressablesResourceService()
: this(new AddressablesResourceBackend())
{
}
public AddressablesResourceService(IResourceBackend backend)
{
_inner = new ResourceService(backend);
}
public Task<IResourceHandle<T>> LoadAsync<T>(string key, CancellationToken cancellationToken)
where T : class
{
return _inner.LoadAsync<T>(key, cancellationToken);
}
public IResourceGroup CreateGroup()
{
return _inner.CreateGroup();
}
public bool TryLoadCompleted<T>(string key, out IResourceHandle<T> handle)
where T : class
{
return _inner.TryLoadCompleted(key, out handle);
}
}
}

View File

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

View File

@@ -0,0 +1,18 @@
{
"name": "FlowScope.Addressables",
"rootNamespace": "FlowScope.Addressables",
"references": [
"FlowScope.Runtime",
"Unity.Addressables",
"Unity.ResourceManager"
],
"includePlatforms": [],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": false,
"precompiledReferences": [],
"autoReferenced": true,
"defineConstraints": [],
"versionDefines": [],
"noEngineReferences": false
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 917e69d4247b4f548a5951d84e7d35db
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant: