## 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)