创建按钮
创建Button
节点, 勾选属性 Toggle mode
创建脚本
- 在按钮上创建gb脚本
- 在脚本中键入如下代码:
@export var action: String = "ui_accept" # 要重映射的动作名称 [项目设置->输入映射] 中的名称
- 在gb脚本的
_ready()
方法中键入如下代码:func _ready(): # set_focus_mode(0) # 将按钮设置为不可获取焦点 set_process_unhandled_key_input(false) # 关闭未声明按键的监听 text = "%s" % InputMap.action_get_events(action)[0].as_text() # 按钮显示文字
- 并在信号中添加
toggled
响应_on_toggled(button_pressed)
, 代码如下:func _on_toggled(button_pressed): # 按下为true 未按下为false set_process_unhandled_key_input(button_pressed) if button_pressed: text = "..." else: text = "%s" % InputMap.action_get_events(action)[0].as_text()
- 重写
func _unhandled_key_input(event)
方法:func _unhandled_key_input(event): # 拦截未绑定的按键 InputMap.action_erase_events(action) # 删除绑定按键 InputMap.action_add_event(action, event) # 添加按键 text = "%s" % event.as_text() #button_pressed = false set_pressed(false)
效果
- 按钮文字将会显示为某个按键
- 按下按钮后, 按钮文字将会变为
...
等待按键输入 - 按下任意按键后, 按钮文字变为按下的按键名, 按钮自动弹起
使用
func _input(event):
if event.is_action_pressed(action):
print_debug("input get")
完整代码
点击查看代码
extends Button
@export var action: String = "测试"
func _ready():
print_debug("ready")
set_focus_mode(0)
set_process_unhandled_key_input(false) # 关闭未声明按键的监听
display_key()
func display_key():
if len(InputMap.action_get_events(action)) == 0:
text = "空"
else:
text = "%s" % InputMap.action_get_events(action)[0].as_text()
print_debug(text)
func _on_toggled(button_pressed): # 按下为true 未按下为false
set_process_unhandled_key_input(button_pressed)
if button_pressed:
text = "..."
else:
display_key()
func _unhandled_key_input(event): # 拦截未绑定的按键
remap_key(event)
set_pressed(false)
#button_pressed = false
func remap_key(event):
InputMap.action_erase_events(action) # 删除绑定按键
if event.as_text() != "Escape": # 如果按下的是esc则不绑定任何按键
InputMap.action_add_event(action, event) # 添加按键
text = "%s" % event.as_text()
func _input(event):
if event.is_action_pressed(action):
print_debug("input get")