在 AGM 中如何实现适配真实手柄摇杆的方向控制?

各位好,想和大家一起讨论关于手柄摇杆映射的问题。毕竟是action game maker,制作动作游戏,大家肯定更希望用手柄游玩,好的手感会对游戏起到非常大的帮助。

之前有在邮箱和Mr.BAZ讨论过一下。

目前AGM里的输入映射 对应摇杆是按键映射,不是真实的摇杆,这导致在映射里设置死区值无论设置多少都是无效的。他不会给摇杆识别的操作带来微妙的变化。这非常不妙。

举例

我只需要轻微推动一点点摇杆就能直接识别到按键触发。无法设置推动多少范围才识别到的死区阔值。

另外一个最糟糕的地方是串键非常严重。只要在摇杆轻微倾斜一点点就会识别到按dwon。


这对动作游戏来讲简直是不可接受的。

我测试了非常多的横版动作游戏,大部分游戏斜下后这个程度才能串键按出dwon,这非常合理且很符合直观感受。

目前AGM的映射摇杆里无法简单实现这个基础功能。于是我想着单独使用GD脚本去完成真实的摇杆操作。

但在过程中遇到很多问题,通常godot里面gd脚本设置摇杆后需要绑定player的底层代码, 但我的player是完全基于vs脚本去制作的。还没找到方法去让角色捆板上摇杆的上下左右移动。这应该如何去执行呢?

自己无法解决,想来这里和大家讨论一下,
在AGM里有没可以让摇杆真实适配的方法。这对动作游戏来讲实在太重要了。

附上 gd设置的摇杆代码。 系统后台可以识别到摇杆的存在。但如何绑定在player的操作映射上又是另一回事了。而且不知道绑定后是否也会和AGM默认那样被当做按键处理··· :crying_cat:

extends Node

@export var dead_zone:float = 0.08
@export var diagonal_threshold:float = 0.5

var joy_id:int = -1

func _ready():
	_scan_joypad()

func _scan_joypad():
	var joy_list = Input.get_connected_joypads()
	if not joy_list.is_empty():
		joy_id = joy_list[0]

func _process(_delta):
	if joy_id == -1:
		_scan_joypad()
		return

	var raw_x = Input.get_joy_axis(joy_id, 0)
	var raw_y = Input.get_joy_axis(joy_id, 1)
	var stick_vec = Vector2(raw_x, raw_y)

	# 每帧全部松开
	Input.action_release("UP")
	Input.action_release("DOWN")
	Input.action_release("LEFT")
	Input.action_release("RIGHT")

	if stick_vec.length() < dead_zone:
		return

	var normal = stick_vec.normalized()
	var strength = stick_vec.length()

	if strength >= diagonal_threshold:
		if abs(normal.y) > abs(normal.x):
			if normal.y < 0:
				Input.action_press("UP", true)
			else:
				Input.action_press("DOWN", true)
		else:
			if normal.x < 0:
				Input.action_press("LEFT", true)
			else:
				Input.action_press("RIGHT", true)

func bind_joy_device(target_id:int):
	joy_id = target_id