最近想到 godot 如何新增虛擬搖桿

上YT搜尋一下找到個影片

 

"Godot Mobile Joystick"

https://www.youtube.com/watch?v=j6H6Enuvb7s

 

測試後真的可行

把它整理出來給大家參考

 

 

首先需要新增一個 TouchScreenButton 物件

改名叫做 JoyStick

在 godot 中

物件名稱的重要性比 unity 3D 要重要很多

然後設定成圓圈圖案

 

再新增一個 sprite2D 物件

設定成一個小點圖案

 

然後設定 JoyStick 的 shape 為 circle shape

並且調整 radius 到圓圈大小範圍

 

 

都設定完成後應該會長這樣

 

然後在 JoyStick  上面新增程式

 

extends TouchScreenButton

# knob 是 搖桿中的中心點
@onready var knob = get_node("./JoyStickNob")
# 取得範圍最大半徑
@onready var max_distance = shape.radius

# 取得按鈕中心,用來計算方向的
var stick_center: Vector2 = texture_normal.get_size() / 2
# 是否觸碰中
var touched: bool = false

func _ready():
	# 非觸碰,不計算向量
	set_process(false)

func _input(event):
	# 有觸碰事件才計算向量
	if event is InputEventScreenTouch:
		if event.pressed:
			set_process(true)
		elif  not event.pressed:
			set_process(false)
			# 蘑菇頭回歸搖桿中心
			knob.position = stick_center
		
func _process(delta):
	# 每一偵的計算
	# 取得滑鼠位置-並將蘑菇頭與滑鼠位置重疊
	knob.global_position = get_global_mouse_position()
	print("LOG 374798 knob.global_position = ", knob.global_position)
	# 限制蘑菇頭位置不能超出搖桿
	knob.position = stick_center + (knob.position - stick_center).limit_length(max_distance)
	print("LOG 374700 knob.position = ", knob.position)

func get_joystick_dir() -> Vector2:
	# 取得蘑菇頭與搖桿中心向量 = 移動方向
	var dir = knob.position - stick_center
	# 避免一開始的蘑菇頭設定中心誤差
	if abs(dir[0]) + abs(dir[1]) < 10:
		dir = Vector2.ZERO
	print("LOG 374799 dir = ", dir)
	return dir

 

註解我都寫在上面了

應該是可以理解在做什麼

 

然後到要操控的物件裡面新增程式碼

 

func _physics_process(delta):

        # 取得JoyStick物件,這邊路經因人而異,我這邊是從根開始取得
        var joyStick = get_node("/root/World/Camera2D/CanvasLayer2/HBoxContainer/JoyStick")
        
        # 方向參數要 normalized
        dect = joyStick.get_joystick_dir().normalized()
        
        # 乘上速度,並且設定速度
        set_velocity(dect * 100)
        
        # 移動物件
        move_and_slide()

 

這樣應該就能看到物體隨著蘑菇頭方向移動了

 

 

這算是相當簡易的方法了

也不需要額外套件之類

給大家參考囉~