using System; using System.Collections; using System.Collections.Generic; using BITKit.Entities; using BITKit.Mod; using Cysharp.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using UnityEngine; using ILogger = Microsoft.Extensions.Logging.ILogger; namespace BITKit.IO { public class ScriptableEntitiesService : IDisposable { private readonly IEntitiesService _entitiesService; public string Tags = "scriptable_object"; private readonly List _registeredEntities = new(); public ScriptableEntitiesService(IEntitiesService entitiesService) { _entitiesService = entitiesService; } public async UniTask InitializeAsync(ILogger logger = null) { logger?.LogInformation("正在查找所有ScriptableObject..."); var objs = await ModService.LoadAssets(Tags); logger?.LogInformation($"找到{objs.Count}个资源,正在加载中..."); for (var index = 0; index < objs.Count; index++) { var scriptableObject = objs[index]; var entity = new Entity(); var idComponent = new IdComponent() { Name = scriptableObject.name }; entity.ServiceCollection.AddSingleton(idComponent); var type = scriptableObject.GetType(); var typeName = type.Name; entity.ServiceCollection.AddSingleton(type, scriptableObject); foreach (var x in type.GetInterfaces()) { entity.ServiceCollection.AddSingleton(x, scriptableObject); } while (type is not null) { if (type.BaseType is null) break; entity.ServiceCollection.AddSingleton(type.BaseType, scriptableObject); type = type.BaseType; typeName += $":{type.Name}"; } _entitiesService.Register(entity); logger?.LogInformation($"已加载:{scriptableObject.name}:{typeName},剩余:{index + 1}/{objs.Count}"); _registeredEntities.Add(entity); continue; } logger?.LogInformation("加载完成"); return; } public void Dispose() { foreach (var x in _registeredEntities) { _entitiesService.UnRegister(x); } _registeredEntities.Clear(); } } }