using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Reflection; using System.Threading; using BITFALL; using BITFALL.Bullet; using BITKit; using BITKit.Console; using BITKit.Entities; using BITKit.IO; using BITKit.Mod; using BITKit.Net; using BITKit.Pool; using BITKit.StateMachine; using BITKit.UX; using BITKit.UX.Hotkey; using BITKit.UX.Settings; using BITKit.WorldNode; using Com.Project.B.Lobby; using Cysharp.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Net.BITKit.Chat; using Net.BITKit.Database; using Net.BITKit.Localization; using Net.BITKit.Quadtree; using Net.BITKit.UX; using Net.BITKit.UX.SnackBar; using Net.BITKit.VFX; using Net.Project.B; using Net.Project.B.AI; using Net.Project.B.AI.Dialogue; using Net.Project.B.AI.Dialogue.MaxKb; using Net.Project.B.Buff; using Net.Project.B.Chat; using Net.Project.B.Damage; using Net.Project.B.Dialogue; using Net.Project.B.Health; using Net.Project.B.Interaction; using Net.Project.B.Inventory; using Net.Project.B.Item; using Net.Project.B.Loot; using Net.Project.B.Mark; using Net.Project.B.Melee; using Net.Project.B.PDA; using Net.Project.B.PDA.App; using Net.Project.B.Quest; using Net.Project.B.Survival; using Net.Project.B.UX; using Net.Project.B.Vehicle; using Net.Project.B.World; using Net.Project.B.WorldNode; using Newtonsoft.Json; using Project.B.Animation; using Project.B.Authorize; using Project.B.CharacterController; using Project.B.Entities; using Project.B.Map; using Project.B.Player; using Project.B.UX; using UnityEngine; using UnityEngine.InputSystem; using YamlDotNet.Serialization; using YamlDotNet.Serialization.NamingConventions; using IUXDialogue = Net.Project.B.UX.IUXDialogue; namespace Project.B { public class Program : MonoBehaviour { public class DefaultDictionary:Dictionary { } public static async UniTask AddProjectBServices(IServiceCollection serviceCollection,CancellationTokenSource cancellationTokenSource) { YooAssetModHelper.PackagesManifestDictionary.Clear(); ModService.LoadAssetAsyncFactory += YooAssetModHelper.LoadAsset; ModService.LoadAssetsAsyncFactory += YooAssetModHelper.LoadAssets; // 自动持久化存储Dictionary //serviceCollection.AddSingleton(typeof(IDictionary<,>), typeof(LiteDbDictionary<,>)); serviceCollection.AddSingleton(typeof(IDictionary<,>),typeof(DefaultDictionary<,>)); //本地化 serviceCollection.AddSingleton(); // 本地化Csv支持 serviceCollection.AddSingleton(); serviceCollection.AddLogging(); serviceCollection.AddSingleton(serviceCollection); //初始化Log serviceCollection.AddSingleton(typeof(ILogger<>),typeof( UnityLogger<>)); serviceCollection.AddSingleton>(x => x.GetRequiredService()); //yaml // 创建序列化器并注册转换器 var serializer = new SerializerBuilder() .WithNamingConvention(CamelCaseNamingConvention.Instance) .WithTypeConverter(new UnityMathematicsYamlConverters()) .Build(); var deserializer = new DeserializerBuilder() .WithNamingConvention(CamelCaseNamingConvention.Instance) .WithTypeConverter(new UnityMathematicsYamlConverters()) .Build(); serviceCollection.AddSingleton(serializer); serviceCollection.AddSingleton(deserializer); serviceCollection.AddSingleton(); //物品实体初始化 serviceCollection.AddSingleton(); //初始化状态机 serviceCollection.AddSingleton(typeof(IMicroStateMachine<>), typeof(MicroStateMachine<>)); //初始化数据监听 serviceCollection.AddSingleton(typeof(IWrapper<>), typeof(ValueWrapper<>)); //初始化服务 serviceCollection.AddSingleton(serviceCollection); //对象池 serviceCollection.AddSingleton(); //主循环 serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(cancellationTokenSource); //网络 serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(x => x.GetRequiredService().NetProvider); //玩家&实体 serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); //对话树 serviceCollection.AddSingleton(); //NodeCanvas对话树中间件 serviceCollection.AddSingleton(); //地图 serviceCollection.AddSingleton(); //大厅 serviceCollection.AddSingleton(x=>x.GetRequiredService().GetRemoteInterface()); //授权 serviceCollection.AddSingleton(x=>x.GetRequiredService().GetRemoteInterface()); //玩家角色控制器服务 serviceCollection.AddSingleton(); //玩家生命值 serviceCollection.AddSingleton(); //玩家击倒服务 serviceCollection.AddSingleton(); var scriptablePlayerAnimation =await ModService.LoadAsset("scriptable_player_animations"); //玩家动画 serviceCollection.AddSingleton(scriptablePlayerAnimation); serviceCollection.AddSingleton(scriptablePlayerAnimation); // 玩家过渡动画 serviceCollection.AddSingleton(await ModService.LoadAsset("scriptable_player_translation_animations")); //注册实体工厂 serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); //场景互动 serviceCollection.AddSingleton(); //场景可互动高亮 serviceCollection.AddSingleton(); //场景互动门 serviceCollection.AddSingleton(); //载具系统 serviceCollection.AddSingleton(); //座位系统 serviceCollection.AddSingleton(); //实体生成 serviceCollection.AddSingleton(); //电梯 serviceCollection.AddSingleton(); //场景物品服务 serviceCollection.AddSingleton(); //玩家配置 serviceCollection.AddSingleton(x=>x.GetRequiredService().GetRemoteInterface()); serviceCollection.AddSingleton(x=>x.GetRequiredService().GetRemoteInterface()); var keyMap =await ModService.LoadAsset("scriptable_player_key_map"); serviceCollection.AddSingleton>(keyMap); serviceCollection.AddSingleton>(keyMap); serviceCollection.AddSingleton>(keyMap); //任务 serviceCollection.AddSingleton(); //世界相机 serviceCollection.AddSingleton(); //场景侦查 serviceCollection.AddSingleton(); //Unity设置 serviceCollection.AddSingleton(); //添加作弊器 serviceCollection.AddSingleton(); //购买商店 serviceCollection.AddSingleton(); // Minimap serviceCollection.AddSingleton(); //战利品 serviceCollection.AddSingleton(); // NPC生成 serviceCollection.AddSingleton(); // 子弹 serviceCollection.AddSingleton(); // VFX serviceCollection.AddSingleton(); //伤害 serviceCollection.AddSingleton(); //近战 serviceCollection.AddSingleton(); // 本地化 serviceCollection.AddSingleton(); // 自动回血 serviceCollection.AddSingleton(); //建筑Lod serviceCollection.AddSingleton(); // Zombie AI serviceCollection.AddSingleton(); // Human AI serviceCollection.AddSingleton(); // Shooter AI serviceCollection.AddSingleton(); // 自动四叉树 serviceCollection.AddSingleton(typeof(QuadTreeService<>)); // AI传感器 serviceCollection.AddSingleton(); // 标记系统 serviceCollection.AddSingleton(); // 世界任务 serviceCollection.AddSingleton(); // 撤离点 serviceCollection.AddSingleton(); // 地铁 serviceCollection.AddSingleton(); // Buff serviceCollection.AddSingleton(); // 生存 serviceCollection.AddSingleton(); // AI 开门 serviceCollection.AddSingleton(); // App serviceCollection.AddSingleton(); serviceCollection.AddSingleton>(x=>x.GetRequiredService()); serviceCollection.AddSingleton, AppPhone>(); serviceCollection.AddSingleton, AppQuest>(); serviceCollection.AddSingleton, AppFeed>(); serviceCollection.AddSingleton, AppChat>(); serviceCollection.AddSingleton(x => x.GetRequiredService>()); serviceCollection.AddSingleton(x => x.GetRequiredService>()); serviceCollection.AddSingleton(x => x.GetRequiredService>()); serviceCollection.AddSingleton(x => x.GetRequiredService>()); serviceCollection.AddSingleton(x => x.GetRequiredService>()); serviceCollection.AddSingleton(); serviceCollection.AddKeyedSingleton>(nameof(AppMap)); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); //战利品搜刮可视化 serviceCollection.AddSingleton(); return serviceCollection; } public static async UniTask BuildServiceProvider(IServiceProvider serviceProvider,CancellationToken cancellationToken=default) { cancellationToken.Register(() => { ModService.LoadAssetAsyncFactory -= YooAssetModHelper.LoadAsset; ModService.LoadAssetsAsyncFactory -= YooAssetModHelper.LoadAssets; YooAssetModHelper.PackagesManifestDictionary.Clear(); }); cancellationToken.Register(serviceProvider.GetRequiredService().Dispose); var playerSettings = new PlayerSettings(); if (PlayerPrefs.HasKey(nameof(PlayerSettings))) { var json = PlayerPrefs.GetString(nameof(PlayerSettings)); playerSettings = JsonConvert.DeserializeObject(json); Debug.Log("已读取到玩家设置"); } else { var json = JsonConvert.SerializeObject(playerSettings); PlayerPrefs.SetString(nameof(PlayerSettings), json); PlayerPrefs.Save(); Debug.Log("未读取到玩家设置,创建默认设置"); } var settingsWrapper = serviceProvider.GetRequiredService>(); settingsWrapper .Value = playerSettings; settingsWrapper.OnValueChanged += (_, x) => { var json = JsonConvert.SerializeObject(x); PlayerPrefs.SetString(nameof(PlayerSettings), json); PlayerPrefs.Save(); }; //初始化Log var logger = serviceProvider.GetRequiredService>(); BIT4Log.OnLog += (x) => { logger.LogInformation(x); }; BIT4Log.OnWarning += (x) => { logger.LogWarning(x); }; BIT4Log.OnException += (x) => { logger.LogCritical(x,x.Message);}; logger.LogInformation("Hello World"); var loginLogger = serviceProvider.GetRequiredService>(); loginLogger.LogInformation("正在加载本地化支持"); try { var localize = serviceProvider.GetRequiredService(); serviceProvider.GetRequiredService(); await localize.ChangeLanguageAsync(playerSettings.Language) .TimeoutWithoutException(TimeSpan.FromSeconds(1)) ; loginLogger.LogInformation("本地化加载完成"); await UniTask.Delay(100, cancellationToken: cancellationToken); } catch (Exception e) { loginLogger.LogError(e, $"加载本地化支持失败:{e.Message}"); await UniTask.Delay(1000, cancellationToken: cancellationToken); } loginLogger.LogInformation("正在加载设置..."); //获取Unity设置 serviceProvider.GetRequiredService(); loginLogger.LogInformation("正在初始化Mod..."); await ModService.Initialize(loginLogger); loginLogger.LogInformation("正在从本地文件夹加载Mod..."); await YooAssetModHelper.LoadMods(loginLogger); loginLogger.LogInformation("正在加载物品..."); await serviceProvider.GetRequiredService().InitializeAsync(loginLogger); loginLogger.LogInformation("正在加载菜单场景..."); await serviceProvider.GetRequiredService().StopMapAsync(); //初始化玩家动画 var animationFactory = serviceProvider.GetRequiredService(); await animationFactory.InitializeAsync(); //场景高亮 serviceProvider.GetRequiredService(); //场景互动门 serviceProvider.GetRequiredService(); //载具 serviceProvider.GetRequiredService(); //座位系统 serviceProvider.GetRequiredService(); //实体生成 serviceProvider.GetRequiredService(); //场景电梯 serviceProvider.GetRequiredService(); //场景物品服务 serviceProvider.GetRequiredService(); //初始化玩家 var playerFactory = serviceProvider.GetRequiredService(); serviceProvider.GetRequiredService(); //作弊器 serviceProvider.GetRequiredService(); //获取相机 serviceProvider.GetRequiredService(); //加载对话树中间件 serviceProvider.GetRequiredService(); // Minimap serviceProvider.GetRequiredService(); // 战利品 serviceProvider.GetRequiredService(); // 伤害服务 serviceProvider.GetRequiredService(); // NPC生成 cancellationToken.Register( serviceProvider.GetRequiredService().Dispose); // 自动回血 serviceProvider.GetRequiredService(); //建筑LOD serviceProvider.GetRequiredService(); // Zombie AI serviceProvider.GetRequiredService(); // Human AI serviceProvider.GetRequiredService(); // Shooter AI serviceProvider.GetRequiredService(); // AI传感器 serviceProvider.GetRequiredService(); // 标记系统 serviceProvider.GetRequiredService(); // 世界任务 serviceProvider.GetRequiredService(); // 撤离点 serviceProvider.GetRequiredService(); // 地铁 serviceProvider.GetRequiredService(); // Buff serviceProvider.GetRequiredService(); // 生存 serviceProvider.GetRequiredService(); // AI 开门 serviceProvider.GetRequiredService(); // App serviceProvider.GetKeyedService(nameof(AppMap)); // 世界范围对话 serviceProvider.GetRequiredService(); // 战利品搜刮可视化 serviceProvider.GetRequiredService(); return serviceProvider; } private async void Start() { DontDestroyOnLoad(gameObject); var source = new CancellationTokenSource(); destroyCancellationToken.Register(source.Cancel); var serviceCollection = BITApp.ServiceCollection = new ServiceCollection(); await AddProjectBServices(serviceCollection, source); //基本UI框架 serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(x => x.GetRequiredService()); serviceCollection.AddSingleton>(); //UX用户页面 serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton>(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton>(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton>(); serviceCollection.AddKeyedSingleton>(nameof(IUXInventory)); serviceCollection.AddKeyedSingleton>(nameof(IUXHud)); serviceCollection.AddKeyedSingleton>(nameof(IUXHud)); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton>(); serviceCollection.AddSingleton>(); serviceCollection.AddSingleton>(); serviceCollection.AddSingleton>(); serviceCollection.AddSingleton>(); serviceCollection.AddSingleton>(); serviceCollection.AddSingleton>(); // PDA serviceCollection.AddSingleton(); //UX独立页面 serviceCollection.AddSingleton(); //serviceCollection.AddSingleton(); var serviceProvider =BITApp.ServiceProvider= serviceCollection.BuildServiceProvider(); //初始化UX var uxService = serviceProvider.GetRequiredService(); await uxService.InitializeAsync(); uxService.Entry(); await BuildServiceProvider(serviceProvider,destroyCancellationToken); uxService.Entry(); serviceProvider.GetRequiredService(); serviceProvider.GetRequiredService(); serviceProvider.GetRequiredService(); serviceProvider.GetRequiredService(); serviceProvider.GetKeyedService(nameof(IUXInventory)); serviceProvider.GetKeyedService(nameof(IUXHud)); serviceProvider.GetKeyedService(nameof(IUXHud)); serviceProvider.GetRequiredService(); serviceProvider.GetRequiredService(); serviceProvider.GetRequiredService(); serviceProvider.GetRequiredService(); serviceProvider.GetRequiredService(); serviceProvider.GetRequiredService(); serviceProvider.GetRequiredService(); serviceProvider.GetRequiredService(); serviceProvider.GetRequiredService(); serviceProvider.GetRequiredService(); //加载屏幕空间提示 serviceProvider.GetRequiredService(); //加载控制台 serviceProvider.GetRequiredService(); //加载右键菜单 serviceProvider.GetRequiredService(); serviceProvider.GetRequiredService(); serviceProvider.GetRequiredService().SurvivalBuffs=new IBuff[] { new Hunger(), new Thirsty(), }; serviceProvider.GetRequiredService(); //本地化 serviceProvider.GetRequiredService(); serviceProvider.QueryComponents(out ILocalizationService localizationService); await localizationService.ChangeLanguageAsync(localizationService.CurrentLanguage); await serviceProvider.GetRequiredService().ChangeLanguageAsync(localizationService.CurrentLanguage); BITApp.WalkUntilInitialize.TrySetResult(); await destroyCancellationToken.WaitUntilCanceled(); ModService.Dispose(); serviceProvider.Dispose(); await serviceProvider.DisposeAsync(); //playerFactory.Dispose(); //uxService.Dispose(); } } }