using System.Collections.Generic; using UnityEngine; using UnityEngine.InputSystem; namespace BaseGames.Input { /// /// 输入冲突检测器(架构 04_InputModule §6)。 /// 扫描给定 Action 集合,返回所有绑定了相同按键路径的 Action 名称。 /// 挂载在与 RebindPanel 同一 GameObject 上(或作为子组件)。 /// public class ConflictDetector : MonoBehaviour { /// /// 返回存在冲突的 Action 名称集合。 /// 两个 Action 绑定了同一 effectivePath → 互为冲突。 /// /// 待扫描的 Action 序列(通常来自 Gameplay Map)。 public HashSet FindConflicts(IEnumerable actions) { var pathToActions = new Dictionary>(); foreach (var action in actions) { foreach (var binding in action.bindings) { // 跳过复合绑定父项(如 WASD 组合中的 "2DVector") if (binding.isComposite || string.IsNullOrEmpty(binding.effectivePath)) continue; if (!pathToActions.TryGetValue(binding.effectivePath, out var list)) pathToActions[binding.effectivePath] = list = new List(); list.Add(action.name); } } var conflicted = new HashSet(); foreach (var kv in pathToActions) if (kv.Value.Count > 1) foreach (var name in kv.Value) conflicted.Add(name); return conflicted; } } }