最終確認日

Godotでモバイル向けにジョイスティックを実装する

調査

まずは他の人は何を使って実装しているかを調査する。

Asset Library

  • Virtual Joystick
    • Godot 4.2に対応している
    • 左右のジョイスティックがある

実装記事

仮想ジョイスティックを実装する

仮想ジョイスティックを作成するの通りにジョイスティックを実装してみる。

  • Control ノードは次のように配置した(左上が原点で問題なし)
    • Godotでモバイル向けにジョイスティックを実装する-1753258656146
    • 配置したら、Base と Handle は非表示にしておく。
  • スクリプトは記事の通りそのままコピペ
  • VirtualJoystick シーンを実行してみる
  • 画面の左側をタップするとジョイスティックが出てくる。

他のシーンに配置して使ってみる。

とりあえずまずはこのまま使ってみる。

  • Player.tscn で矢印キーで動くスクリプトを書いている。
  • get_movement_vector で移動方向を渡している。
    • ここに組み込む。
@export var joystick: VirtualJoystick

# 移動方向のVector2を返す.
func get_movement_vector():
    if DisplayServer.is_touchscreen_available():
        # タッチスクリーン専用の処理
        var vector2 = joystick.get_joystick()
        return vector2
    else :
        # 両方を押している場合は0を返す
        var x_movement = Input.get_action_strength("move_right") - Input.get_action_strength("move_left")
        var y_movement = Input.get_action_strength("move_down") - Input.get_action_strength("move_up")
        return Vector2(x_movement, y_movement)

Godotでモバイル向けにジョイスティックを実装する-1753259553575

これで次のような動きができた。

virtual_joystick2

調整する

  • 画面のどこを触ってもジョイスティックが出るようにしたい。
    • _input(event) 関数の event.position.x * get_viewport().get_screen_transform().x.xevent.position.x < window_width に変更
  • ジョイスティックのサイズをもっと小さくする。
    • joystick_scale を調整
    • 画面の高さに基づいている部分を変えてもいいかも
  • ボタンなどをタップした時にも表示されてしまう
    • ジョイスティックが無効になるように MouseFilter をチェックしてから処理する
    • event.pressed の中でチェックしないと、タップ終了時がうまく取れなくなるので注意
func _input(event):
    # 入力がタッチかどうかを確認
    if event is InputEventScreenTouch:
        # タッチ開始時の処理
        if event.pressed:
            # 自分自身ではないControl、かつイベントをブロックするControlなら無視
            var hovered_control = get_viewport().gui_get_hovered_control()		
            if hovered_control != null:
                if hovered_control != self and hovered_control.mouse_filter != Control.MOUSE_FILTER_IGNORE:
                    return
            # ジョイスティックの処理...

実機で動かしてみた。いい感じ。

joystick3

おわりに

かわいい。

結構簡単に作れることがわかった。仮想ジョイスティックを作成するの記事に感謝。

サイトアイコン
公開日
更新日