643 lines
27 KiB
C#
643 lines
27 KiB
C#
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<TKey,TValue>:Dictionary<TKey,TValue>
|
|
{
|
|
|
|
}
|
|
public static async UniTask<IServiceCollection> 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<ILocalizationService, LocalizationService>();
|
|
// 本地化Csv支持
|
|
serviceCollection.AddSingleton<CsvLocalizationService>();
|
|
|
|
serviceCollection.AddLogging();
|
|
serviceCollection.AddSingleton<IServiceCollection>(serviceCollection);
|
|
//初始化Log
|
|
serviceCollection.AddSingleton(typeof(ILogger<>),typeof( UnityLogger<>));
|
|
serviceCollection.AddSingleton<ILogger<IUXInitialize>>(x => x.GetRequiredService<IUXInitialize>());
|
|
//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<ISerializer>(serializer);
|
|
serviceCollection.AddSingleton<IDeserializer>(deserializer);
|
|
|
|
serviceCollection.AddSingleton<YooAssetModHelper>();
|
|
|
|
|
|
//物品实体初始化
|
|
serviceCollection.AddSingleton<ScriptableEntitiesService>();
|
|
|
|
|
|
//初始化状态机
|
|
serviceCollection.AddSingleton(typeof(IMicroStateMachine<>), typeof(MicroStateMachine<>));
|
|
|
|
//初始化数据监听
|
|
serviceCollection.AddSingleton(typeof(IWrapper<>), typeof(ValueWrapper<>));
|
|
|
|
//初始化服务
|
|
serviceCollection.AddSingleton(serviceCollection);
|
|
|
|
//对象池
|
|
serviceCollection.AddSingleton<IPoolService, UnityPoolService>();
|
|
|
|
//主循环
|
|
serviceCollection.AddSingleton<ITicker,GameTick>();
|
|
serviceCollection.AddSingleton<IMainTicker, UnityUpdateTick>();
|
|
serviceCollection.AddSingleton<IAfterTicker, UnityLateUpdateTick>();
|
|
serviceCollection.AddSingleton<IFixedTicker, UnityFixedUpdateTick>();
|
|
serviceCollection.AddSingleton<IAsyncTicker, AsyncTicker>();
|
|
serviceCollection.AddSingleton(cancellationTokenSource);
|
|
|
|
//网络
|
|
serviceCollection.AddSingleton<INetClient, KcpNetClient>();
|
|
serviceCollection.AddSingleton<INetServer, KCPNetServer>();
|
|
serviceCollection.AddSingleton<INetProvider>(x => x.GetRequiredService<INetClient>().NetProvider);
|
|
|
|
//玩家&实体
|
|
serviceCollection.AddSingleton<IEntitiesService, EntitiesService>();
|
|
serviceCollection.AddSingleton<GameMapPlayerService>();
|
|
|
|
//对话树
|
|
serviceCollection.AddSingleton<IDialogueService, DialogueService>();
|
|
//NodeCanvas对话树中间件
|
|
serviceCollection.AddSingleton<DialogueMiddlewareNodeCanvasDialogueTree>();
|
|
|
|
//地图
|
|
serviceCollection.AddSingleton<IGameMapService, GameMapService>();
|
|
//大厅
|
|
serviceCollection.AddSingleton<ILobbyServices>(x=>x.GetRequiredService<INetProvider>().GetRemoteInterface<ILobbyServices>());
|
|
//授权
|
|
serviceCollection.AddSingleton<IAuthorizeService>(x=>x.GetRequiredService<INetProvider>().GetRemoteInterface<IAuthorizeService>());
|
|
|
|
//玩家角色控制器服务
|
|
serviceCollection.AddSingleton<ICharacterService, CharacterService>();
|
|
//玩家生命值
|
|
serviceCollection.AddSingleton<IHealthService, HealthService>();
|
|
//玩家击倒服务
|
|
serviceCollection.AddSingleton<IKnockedService, KnockedService>();
|
|
var scriptablePlayerAnimation =await
|
|
ModService.LoadAsset<ScriptablePlayerAnimationFactory>("scriptable_player_animations");
|
|
//玩家动画
|
|
serviceCollection.AddSingleton<IHumanoidAnimationFactory>(scriptablePlayerAnimation);
|
|
serviceCollection.AddSingleton<IPlayerAnimationFactory>(scriptablePlayerAnimation);
|
|
// 玩家过渡动画
|
|
serviceCollection.AddSingleton<IHumanoidTransitionAnimationFactory>(await
|
|
ModService.LoadAsset<ScriptableHumanoidTransitionAnimationFactory>("scriptable_player_translation_animations"));
|
|
|
|
//注册实体工厂
|
|
serviceCollection.AddSingleton<IEntitiesFactory, EntitiesFactory>();
|
|
serviceCollection.AddSingleton<IPlayerFactory, PlayerFactory>();
|
|
serviceCollection.AddSingleton<INpcFactory, NpcFactory>();
|
|
|
|
//场景互动
|
|
serviceCollection.AddSingleton<IWorldInteractionService, UnityInteractionService>();
|
|
//场景可互动高亮
|
|
serviceCollection.AddSingleton<WorldHighlightService>();
|
|
//场景互动门
|
|
serviceCollection.AddSingleton<UnityDoorService>();
|
|
//载具系统
|
|
serviceCollection.AddSingleton<WorldCarService>();
|
|
//座位系统
|
|
serviceCollection.AddSingleton<IWorldSeatService, WorldSeatService>();
|
|
//实体生成
|
|
serviceCollection.AddSingleton<UnityEntitiesCreateService>();
|
|
//电梯
|
|
serviceCollection.AddSingleton<UnityElevatorService>();
|
|
//场景物品服务
|
|
serviceCollection.AddSingleton<IManagedItemService, ManagedItemService>();
|
|
//玩家配置
|
|
serviceCollection.AddSingleton<IPlayerData>(x=>x.GetRequiredService<INetProvider>().GetRemoteInterface<IPlayerData>());
|
|
serviceCollection.AddSingleton<IPlayerService>(x=>x.GetRequiredService<INetProvider>().GetRemoteInterface<IPlayerService>());
|
|
|
|
var keyMap =await ModService.LoadAsset<ScriptablePlayerKeyMap>("scriptable_player_key_map");
|
|
|
|
serviceCollection.AddSingleton<IPlayerKeyMap<InputAction>>(keyMap);
|
|
serviceCollection.AddSingleton<IUXKeyMap<InputAction>>(keyMap);
|
|
serviceCollection.AddSingleton<ICarKeyMap<InputAction>>(keyMap);
|
|
|
|
//任务
|
|
serviceCollection.AddSingleton<IQuestService, QuestService>();
|
|
|
|
|
|
//世界相机
|
|
serviceCollection.AddSingleton<WorldCameraService>();
|
|
|
|
//场景侦查
|
|
serviceCollection.AddSingleton<ISnapshotService, UnitySnapshotService>();
|
|
|
|
//Unity设置
|
|
serviceCollection.AddSingleton<UnitySettingService>();
|
|
|
|
//添加作弊器
|
|
serviceCollection.AddSingleton<CheatService>();
|
|
|
|
//购买商店
|
|
serviceCollection.AddSingleton<IBuyStationService, UnityBuyStationService>();
|
|
|
|
// Minimap
|
|
serviceCollection.AddSingleton<IWorldMinimapService,UnityMinimapService>();
|
|
|
|
//战利品
|
|
serviceCollection.AddSingleton<ILootService, UnityLootService>();
|
|
|
|
// NPC生成
|
|
serviceCollection.AddSingleton<INpcSpawnService, NpcSpawnService>();
|
|
|
|
// 子弹
|
|
serviceCollection.AddSingleton<IBulletService, BulletService>();
|
|
|
|
// VFX
|
|
serviceCollection.AddSingleton<VFXService>();
|
|
|
|
//伤害
|
|
serviceCollection.AddSingleton<IDamageService, UnityDamageService>();
|
|
|
|
//近战
|
|
serviceCollection.AddSingleton<IMeleeService, UnityMeleeService>();
|
|
|
|
// 本地化
|
|
serviceCollection.AddSingleton<UXLocalization>();
|
|
|
|
// 自动回血
|
|
serviceCollection.AddSingleton<PlayerAutoHealController>();
|
|
|
|
//建筑Lod
|
|
serviceCollection.AddSingleton<WorldChunkService>();
|
|
|
|
// Zombie AI
|
|
serviceCollection.AddSingleton<AIZombieService>();
|
|
|
|
// Human AI
|
|
serviceCollection.AddSingleton<AIHumanService>();
|
|
|
|
// Shooter AI
|
|
serviceCollection.AddSingleton<AIShooterService>();
|
|
|
|
// 自动四叉树
|
|
serviceCollection.AddSingleton(typeof(QuadTreeService<>));
|
|
|
|
// AI传感器
|
|
serviceCollection.AddSingleton<AISensorService>();
|
|
|
|
// 标记系统
|
|
serviceCollection.AddSingleton<IMarkService,UnityMarkService>();
|
|
|
|
// 世界任务
|
|
serviceCollection.AddSingleton<WorldQuestService>();
|
|
|
|
// 撤离点
|
|
serviceCollection.AddSingleton<UnityEvacuateService>();
|
|
|
|
// 地铁
|
|
serviceCollection.AddSingleton<UnitySubwayService>();
|
|
|
|
// Buff
|
|
serviceCollection.AddSingleton<UnityBuffService>();
|
|
|
|
// 生存
|
|
serviceCollection.AddSingleton<UnitySurvivalService>();
|
|
|
|
// AI 开门
|
|
serviceCollection.AddSingleton<AIOpenDoorService>();
|
|
|
|
// App
|
|
|
|
serviceCollection.AddSingleton<IChatService, ChatService>();
|
|
|
|
serviceCollection.AddSingleton<IAppClass<Net.Project.B.PDA.App.Map>>(x=>x.GetRequiredService<AppMap>());
|
|
serviceCollection.AddSingleton<IAppClass<Phone>, AppPhone>();
|
|
serviceCollection.AddSingleton<IAppClass<Quest>, AppQuest>();
|
|
serviceCollection.AddSingleton<IAppClass<Feed>, AppFeed>();
|
|
serviceCollection.AddSingleton<IAppClass<Chat>, AppChat>();
|
|
|
|
serviceCollection.AddSingleton<IAppClass>(x => x.GetRequiredService<IAppClass<Net.Project.B.PDA.App.Map>>());
|
|
serviceCollection.AddSingleton<IAppClass>(x => x.GetRequiredService<IAppClass<Phone>>());
|
|
serviceCollection.AddSingleton<IAppClass>(x => x.GetRequiredService<IAppClass<Quest>>());
|
|
serviceCollection.AddSingleton<IAppClass>(x => x.GetRequiredService<IAppClass<Feed>>());
|
|
serviceCollection.AddSingleton<IAppClass>(x => x.GetRequiredService<IAppClass<Chat>>());
|
|
|
|
|
|
serviceCollection.AddSingleton<AppMap>();
|
|
serviceCollection.AddKeyedSingleton<IUXMap,UXMap<AppMap>>(nameof(AppMap));
|
|
|
|
|
|
serviceCollection.AddSingleton<WorldRangedDialogueService>();
|
|
|
|
serviceCollection.AddSingleton<IAiDialogueService, MaxKbDialogueService>();
|
|
|
|
|
|
//战利品搜刮可视化
|
|
serviceCollection.AddSingleton<UnityLootContainerVisualService>();
|
|
|
|
return serviceCollection;
|
|
}
|
|
|
|
public static async UniTask<IServiceProvider> BuildServiceProvider(IServiceProvider serviceProvider,CancellationToken cancellationToken=default)
|
|
{
|
|
cancellationToken.Register(() =>
|
|
{
|
|
ModService.LoadAssetAsyncFactory -= YooAssetModHelper.LoadAsset;
|
|
ModService.LoadAssetsAsyncFactory -= YooAssetModHelper.LoadAssets;
|
|
YooAssetModHelper.PackagesManifestDictionary.Clear();
|
|
});
|
|
|
|
cancellationToken.Register(serviceProvider.GetRequiredService<IAsyncTicker>().Dispose);
|
|
|
|
|
|
|
|
var playerSettings = new PlayerSettings();
|
|
if (PlayerPrefs.HasKey(nameof(PlayerSettings)))
|
|
{
|
|
var json = PlayerPrefs.GetString(nameof(PlayerSettings));
|
|
playerSettings = JsonConvert.DeserializeObject<PlayerSettings>(json);
|
|
Debug.Log("已读取到玩家设置");
|
|
}
|
|
else
|
|
{
|
|
var json = JsonConvert.SerializeObject(playerSettings);
|
|
PlayerPrefs.SetString(nameof(PlayerSettings), json);
|
|
PlayerPrefs.Save();
|
|
Debug.Log("未读取到玩家设置,创建默认设置");
|
|
}
|
|
var settingsWrapper = serviceProvider.GetRequiredService<IWrapper<PlayerSettings>>();
|
|
settingsWrapper .Value = playerSettings;
|
|
settingsWrapper.OnValueChanged += (_, x) =>
|
|
{
|
|
var json = JsonConvert.SerializeObject(x);
|
|
PlayerPrefs.SetString(nameof(PlayerSettings), json);
|
|
PlayerPrefs.Save();
|
|
};
|
|
|
|
//初始化Log
|
|
var logger = serviceProvider.GetRequiredService<ILogger<Program>>();
|
|
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<ILogger<IUXInitialize>>();
|
|
|
|
loginLogger.LogInformation("正在加载本地化支持");
|
|
try
|
|
{
|
|
var localize = serviceProvider.GetRequiredService<ILocalizationService>();
|
|
serviceProvider.GetRequiredService<CsvLocalizationService>();
|
|
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<UnitySettingService>();
|
|
|
|
loginLogger.LogInformation("正在初始化Mod...");
|
|
await ModService.Initialize(loginLogger);
|
|
|
|
loginLogger.LogInformation("正在从本地文件夹加载Mod...");
|
|
await YooAssetModHelper.LoadMods(loginLogger);
|
|
|
|
loginLogger.LogInformation("正在加载物品...");
|
|
await serviceProvider.GetRequiredService<ScriptableEntitiesService>().InitializeAsync(loginLogger);
|
|
|
|
loginLogger.LogInformation("正在加载菜单场景...");
|
|
await serviceProvider.GetRequiredService<IGameMapService>().StopMapAsync();
|
|
|
|
//初始化玩家动画
|
|
var animationFactory = serviceProvider.GetRequiredService<IPlayerAnimationFactory>();
|
|
await animationFactory.InitializeAsync();
|
|
|
|
//场景高亮
|
|
serviceProvider.GetRequiredService<WorldHighlightService>();
|
|
//场景互动门
|
|
serviceProvider.GetRequiredService<UnityDoorService>();
|
|
//载具
|
|
serviceProvider.GetRequiredService<WorldCarService>();
|
|
//座位系统
|
|
serviceProvider.GetRequiredService<IWorldSeatService>();
|
|
//实体生成
|
|
serviceProvider.GetRequiredService<UnityEntitiesCreateService>();
|
|
//场景电梯
|
|
serviceProvider.GetRequiredService<UnityElevatorService>();
|
|
//场景物品服务
|
|
serviceProvider.GetRequiredService<IManagedItemService>();
|
|
|
|
//初始化玩家
|
|
var playerFactory = serviceProvider.GetRequiredService<IPlayerFactory>();
|
|
serviceProvider.GetRequiredService<GameMapPlayerService>();
|
|
|
|
//作弊器
|
|
serviceProvider.GetRequiredService<CheatService>();
|
|
|
|
//获取相机
|
|
serviceProvider.GetRequiredService<WorldCameraService>();
|
|
|
|
//加载对话树中间件
|
|
serviceProvider.GetRequiredService<DialogueMiddlewareNodeCanvasDialogueTree>();
|
|
|
|
// Minimap
|
|
serviceProvider.GetRequiredService<IWorldMinimapService>();
|
|
|
|
// 战利品
|
|
serviceProvider.GetRequiredService<ILootService>();
|
|
|
|
// 伤害服务
|
|
serviceProvider.GetRequiredService<IDamageService>();
|
|
|
|
// NPC生成
|
|
cancellationToken.Register( serviceProvider.GetRequiredService<INpcSpawnService>().Dispose);
|
|
|
|
// 自动回血
|
|
serviceProvider.GetRequiredService<PlayerAutoHealController>();
|
|
|
|
//建筑LOD
|
|
serviceProvider.GetRequiredService<WorldChunkService>();
|
|
|
|
// Zombie AI
|
|
serviceProvider.GetRequiredService<AIZombieService>();
|
|
|
|
// Human AI
|
|
serviceProvider.GetRequiredService<AIHumanService>();
|
|
|
|
// Shooter AI
|
|
serviceProvider.GetRequiredService<AIShooterService>();
|
|
|
|
// AI传感器
|
|
serviceProvider.GetRequiredService<AISensorService>();
|
|
|
|
// 标记系统
|
|
serviceProvider.GetRequiredService<IMarkService>();
|
|
|
|
// 世界任务
|
|
serviceProvider.GetRequiredService<WorldQuestService>();
|
|
|
|
// 撤离点
|
|
serviceProvider.GetRequiredService<UnityEvacuateService>();
|
|
|
|
// 地铁
|
|
serviceProvider.GetRequiredService<UnitySubwayService>();
|
|
|
|
// Buff
|
|
serviceProvider.GetRequiredService<UnityBuffService>();
|
|
|
|
// 生存
|
|
serviceProvider.GetRequiredService<UnitySurvivalService>();
|
|
|
|
// AI 开门
|
|
serviceProvider.GetRequiredService<AIOpenDoorService>();
|
|
|
|
// App
|
|
serviceProvider.GetKeyedService<IUXMap>(nameof(AppMap));
|
|
|
|
// 世界范围对话
|
|
serviceProvider.GetRequiredService<WorldRangedDialogueService>();
|
|
|
|
// 战利品搜刮可视化
|
|
serviceProvider.GetRequiredService<UnityLootContainerVisualService>();
|
|
|
|
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<UXModService>();
|
|
serviceCollection.AddSingleton<UXConsole>();
|
|
serviceCollection.AddSingleton<UXContextMenu>();
|
|
serviceCollection.AddSingleton<UXToolTips>();
|
|
serviceCollection.AddSingleton<UXRadialMenu>();
|
|
serviceCollection.AddSingleton<IUXHotKey>(x => x.GetRequiredService<UXRadialMenu>());
|
|
serviceCollection.AddSingleton<IUXSettings,UXSettings<IUXLobby, PlayerSettings>>();
|
|
|
|
//UX用户页面
|
|
serviceCollection.AddSingleton<IUXService, UXService>();
|
|
serviceCollection.AddSingleton<IUXLobby,UXLobby>();
|
|
serviceCollection.AddSingleton<UXLobbySearch>();
|
|
serviceCollection.AddSingleton<IUXHud,UXHUD>();
|
|
serviceCollection.AddSingleton<IUXInventory,UXInventory<IUXHud>>();
|
|
serviceCollection.AddSingleton<IUXInventorySwap, UXInventorySwap>();
|
|
serviceCollection.AddSingleton<IUXDialogue,UXDialogue<IUXHud>>();
|
|
serviceCollection.AddSingleton<IUXLoadingMap,UXLoadingMap>();
|
|
serviceCollection.AddSingleton<IUXInitialize,UXInitialize>();
|
|
serviceCollection.AddSingleton<IUXMapSelector,UXMapSelector>();
|
|
serviceCollection.AddSingleton<IUXControlMode,UXControlMode<IUXHud>>();
|
|
|
|
serviceCollection.AddKeyedSingleton<IUXMap, UXMap<IUXInventory>>(nameof(IUXInventory));
|
|
serviceCollection.AddKeyedSingleton<IUXMap, UXMap<IUXHud>>(nameof(IUXHud));
|
|
|
|
serviceCollection.AddKeyedSingleton<IUXInventoryPrompt, UXInventoryPrompt<IUXHud>>(nameof(IUXHud));
|
|
|
|
serviceCollection.AddSingleton<IUXItemInspector,UXItemInspector>();
|
|
serviceCollection.AddSingleton<IUXSnapshot,UXSnapshots>();
|
|
serviceCollection.AddSingleton<IUXSnapshotWindow,UXSnapshotWindow>();
|
|
serviceCollection.AddSingleton<IUXBuyStation,UXBuyStation>();
|
|
serviceCollection.AddSingleton<IUXCosmetics,UXCosmetics<IUXLobby>>();
|
|
|
|
serviceCollection.AddSingleton<IUXIndicator,UXIndicator<IUXHud>>();
|
|
|
|
serviceCollection.AddSingleton<IUXMark, UXMark<IUXHud>>();
|
|
|
|
serviceCollection.AddSingleton<IUXQuest, UXQuest<IUXHud>>();
|
|
|
|
serviceCollection.AddSingleton<IUXSurvival, UXSurvival<IUXInventory>>();
|
|
|
|
serviceCollection.AddSingleton<IUXChat, UXChat<IUXHud>>();
|
|
|
|
serviceCollection.AddSingleton<ISnackBar, UXSnackBar<IUXHud>>();
|
|
|
|
// PDA
|
|
serviceCollection.AddSingleton<IPDAService, UnityPDAService>();
|
|
|
|
//UX独立页面
|
|
serviceCollection.AddSingleton<IUXWaiting, UXWaiting>();
|
|
//serviceCollection.AddSingleton<IUXDialogue, UXAlert>();
|
|
|
|
var serviceProvider =BITApp.ServiceProvider= serviceCollection.BuildServiceProvider();
|
|
|
|
//初始化UX
|
|
var uxService = serviceProvider.GetRequiredService<IUXService>();
|
|
|
|
await uxService.InitializeAsync();
|
|
|
|
uxService.Entry<IUXInitialize>();
|
|
|
|
await BuildServiceProvider(serviceProvider,destroyCancellationToken);
|
|
|
|
uxService.Entry<IUXLobby>();
|
|
|
|
serviceProvider.GetRequiredService<IUXLoadingMap>();
|
|
serviceProvider.GetRequiredService<IUXHud>();
|
|
serviceProvider.GetRequiredService<IUXInventory>();
|
|
serviceProvider.GetRequiredService<IUXInventorySwap>();
|
|
|
|
serviceProvider.GetKeyedService<IUXMap>(nameof(IUXInventory));
|
|
serviceProvider.GetKeyedService<IUXMap>(nameof(IUXHud));
|
|
|
|
serviceProvider.GetKeyedService<IUXInventoryPrompt>(nameof(IUXHud));
|
|
|
|
serviceProvider.GetRequiredService<IUXControlMode>();
|
|
serviceProvider.GetRequiredService<IUXSnapshot>();
|
|
serviceProvider.GetRequiredService<IUXBuyStation>();
|
|
|
|
serviceProvider.GetRequiredService<IUXDialogue>();
|
|
|
|
serviceProvider.GetRequiredService<IUXService>();
|
|
serviceProvider.GetRequiredService<IUXCosmetics>();
|
|
|
|
serviceProvider.GetRequiredService<IUXIndicator>();
|
|
|
|
serviceProvider.GetRequiredService<IUXMark>();
|
|
|
|
serviceProvider.GetRequiredService<IUXQuest>();
|
|
|
|
serviceProvider.GetRequiredService<IUXSettings>();
|
|
|
|
//加载屏幕空间提示
|
|
serviceProvider.GetRequiredService<UXToolTips>();
|
|
|
|
//加载控制台
|
|
serviceProvider.GetRequiredService<UXConsole>();
|
|
//加载右键菜单
|
|
serviceProvider.GetRequiredService<UXContextMenu>();
|
|
|
|
serviceProvider.GetRequiredService<IPDAService>();
|
|
|
|
serviceProvider.GetRequiredService<IUXSurvival>().SurvivalBuffs=new IBuff[]
|
|
{
|
|
new Hunger(),
|
|
new Thirsty(),
|
|
};
|
|
|
|
serviceProvider.GetRequiredService<IUXChat>();
|
|
|
|
//本地化
|
|
serviceProvider.GetRequiredService<UXLocalization>();
|
|
|
|
serviceProvider.QueryComponents(out ILocalizationService localizationService);
|
|
await localizationService.ChangeLanguageAsync(localizationService.CurrentLanguage);
|
|
await serviceProvider.GetRequiredService<ILocalizationService>().ChangeLanguageAsync(localizationService.CurrentLanguage);
|
|
|
|
BITApp.WalkUntilInitialize.TrySetResult();
|
|
|
|
await destroyCancellationToken.WaitUntilCanceled();
|
|
|
|
ModService.Dispose();
|
|
|
|
serviceProvider.Dispose();
|
|
|
|
await serviceProvider.DisposeAsync();
|
|
|
|
|
|
//playerFactory.Dispose();
|
|
//uxService.Dispose();
|
|
}
|
|
|
|
}
|
|
} |