using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; #if UNITY_EDITOR using UnityEditor; #endif using UnityEngine; namespace BITKit.Mod { public class UnityModService : MonoBehaviour { [SerializeReference,SubclassSelector] private IReference[] referencedAssemblies; [SerializeField] private bool loadLocalPackageOnStart; private async void Start() { if (Application.isEditor is false) { BIT4Log.Log($"UnityPlayer所在位置:{Application.dataPath}"); BIT4Log.Log($"{nameof(System.Linq)}位于{typeof(Enumerable).Assembly.Location}"); } foreach (var x in referencedAssemblies) { var dllName = x.Value.Contains(".dll") ? x.Value : $"{x.Value}.dll"; #if UNITY_EDITOR var dll = System.IO.Path.Combine(Environment.CurrentDirectory, "Library", "ScriptAssemblies",dllName); var folder = EditorApplication.applicationPath; folder = Path.GetDirectoryName(folder); if(File.Exists(dll) is false) { dll = Path.Combine(folder,"Data", "MonoBleedingEdge", "lib","mono","unityjit-win32",dllName); } if (File.Exists(dll) is false) { dll = Path.Combine(folder,"Data", "MonoBleedingEdge", "lib","mono","unityjit-win32","Facades",dllName); } #else var dll = System.IO.Path.Combine(Environment.CurrentDirectory,$"{Application.productName}_Data", "Managed", dllName); #endif if (System.IO.File.Exists(dll) is false) { BIT4Log.Warning($"未找到:{dll}"); } BITSharp.ReferencedAssemblies.Add(@$"""{dll}"""); } try { ModService.Initialize(); } catch (Exception e) { BIT4Log.Warning("初始化失败"); BIT4Log.LogException(e); return; } destroyCancellationToken.Register(ModService.Dispose); if (!loadLocalPackageOnStart) return; var packages = await ModService.SearchPackages(); if (destroyCancellationToken.IsCancellationRequested) return; foreach (var package in packages) { await ModService.LoadFromPackage(package.PackagePath); if (destroyCancellationToken.IsCancellationRequested) return; } } } }