把 NGU IDLE 放进独立桌面:汉化、挂机与游戏内原生辅助面板

2026-10-14 更新:直接打开原版完整设置

原生侧栏只移植了常用的 23 个开关,不是完整版 Injector。需要挂机地图、装备、分配配置、阈值等细项,请打开 原版完整辅助页面,沿用桌面自身的账号密码。

页面上方有“打开原版 Injector”“回到游戏”和“保存快照”。在原版窗口的“冒险”页选择目标区域;返回按钮隐藏设置窗口,但不关闭辅助、不改变挂机配置。游戏内也可以按 F4 打开原版设置。

本次增加了受桌面同一账号保护的视图切换接口:只接收打开原版、返回游戏和本地快照三种指令,没有任意命令执行或修改文件的接口。HTTPS 加密到腾讯云,FRP 加密到本机,内部端口只监听回环地址。原版窗口在 Wine 中另有主线程消息泵,避免窗口显示出来却无法点击。

因此下文“不增加 HTTP 接口”的描述指此前的原生侧栏版本;现在增加的是这层小型、鉴权的视图切换桥,不是把游戏或 Injector 的全部逻辑迁移到网页。

NGU IDLE 是一个适合长期挂机、偶尔回来看进度的单机游戏。我想要的不是把主桌面远程出去,而是让游戏在独立桌面里持续运行,自己从浏览器进入;汉化和辅助功能也应该留在同一个游戏画面里,不必在几个窗口之间来回切换。

这篇文章介绍我的实际方案:Ubuntu 上的独立容器桌面、Windows 版 NGU IDLE、Proton、汉化与 NGUInjector,以及一个新做的游戏内右侧操作面板。当前入口是 idle.bismih.cn,直接连接腾讯云,不再经过 Cloudflare CDN 或 Access,也不需要 GitHub 登录。远程桌面自身的账号密码仍然保留,仅供本人使用;本文不是公开云游戏服务,也不提供游戏文件或账号。

入口更新(2026-10-13):原来的 idle.bismih520.com 只负责跳转到新域名。游戏、汉化、辅助面板与存档的位置都没有改变。这次调整的是访问链路,不是重新部署游戏。

NGU IDLE 汉化游戏画面,右侧展开原生挂机助手,显示总开关、自动存档、战斗和任务
实际运行画面:右侧面板和游戏在同一个 Unity 窗口里。

一、先分清:游戏运行在哪,浏览器做什么

游戏实际运行在自己的 Linux 电脑上。容器中的虚拟桌面与主桌面分离,不挂载宿主的 X11、Wayland、音频服务或整个家目录。游戏、Proton 环境和存档放在独立的持久化目录,重建容器时不用重新创建游戏进度。

浏览器(桌面账号密码登录)
       → 腾讯云 HTTPS 入口 → 加密 FRP 隧道
       → 本机回环端口 → 独立容器桌面 → NGU IDLE

浏览器接收桌面视频,并把鼠标、键盘输入送回去。关闭页面只会断开观看,不会关闭游戏;电脑关机、休眠或容器停止则会中断运行。FRP 只负责链路,不负责游戏存档。腾讯云上的中转端口只监听回环地址,不能把一个裸露的远程桌面端口当作安全入口。

DNS 使用直接 A 记录指向腾讯云,Caddy 处理公开 HTTPS 并自动维护证书,再反向代理到本机回环地址的 FRP 端口。去掉的是 Cloudflare 的中间转发和 GitHub 登录流程,不是 TLS 加密,也不是桌面密码。网页、文件目录和 WebSocket 端点都需要桌面认证;WebSocket 还校验来源域名。

首次打开新入口时,浏览器会提示输入桌面账号密码。登录信息只私下交给使用者,不写进博客、URL 或前端脚本。由于新域名是另一个站点,旧域名的 Cloudflare 登录状态不会自动变成新域名的桌面登录状态。

如果复用这条线路,反向代理的最简结构可以是:

idle.example.cn {
    reverse_proxy 127.0.0.1:4004
}

