とりとめも

藻類が学んだり感じたりしたことを未来の自分のために書き留めるところ

【Godotお勉強メモ】キー入力を処理するための設定(インプットマップ)

はじめに

おもむろにGodotを触り始めました。なにゆえ。

ひとまず2Dゲームのチュートリアルを終えました。
チュートリアルには説明がざっくりしている点が結構あったので、詰まった点や、頭を整理したい点をメモします。

まずはインプットマップについて。

バージョン:Godot 4.1.3

注意:チュートリアルの内容をなぞっているだけなので、役に立つ内容は特にないと思います

インプットマップとは?

バイスからの入力をゲーム中で処理するための仕組み(雑理解)
たとえば、

  • 入力されたキー:右(Right)
  • 仮想の名称(アクションという):"move_action"

を紐づけることで、スクリプト中では「move_action」が右入力を指すことにできる。

設定の流れは以下。

1.インプットマップで、キー入力とアクションの対応関係を定義
プロジェクト > プロジェクト設定 > 「インプットマップ」タブ  

インプットマップ

2.定義したアクションを使って、必要な処理を作る
チュートリアルでは具体的には以下の2パターンが紹介された。

2-1. スクリプト中でキー入力を使用する場合
組み込みクラスのInputを使って、Input.is_action_pressed("move_right")のように書く。
Boolを返してくれるので、_process()中でキーが入力された場合の処理を書けばいい。

コード内で使用する場合

2-2.ボタンクリックの代替操作にする場合
対象ボタンのShortcutプロパティにInputEventActionを設定し、対応するアクション(今回はstart_game)を設定する。

ボタンのshortcutプロパティ

補足

ボタンのクリック=シグナルの発火なので、Input.is_action_pressedを使ったやり方でも、ボタンクリックの代替は可能。
(ボタンを配置している以上、組み込みプロパティを使うのが望ましいのは間違いないけど)

具体的には、Playerをキー操作するときと同じく、_process()に以下のように書けばOK。

# チュートリアルのHUDシーンスクリプトを想定。子ノードとしてStartButtonを持つ。
# 作成済のEnter(start_gameアクション)と衝突させないように、move_rightアクションに対して、pressedシグナルを対応させる
func _process(delta):
    if Input.is_action_pressed("move_right"):
        $StartButton.emit_signal("pressed")

おしまい

シグナル関係の処理というか設定方法が頭の中でぐちゃぐちゃになります。
シグナルの設定・発火・接続それぞれについて、スクリプトでできたりGUIでできたりするので、その使い分けが整理できてないのが原因な気がする。

ちょっとずつ頑張りましょう。

参考リンク

docs.godotengine.org