UnityStarter 的 InputSystem 模块让你用一份可审查的 YAML 文件定义全部输入映射,并在运行时为每位本地玩家创建独立的输入服务——这就是"YAML 输入映射 + 本地多人"完整方案的核心:配置在提交前经过校验,玩家加入时按控制方案自动匹配手柄或键盘,动作按优先级上下文路由,彻底告别散落在各处的硬编码按键。
🎮 本指南面向新手,按"配置 → 单人 → 多人 → 高级特性 → 排错"的顺序带你跑通全流程。
上图是示例场景的运行效果:菜单项随玩家输入高亮移动,语言选项旁的 ←/→ 提示图标会根据当前活跃设备(ActiveDeviceKind)自动更新,这正是 YAML 映射驱动的典型产物。
一、为什么用 YAML 做输入映射
传统 Unity 项目的输入绑定常常散落在脚本属性、ActionAsset 和 PlayerPrefs 之间,难以审查、难以热修。InputSystem 模块把输入层拆成三层:
| 层 | 载体 | 职责 |
|---|---|---|
| 编写层 | input_config.yaml | 声明玩家槽位、控制方案、上下文、动作绑定 |
| 管理层 | InputManager | 校验配置并提交不可变快照,创建/移除玩家 |
| 玩家层 | IInputPlayer | 每位玩家独立拥有InputUser、动作资产、上下文与订阅流 |
带来三个直接好处:
- ✅可审查:YAML 是纯文本,Code Review 时按键改动一目了然
- ✅可校验:提交前做结构预检、schema 校验和 Unity Input System 注册表预检,错误在加载时暴露而不是运行中崩溃
- ✅可重绑:支持运行时按键重映射,并以带版本的 JSON Profile 持久化玩家自定义
模块主文档见 CycloneGames.InputSystem/README.md。
二、快速上手:三步跑通第一个输入
第 1 步:生成默认配置
打开菜单Tools > CycloneGames > Input System Editor,选择Generate Default。生成的工作副本包含两个玩家槽位、键盘鼠标与手柄两套控制方案、Gameplay上下文,以及Move、Confirm两个动作。
第 2 步:加载并初始化
把 YAML 作为TextAsset拖给引导脚本,调用InitializeWithResult加载。失败时结果对象会给出具体状态与问题清单,不会留下半成品状态:
_manager = new InputManager(); InputManagerInitializationResult result = _manager.InitializeWithResult(_configuration.text);第 3 步:加入玩家并推送上下文
IInputPlayer player = _manager.JoinSinglePlayer(0); var gameplay = new InputContext("PlayerActions", "Gameplay") .AddBinding(player.GetButtonObservable("Gameplay", "PlayerActions", "Confirm"), new ActionCommand(OnConfirm)); player.PushContext(gameplay);就这三步。完整的分步教程见 GettingStarted.md。
三、读懂 input_config.yaml:四个关键身份
一套可用的配置需要四个身份:玩家槽位(playerId)→ 上下文(Context)→ 动作图(ActionMap)→ 动作(Action)。运行时用context/map/action三者构成稳定标识,并生成确定性的哈希 ID,避免反复字符串查找。
官方示例配置 input_config.yaml 中,1 号玩家的移动动作同时声明了手柄左摇杆和键盘方向键两种来源:
- type: Vector2 action: Move updateMode: Polling deviceBindings: - "<Gamepad>/leftStick" compositeBindings: - name: 2DVector parts: - name: up path: "<Keyboard>/upArrow" - name: down path: "<Keyboard>/downArrow"常用字段速查:
| 字段 | 层级 | 说明 |
|---|---|---|
controlSchemes | 玩家 | 设备匹配方案,如KeyboardMouse、Gamepad |
bindingGroup | 方案 | 方案名与动作绑定组的桥梁 |
priority | 上下文 | 数值越大越先评估,Menu 常设 100 |
blocksLowerPriority | 上下文 | 为true时压制低优先级上下文派发 |
updateMode | 动作 | EventDriven适合按钮,Polling适合摇杆类连续值 |
longPressMs | 动作 | 长按完成时长,0表示禁用 |
字段完整语义见 Configuration.md。
四、本地多人:四种加入策略
这是本模块最有生产价值的部分——每位玩家拥有完全独立的输入服务,设备互不干扰。
| API | 设备策略 | 典型场景 |
|---|---|---|
JoinSinglePlayer(0) | 从未被占用的设备中匹配首选及备选控制方案 | 标准本地单人创建 |
JoinPlayerAndLockDevice(1, gamepad) | 要求给定设备参与匹配并独占占用 | 大厅中玩家锁定已知手柄 |
JoinPlayerOnSharedDevice(1) | 配对当前键盘(可选鼠标),不做独占 | 双人同键盘模式 |
StartListeningForPlayers(lockOnJoin) | 监听加入按键,谁按谁入局 | 本地多人大厅 |
双人同键盘的最小写法:
IInputPlayer player0 = await manager.JoinPlayerOnSharedDeviceAsync(0); IInputPlayer player1 = await manager.JoinPlayerOnSharedDeviceAsync(1);⚠️ 共享设备模式下,两个玩家槽位声明的动作避免重叠按键,除非产品刻意允许同时响应。
大厅模式下监听加入按键,配合OnPlayerInputReady事件在玩家就绪时生成角色;设备插拔则通过OnDeviceStatusChanged回调感知,可做断线暂停与恢复。完整多人流程参考示例脚本 GameInitializer_Sample.cs,它实现了四种启动模式:锁定单人、共享键盘、锁定大厅、共享大厅。
五、上下文优先级:菜单盖住游戏,加载锁住全部
输入冲突靠优先级上下文解决,无需手写 if-else:
- 更高的
priority先评估,blocksLowerPriority: true时低优先级上下文全部静默 CaptureContext(modalContext)用using作用域临时接管模态弹窗输入,作用域结束自动还原BlockInputScope()深度计数屏蔽全部输入,适合加载过场,异步场景放在try/finally中
using (player.BlockInputScope()) { // 加载期间所有玩家、所有上下文一律静默 }六、进阶:长按、组合键与按键重映射
- 长按:配置中设
longPressMs: 500,运行时订阅GetLongPressObservable与进度流,提前松开会发出-1便于收回进度条 - 组合键(Chord):
GetChordObservable(id1, id2, windowMs: 200f)识别两键同按,释放后自动复位 - 运行时重绑:
player.RebindAction(..., "<Keyboard>/space")立即生效;ExportBindingOverrideProfileJson/ImportBindingOverrideProfileJson把整套自定义导出为版本化 Profile,导入前先完整校验,不匹配则保留默认值
七、常见问题速查
| 症状 | 常见原因 | 解决办法 |
|---|---|---|
JoinSinglePlayer返回null | 无控制方案匹配、设备已被占用 | 检查deviceRequirements,用 Input Debugger 看设备占用 |
| 动作没有响应 | 上下文未推送、名字大小写不匹配、被更高优先级阻塞 | 使用带上下文限定的 getter,检查ActiveContextName |
| Polling 值一直为零 | 设备未配对、绑定被方案组过滤、控制路径写错 | 核对bindingGroups与控制路径 |
| 初始化失败 | YAML 解析或 schema 错误 | 查看result.Status、Validation.Issues定位具体条目 |
八、延伸阅读与关键路径
- 模块总览与架构:CycloneGames.InputSystem/README.md
- 配置字段详解:Configuration.md
- 运行时所有权与生命周期:RuntimeGuide.md
- 可运行示例与练习:Samples/README.md
- 管理器实现:InputManager.cs
- 玩家接口定义:IInputPlayer.cs
一句话总结:把按键写进 YAML,把设备交给控制方案,把状态交给优先级上下文——UnityStarter 的 InputSystem 让"支持键盘、手柄、双人本地、可重映射"从一周工作量变成一份配置文件的事。
【免费下载链接】UnityStarter
Production-ready modular Unity framework: UE-inspired Gameplay Ability System, zero-GC core, HybridCLR hot-update, Luban config pipeline,>项目地址:https://gitcode.com/gh_mirrors/un/UnityStarter
相关推荐
Apache Beam YAML UDF 完全指南:MapToFields、Explode、Filter、Partition 与多语言映射实战
Apache Beam YAML UDF 完全指南:MapToFields、Explode、Filter、Partition 与多语言映射实战 Beam YAM
大数据批处理流处理数据工程后端pandoc BibLaTeX 转 Markdown 实战:多卷本图书条目的字段映射与 CSL YAML 输出解析
pandoc BibLaTeX 转 Markdown 实战:多卷本图书条目的字段映射与 CSL YAML 输出解析 本篇文章以 pandoc 仓库中的黄金测试用
CLI文档开发者工具才 61 天,dsh-purge 就带着 7386 星冲上 GitHub 趋势榜
才 61 天,dsh purge 就带着 7386 星冲上 GitHub 趋势榜 2026 10 19,DeepSeek Harness 红队评测插件 dsh
dsh-plugin网络安全AI 安全治理模型安全红蓝对抗人工智能