前提是后端本身已经启用密码认证,且 4004 只绑定回环地址;不要为了省一次登录,在公开反向代理里替所有访客自动填入桌面密码。Caddy 的 WebSocket 代理与流式连接说明可参考官方文档。

少一层中间链路并不保证在每个网络里都更快。实际画面流畅度还取决于本机到腾讯云的上行、观看设备的网络、编码负载和浏览器解码;这次首先把路径改成便于直接比较的腾讯云入口,再用同一网络实际体验。

这是正常的独立桌面方案,不是隐藏进程,也不改变电脑管理者的权限。使用自己的游戏账号和文件,远程访问仍要遵守所在设备和网络的使用规则。

二、准备游戏与独立的 Proton 环境

  1. 先用自己的 Steam 账号安装 Windows 版 NGU IDLE,并确认原存档可以正常读取。
  2. 把这个游戏和需要的 Proton 运行环境复制到专用目录。不要把整个 Steam 库、其他游戏存档或个人家目录都挂进容器。
  3. 给这份游戏建立独立的 STEAM_COMPAT_DATA_PATH,不要和主桌面的游戏共用同一个 Wine 前缀。
  4. 首次安装汉化或辅助前,备份游戏目录、AppData/LocalLow 中的存档和 Injector 配置。备份目录不要放进公开网页。

我的运行实例没有启动 Steam 客户端来完成云存档同步,主要依靠已验证的本地存档恢复。不要把“能进入游戏”理解成“Steam 云存档已经同步”。回到主桌面版本前,应先确认要保留哪一份进度。

三、汉化和 Injector:位数匹配,比一键脚本更重要

这里的游戏是 64 位 Unity Mono 程序。我使用 BepInEx 5.4.23.5 的 Windows x64 包,在副本中加载汉化与 NGUInjector 4.1.7 的中文版本。安装目录是游戏可执行文件所在位置,运行后通过 BepInEx/LogOutput.log 检查插件有没有真正加载。BepInEx 的位数选择和安装说明可以看官方文档。

在 Proton/Wine 下,还需要让 winhttp 先使用插件附带的实现,例如:

WINEDLLOVERRIDES=winhttp=n,b

这次没有执行压缩包里的外部进程注入脚本,而是由游戏内的 BepInEx 桥接插件加载已有 DLL。桥接插件等存档加载完成后再启动 Injector,避免在主菜单阶段访问尚未初始化的角色对象。

Injector 的自动战斗、资源分配和配置格式仍来自原项目。新面板并没有重新写一套挂机引擎,也没有修改游戏金币、等级或存档数值。

四、为什么要把辅助窗口搬到游戏内

原来的设置界面是 WinForms 独立窗口。通过浏览器看远程桌面时,打开它会转移焦点;手机上切回游戏尤其不方便。只给网页加一个浮层也不够,因为网页按钮还得绕一圈才能控制游戏。

现在增加一个 BepInEx 插件 NativeInjectorPanel.dll,在游戏进程里创建 Unity 原生 Canvas、按钮和可滚动列表。右侧只留一个“挂机助手”入口;展开后是紧凑的小面板,点击右上角 × 或按 F1 即可收起,游戏始终是同一个窗口。布局使用 CanvasScaler 和右上锚点,具体思路可参考Unity 的多分辨率 UI 文档。

分类 已经接入的操作
常用 挂机总开关、自动存档、自动战斗、自动任务
资源 能量、魔法、第三资源、NGU 难度、Wandoos、愿望、胡须、挖掘机管理
冒险 泰坦、区域回退、仅狙击 Boss、ITOPOD 目标与推进
进阶 世界树、烹饪、背包整理、自动重生、消耗品购买、卡片使用

一共接入 23 个开关,底部还有本地快照按钮。它们调用 Injector 原来的属性 setter,由原来的保存方法写入 settings.json;面板不是只改变按钮颜色。复杂的装备数组、分配配置编辑器和阈值表单尚未迁移,需要继续使用原有配置。

