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;
}
}
}