如何让PC游戏实现分屏多人:Universal Split Screen 上手与自定义
【免费下载链接】UniversalSplitScreenSplit screen multiplayer for any game with multiple keyboards, mice and controllers.项目地址: https://gitcode.com/gh_mirrors/un/UniversalSplitScreen
两个人、一台电脑、一个晚上。Universal Split Screen 把只支持单人的PC游戏改造成分屏多人模式:画面一分为二,各自使用独立的键盘、鼠标和手柄,同时玩同一款游戏。它由一个 Windows 主程序和几个注入游戏的动态库组成,全程不需要改动游戏文件。
快速上手:下载现成包或克隆构建
最短路径是下载项目发布的现成构建包,解压后直接运行主程序。包里已经放好了主程序、注入器和 x86 / x64 两套钩子库,不用自己编译。
想自己构建的话,克隆仓库,用 Visual Studio 打开UniversalSplitScreen.sln:
git clone https://gitcode.com/gh_mirrors/un/UniversalSplitScreen构建只需注意一点:主程序按 x86 编译,钩子、注入器、引擎解锁器这几个组件要 x86 和 x64 都编。各项目的后构建步骤会自动改名并拷贝到主程序目录,编译完直接运行即可。
工作原理:输入中转站如何做到不破坏游戏
打个比方。程序相当于架在输入设备和游戏之间的一间“中转站”:每个玩家的键盘、鼠标都有编号,中转站认出按键来自哪个玩家,再把这条输入“投递”到对应的半边画面里。游戏依旧按原样接收输入,察觉不到屏幕已经被切分。
具体拆成五个部分,各司其职:
- 主程序(C# 编写):找到游戏窗口、把它切分,并决定每路输入送往哪块区域。
- HooksCPP.dll(输入钩子):注入游戏进程,拦下游戏用来“读键盘、读鼠标”的系统调用,让游戏只看到当前玩家的输入。所谓钩子,就是临时替换系统函数的行为,不碰游戏自己的代码。
- InjectorLoader(注入器):负责把上面的 DLL 送进游戏进程,提供 x86 和 x64 两个版本。
- StartupHook:在游戏启动阶段打补丁,其中包含对 FindMutex 调用的拦截,避免游戏通过互斥量发现“还有别的窗口”。
- SourceEngineUnlocker:解除 Source / GoldSrc 引擎的单实例锁,让同一引擎的游戏能开两局。
为什么这样做不破坏游戏:所有动作都发生在“系统 API 调用”这一层。游戏文件、存档、内存数据都不被修改,停止使用后一切恢复原状。
能做什么:支持的设备与预置游戏配置
输入设备数量基本不设上限:多套键盘、多个鼠标都行,手柄方面 XInput 游戏手柄和 DirectInput 摇杆都能接管。
游戏理论上适配任意 Windows 窗口化程序。仓库UniversalSplitScreen/Config/目录里带了 13 个预置配置,按类型大致是:
- 沙盒生存:Minecraft(1.14.3 与 Alternate 两个版本)、Terraria、Starbound、Stardew Valley、Dont Starve Together
- 动作射击:Borderlands2、NuclearThrone
- 策略模拟:Factorio、Prison Architect
- 引擎特调:Source Engine、GoldSrc Engine,另有一个 Rift
程序启动时会把配置目录里所有 JSON 读进顶部下拉框,选中哪份就套用哪份参数。想看内容,用任意文本编辑器打开文件即可。注意:仓库里的样例在Config/目录,运行时程序实际读取的是主程序 exe 旁边的config文件夹,发布包里已把样例放进去。
进阶自定义:如何导入自定义游戏配置
要玩的游戏没有现成配置时,复制一份最接近的游戏 JSON,把文件名改掉(文件名就是下拉框里显示的名字),然后重点调两组字段:
- 输入发送方式与钩子开关:
Send*开头的字段决定输入以什么形式发给游戏,Hook_*开头的字段决定拦截哪些系统读取函数。这是调参的第一旋钮——每个游戏读输入的方式不同,某位玩家没反应时,先对照这些字段逐项开关排查。 - DrawMouse(虚拟鼠标):有玩家只带键盘时,打开它,程序会在游戏里为这个人画出一个独立的鼠标光标,适合操作依赖鼠标的游戏。
保存文件后重启主程序,新配置就会出现在下拉框里。
⚠️ 避坑指南:五个高频问题与对策
- 某位玩家输入完全没反应——多半是游戏读输入的方式和钩子开关不匹配,比如游戏用 GetAsyncKeyState 读键盘而对应钩子没开。对照该游戏的 JSON 逐项开关
Hook_字段。 - 游戏只开出一个窗口、第二个实例被拦下——单实例锁在起作用。Source / GoldSrc 游戏靠 SourceEngineUnlocker 解锁;其他游戏由 StartupHook 拦截 FindMutex 调用,若仍被拦,检查配置里相关项是否开启。
- 两个鼠标互相打架或鼠标卡住不动——Windows 全局只有一个系统鼠标,和游戏内鼠标冲突。打开 DrawMouse 画独立光标,或启用“系统鼠标居中”选项让物理鼠标不再干扰。
- 注入失败或游戏闪退——架构不匹配(给 32 位游戏注了 64 位库)或权限不足(游戏以管理员运行而工具没有)。让注入器版本和游戏架构对应;游戏提权时,工具也用管理员运行。
- 独占全屏下分屏出现闪烁、撕裂——独占全屏绕过窗口管理器直接写显存。把游戏改成无边框窗口模式,画面立刻稳定。
社区与许可:MIT 协议下怎么参与
项目采用 MIT 许可(版权归 2019 年的作者 Ilyaki):可以自由使用、修改、再分发,只需保留版权声明。参与方式有三种:把遇到的兼容性问题提交为 issue、给还没人覆盖的游戏补一份 JSON 配置、或者直接提交代码修钩子、加功能。
想要自己构建和参与贡献,克隆开头给出的仓库地址、打开 .sln 即可。Universal Split Screen 目前能覆盖的玩法已经足够多,缺的那个游戏配置,往往就是下一个可以贡献的东西。
【免费下载链接】UniversalSplitScreenSplit screen multiplayer for any game with multiple keyboards, mice and controllers.项目地址: https://gitcode.com/gh_mirrors/un/UniversalSplitScreen
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考