GODOT4 按键重映射

发布时间 2023-10-16 22:56:28作者: 三甲苦笑

创建按钮

创建Button节点, 勾选属性 Toggle mode

创建脚本

  1. 在按钮上创建gb脚本
  2. 在脚本中键入如下代码:
    @export var action: String = "ui_accept"  # 要重映射的动作名称  [项目设置->输入映射]  中的名称 
    
  3. 在gb脚本的 _ready() 方法中键入如下代码:
    func _ready():
    	# set_focus_mode(0)  # 将按钮设置为不可获取焦点
    	set_process_unhandled_key_input(false) # 关闭未声明按键的监听
    	text = "%s" % InputMap.action_get_events(action)[0].as_text()  # 按钮显示文字
    
  4. 并在信号中添加 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()
    
  5. 重写 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")