36 lines
1.8 KiB
Markdown
36 lines
1.8 KiB
Markdown
|
|
## UI 输入与事件订阅注意事项(本项目)
|
|||
|
|
|
|||
|
|
目标:记录本项目在 Input System + UI 面板切换下的常见坑,以及已落地的修复点,便于快速排错。
|
|||
|
|
|
|||
|
|
### 一、玩家输入(新 Input System)
|
|||
|
|
- 输入资源:`Assets/_Project/Input/Input_Player.inputactions`
|
|||
|
|
- 玩家控制器读取方式:通过 `PlayerInput.actions["Move"/"Look"/"Jump"/"Interact"]` 订阅回调缓存输入值。
|
|||
|
|
- 参考:[PlayerController.cs](file:///e:/Unity/Unity%20Program/Test_2022/Assets/_Project/Scripts/Player/PlayerController.cs)
|
|||
|
|
|
|||
|
|
### 二、UI 打开时“锁定 WASD/互动”的推荐方式
|
|||
|
|
- 采用统一服务禁用组件,而不是改 InputActions:
|
|||
|
|
- [PlayerControlLockService.cs](file:///e:/Unity/Unity%20Program/Test_2022/Assets/_Project/Scripts/Core/InputLock/PlayerControlLockService.cs)
|
|||
|
|
- 原因:
|
|||
|
|
- 不侵入 inputactions 配置
|
|||
|
|
- UI 多层叠加时可重入(owner 计数)
|
|||
|
|
|
|||
|
|
### 三、InventoryUI 的事件订阅坑(已修复)
|
|||
|
|
现象:
|
|||
|
|
- 打开/关闭 UI 多次后,热键触发次数异常、手持物显示/动画行为异常等。
|
|||
|
|
|
|||
|
|
根因:
|
|||
|
|
- 在 `performed += ctx => ...` 形式订阅时,OnDisable 用同样的 lambda 进行 `-=` 并不会移除原订阅(lambda 实例不同)。
|
|||
|
|
|
|||
|
|
修复:
|
|||
|
|
- 缓存 delegate 引用,在 OnDisable 用同一引用反订阅。
|
|||
|
|
- 相关实现:[InventoryUI.cs](file:///e:/Unity/Unity%20Program/Test_2022/Assets/_Project/Scripts/UI/InventoryUI.cs)
|
|||
|
|
|
|||
|
|
### 四、AI 平板 UI 与输入锁的协作(TabletController)
|
|||
|
|
- 打开平板时应同时:
|
|||
|
|
- 禁用玩家控制
|
|||
|
|
- 解锁并显示鼠标
|
|||
|
|
- 关闭平板时恢复
|
|||
|
|
- 本项目已接入统一锁服务,并在未拖引用时自动查找 PlayerController:
|
|||
|
|
- [TabletController.cs](file:///e:/Unity/Unity%20Program/Test_2022/Assets/_Project/Scripts/UI/TabletController.cs)
|
|||
|
|
|