Files
ichni_Official/Assets/Scripts/UI/Base/KeyRebindButton.cs
SoulliesOfficial 6aa498f6be
2025-08-11 14:04:06 -04:00

83 lines
2.9 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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();
}
}
}
}