BlockyLauncher —— 新一代模块化 Minecraft 启动器
Minecraft 启动器这块向来不缺选择:官启、HMCL、PCL、BakaXL,甚至美西螈启动器……那为什么还要自己写一个? 原因很简单——我想要一个真正模块化的启动器。不是那种"支持插件"但核心代码拧成一团的,而是从底层架构就允许每个功能被独立替换、独立扩展的。另外我也想用 .NET 10 + Avalonia UI 写点真正能用的东西,而不是整天写 CRUD(笑)。 于是就写了 BlockyLauncher。 整体架构 BlockyLauncher 分成五层: BlockyLauncher.Abstractions # 纯接口层 BlockyLauncher.PluginSDK # 插件开发 SDK BlockyLauncher.Framework # 框架核心实现 BlockyLauncher.Desktop # Avalonia 桌面入口 BlockyLauncher.Plugins.BuiltIn # 6 个内置插件 有趣的地方在于,「内置」插件其实走的是和第三方插件完全一样的加载通道。它们在 .csproj 里用 Private="false" ReferenceOutputAssembly="false" 引用,编译时不链接,运行时从 builtin/ 目录动态加载。也就是说,启动器的核心功能和第三方开发者将来写的一个插件,在框架眼里是没有区别的。其实这里是在致敬 Koishi。 这意味着什么? 这个这意味着启动器的核心跟 Minecraft 是完全解耦的!甚至创建 Minecraft 游戏实例、启动 Minecraft 游戏、管理 JVM 等等启动器的核心功能,都只是插件,只不过是预装的而已。你未来大可以写一个 Minecraft Server 启动器插件、Touhou 启动器插件,甚至 PS 主机游戏启动插件,并且可以将你自己的插件分发,其他人只需在“设置”里动动鼠标即可一键安装。 插件怎么工作 每个插件实现 IPlugin 接口的三个方法: public interface IPlugin { string Id { get; } Task InitializeAsync(IPluginContext context); Task OnServicesReadyAsync(IServiceProvider services); Task ShutdownAsync(); } InitializeAsync 里注册视图、服务、设置页面,这时候你只能用自己的东西 OnServicesReadyAsync 时所有服务都就位了,可以获取其他插件注册的服务来协作。 ShutdownAsync 收尸。 插件通过 IPluginContext 接触到框架提供的一切能力,包括但不限于注册导航页面、注册设置页面、发布/订阅事件、注册自己的服务给别人用。配合 manifest.json 描述元信息: ...