using System.Collections; using System.Collections.Generic; using Ichni.Menu; using TMPro; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.UI; namespace Ichni.UI { public class KeyRebindButton : SettingsUIElementBase { InputActionAsset inputActions => rebindingWindow.inputActions; public RebindingWindow rebindingWindow; public Button button; public TMP_Text keyText; public GameObject waitingForInputCover; public void SetUp(string title, string subtitle, string actionName, int bindingIndex) { base.SetUp(title, subtitle); button.onClick.AddListener(() => StartRebinding(actionName, bindingIndex)); } // 开始重绑定流程 public void StartRebinding(string actionName, int bindingIndex) { // 禁用Action Map以防在重绑定时触发动作 inputActions.Disable(); waitingForInputCover.SetActive(true); var action = inputActions.FindAction(actionName); if (action == null) { Debug.LogError($"在InputActionAsset中未找到名为 '{actionName}' 的Action。"); return; } // 开始交互式重绑定 rebindingWindow.rebindingOperation = action.PerformInteractiveRebinding(bindingIndex) // 可选:排除某些按键,例如不希望鼠标位置被绑定 .WithControlsExcluding("Mouse") .OnMatchWaitForAnother(0.1f) // 当重绑定完成时调用 .OnComplete(operation => { operation.Dispose(); // 重新启用Action Map inputActions.Enable(); waitingForInputCover.SetActive(false); // 更新UI显示 UpdateUIText(actionName, bindingIndex); // 保存新的键位设置 rebindingWindow.SaveBindings(); }) // 当重绑定被取消时(例如按Esc) .OnCancel(operation => { operation.Dispose(); inputActions.Enable(); waitingForInputCover.SetActive(false); }) .Start(); // 启动重绑定操作 } // 更新单个按钮的UI文本 public void UpdateUIText(string actionName, int bindingIndex) { var action = inputActions.FindAction(actionName); if (action != null) { string displayName = action.GetBindingDisplayString(bindingIndex, InputBinding.DisplayStringOptions.DontUseShortDisplayNames); keyText.text = displayName.ToUpper(); } } } }