i just define my inputs in autoloaded script and never in "project settings".. this way i can add and refernce what inputs are used and already bound.
And i can just copy over this file and reference it in autoload and just keep reusing the same binds.
Tho you need to redefine your function calls that get called by the input events in each project.
But i dont have any checks like the OP is offering. FOr a larger project it sounds like a good idea. Tho, are there any big godot projects in development?

input_binder.gd
extends Node
var key_controls = {
"k_right": [KEY_RIGHT, KEY_D],
"k_left": [KEY_LEFT, KEY_A],
"k_forward": [KEY_UP, KEY_W],
"k_backward": [KEY_DOWN, KEY_S],
"k_jump": [KEY_SPACE],
"k_crouch": [KEY_CTRL],
"k_menu_main": [KEY_ESCAPE],
"k_tab_out": [KEY_TAB],
"k_sprint": [KEY_SHIFT],
"k_interact": [KEY_E],
"k_action_enemy_follow": [KEY_F],
"k_savegame": [KEY_R],
"k_loadgame": [KEY_T],
}
var mouse_controls = {
"m_left": [MOUSE_BUTTON_LEFT],
"m_right": [MOUSE_BUTTON_RIGHT],
"m_middle": [MOUSE_BUTTON_MIDDLE],
"m_w_up": [MOUSE_BUTTON_WHEEL_UP],
"m_w_down": [MOUSE_BUTTON_WHEEL_DOWN],
}
func _ready():
add_key_inputs()
add_mouse_inputs()
func _unhandled_input(_event):
if Input.is_action_pressed("k_menu_main"):
# Quits the game
get_tree().quit()
if Input.is_action_pressed("k_tab_out"):
# Disables/Enables mouse capture
if Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:
Input.mouse_mode = Input.MOUSE_MODE_HIDDEN
else:
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
func create_key_action(action_name:String,keycode:int):
InputMap.add_action(action_name)
var k = InputEventKey.new()
k.keycode = keycode
InputMap.action_add_event(action_name,k)
func add_key_inputs():
var ev
for action in key_controls:
if not InputMap.has_action(action):
InputMap.add_action(action)
for key in key_controls[action]:
ev = InputEventKey.new()
ev.keycode = key
InputMap.action_add_event(action, ev)
func add_mouse_inputs():
var ev
for action in mouse_controls:
if not InputMap.has_action(action):
InputMap.add_action(action)
for key in mouse_controls[action]:
ev = InputEventMouseButton.new()
ev.button_index = key
InputMap.action_add_event(action, ev)
and for example in my player.gd:
func _physics_process(delta: float) -> void:
# Add the gravity.
if not is_on_floor():
velocity += get_gravity() * delta
var input_dir := Input.get_vector("k_left", "k_right", "k_forward", "k_backward")
direction = (player_camera.transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
func _unhandled_input(_event: InputEvent) -> void:
if Input.is_action_pressed("k_interact"):
if Engine.time_scale < 1.0:
Engine.time_scale = 1.0
else:
Engine.time_scale = 0.1