多人游戏的输入隔离
本地多人(分屏)时"两个手柄各操作各的角色"。
两个机制
| 机制 | 作用 |
|---|---|
| PlayerController 一人一个 | 每个 Controller 有独立 InputComponent |
| IMC 按玩家隔离 | 每个玩家的 LocalPlayer 子系统独立 |
每个玩家自己的 PlayerController::SetupInputComponent 里绑定自己的 IA——框架自动隔离,不用担心串。
分屏的物理限制
UE 的分屏(Split Screen)自动处理 viewport 分配,每个玩家看自己的视角。手柄键天然带"哪个手柄"的信息:FKey 带 PlayerIndex(Gamepad1 / Gamepad2 …)。
常见坑
| 症状 | 原因 |
|---|---|
| P1 按键动了 P2 的角色 | 两个 Controller 共用了一个 InputComponent,Possess 错了 Pawn |
| IMC 只对 P1 生效 | 代码里用了 "GetPlayerController(0)",只加给了 P1 |
正确做法:每个 Controller 自己加自己的 IMC(在 Controller 的 BeginPlay 里用 GetLocalPlayer(),天然是自己的)。
网络多人( Dedicated Server)
服务器没有 LocalPlayer/输入——客户端把输入结果通过 RPC/复制上传:
- 移动用引擎内置的 CharacterMovementComponent 复制;
- 其他操作用 GA(GAS)或自定义 Server RPC。
Enhanced Input 的代码全在客户端,服务器不参与 IMC——这就是为什么"输入逻辑天然是本地的"(第 3 章的 IMC 管理 API 都在 LocalPlayer 子系统上)。
本章小结
- 本地多人:每 PlayerController 独立绑定 + IMC,框架自动隔离。
- 分屏由引擎处理;手柄键天然带 PlayerIndex。
- 网络多人:输入在客户端,结果走 RPC/复制上传。