会改变目标、消耗资源或重生的选项,需要在五秒内再点一次才开启。切换分类或收起面板取消待确认操作。插件启动不替用户开启功能,沿用已有设置;当前实例保留自动存档和战斗,自动重生、购买消耗品、使用卡片仍是关闭状态。

五、REA 在这次改造中做了什么

REA 是分析工具,不是弹窗组件库。这次用 REA 6.4.0 对实际安装的 DLL 做静态身份检查,确认它是托管程序集,并取得文件 SHA-256 与模块 MVID。没有通过分析工具执行目标 DLL。

npm exec --yes --package=rea-agents@6.4.0 -- \
  rea inspect-managed-artifact /path/to/NGUInjector.dll --format json

该版本的完整成员检查触及元数据表示预算,返回“不可用”。REA 在这里完成的是身份核验,没有完成成员分析;具体的 Main.Start、Main.Update 和设置保存 CIL,随后用 Mono.Cecil 独立静态核验。

核验后,Harmony 只在内存里替换这两个方法中打开旧设置窗口的三处调用,并关闭原来重叠的状态文字。F2 的总开关、F3 的保存,以及 Injector 的周期任务继续使用原逻辑。原 DLL 文件没有改写。插件锁定所检查版本的 SHA-256 和 MVID;换了 Injector 版本就拒绝套用补丁,必须重新核验。

六、操作方法与源码复用

  • 展开 / 收起:点游戏右侧“挂机助手”,或按 F1;不用再 Alt+Tab。
  • 暂停辅助:点“挂机总开关”,或按 F2。暂停辅助不等于暂停游戏。
  • 保存:点底部“保存本地快照”,或按 F3。快照落在 Injector 的 NGUSave.txt 和 NGUSave.json;不要把它们公开。
  • 浏览器截获功能键时:先点游戏画面获取焦点;也可以直接点面板按钮,不依赖键盘快捷键。
  • 连接失败:先使用新入口并确认桌面密码;如果页面能打开却没有画面,再检查运行电脑是否开机、游戏容器与 FRP 是否在线。不要再排查 Cloudflare Access 或 GitHub 授权,这两者已经不参与当前链路。

下载原生面板源码与编译脚本。压缩包只包含自写的 C# 插件、编译脚本和许可证,没有游戏、Injector DLL、账号、存档或中转密钥。它不是通用外挂:只适配本文核验的版本。

在拥有同版本游戏和依赖的开发环境中,安装 Mono 编译器,解压源码后编译:

export GAME_DIR="/path/to/your/NGU IDLE"
bash build.sh

停止游戏并备份之后,把生成的 NativeInjectorPanel.dll 放入 BepInEx/plugins/PrivateDesktop/,重新启动,检查日志出现 Native Unity drawer ready。原 Injector 需要已经在同一游戏进程中被正确加载。回退时只移走这个新增插件,再重启游戏,不动游戏存档。

七、挂机资源与验收

这个实例为容器设了 2 CPU、3 GiB 内存上限,游戏渲染上限 25 FPS、桌面传输上限 20 FPS。验收时内存约 1.14 GiB;当前没有透传 GPU,使用软件渲染,CPU 接近两核额度。这不是 RTX 4060 加速后的性能,也不是所有电脑都相同的占用。

面板对象只创建一次,状态每 250 毫秒刷新,收起时不生成网页请求。它不依赖另一个后台服务,也没有为了做按钮而增加一套 HTTP 控制接口。

已实际检查:侧栏展开与收起、四个分类和长列表滚动、总开关暂停与恢复后的配置落盘、进阶选项第一次点击不执行、本地快照生成、F1 不再弹出旧窗口,以及重启后恢复已有本地存档。原 DLL 和其他设置未因界面改造而被改写。上述交互验收使用桌面浏览器;手机上的操作体验仍需结合实际屏幕和网络继续调整。

最后,浏览器断开仍能继续挂机,前提是运行电脑保持开机。对这种放置游戏,稳定的存档、清晰的控制和可恢复的环境,比一味拉高画质或帧率更重要。

上一篇
下一篇