using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Text; using BITKit.IO; using Cysharp.Threading.Tasks; using UnityEngine; using YooAsset; // ReSharper disable SuspiciousTypeConversion.Global namespace BITKit.Mod { public class UnityModLoader : MonoBehaviour { private static readonly ConcurrentDictionary _mods=new(); private void OnEnable() { ModService.OnModLoadAsync += OnModLoadAsync; ModService.OnModUnloadAsync += OnModUnloadAsync; } private void OnDisable() { ModService.OnModLoadAsync -= OnModLoadAsync; ModService.OnModUnloadAsync -= OnModUnloadAsync; } private UniTask OnModUnloadAsync(IMod mod) { switch (mod) { case IAssetMod: YooAssets.DestroyPackage(mod.PackageName); YooAssetUtils.UnregisterPackage(mod.PackageName); break; } return UniTask.CompletedTask; } private async UniTask OnModLoadAsync(IMod arg) { switch (arg) { case IAssetMod: var package = YooAssets.CreatePackage(arg.PackageName); var defaultHostServer = new RemoteServices( arg.FolderPath,arg.FolderPath) { }; var queryServices = new LocalQueryServices(arg.PackageName); var initParameters = new HostPlayModeParameters { BuildinQueryServices = queryServices, RemoteServices = defaultHostServer }; var initOperation = package.InitializeAsync(initParameters); await initOperation; if(initOperation.Status == EOperationStatus.Succeed) { YooAssetUtils.RegisterPackage(arg.PackageName); // var logBuilder = new StringBuilder(); // logBuilder.AppendLine("该包中的资源:"); // foreach (var x in package.GetAssetInfos(arg.Tags)) // { // logBuilder.AppendLine(x.Address); // } // logBuilder.AppendLine("默认包中的资源"); // foreach (var x in YooAssets.GetAssetInfos(arg.Tags)) // { // logBuilder.AppendLine(x.Address); // } // BIT4Log.Log(logBuilder.ToString()); BIT4Log.Log($"资源包{arg.PackageName}初始化成功!"); } else { BIT4Log.Log($"资源包初始化失败:{initOperation.Error}"); } break; } } } }