プレイヤーの入力を聞く

Building upon the previous lesson 初めてのスクリプト作成, let's look at another important feature of any game: giving control to the player. To add this, we need to modify our Sprite.gd code.

../../_images/scripting_first_script_moving_with_input.gif

Godotでは、プレイヤーの入力を処理するために、主に2つのツールが用意されています。

  1. 組み込みの入力コールバックで、主に _unhandled_input()のようなものです。_process()のように、プレーヤーがキーを押すたびに Godot が呼び出す組み込みの仮想関数です。これは、例えば Space を押してジャンプするような、毎フレームで発生しないイベントに反応するために使用するツールです。入力コールバックについて詳しくは、 Using InputEvent を参照してください。

  2. Inputシングルトンです。シングルトンは、グローバルにアクセス可能なオブジェクトです。Godotはスクリプトでいくつかへのアクセスを提供しています。これは、毎フレーム入力があるかどうかを確認するのに適したツールです。

ここでは、Inputシングルトンを使用します。これは、プレイヤーがフレームごとに回転または移動したいかを知る必要があるからです。

For turning, we should use a new variable: direction. In our _process() function, replace the rotation += angular_speed * delta line with the code below.

var direction = 0
if Input.is_action_pressed("ui_left"):
    direction = -1
if Input.is_action_pressed("ui_right"):
    direction = 1

rotation += angular_speed * direction * delta

directionのローカル変数は、プレイヤーが曲がりたい方向を表す乗数です。0の値は、プレーヤーが左または右矢印キーを押していないことを意味します。1の値は、プレイヤーが右に曲がりたい、-1は左に曲がりたいことを意味しています。

これらの値を生成するために、条件とInputの使用を導入します。条件は、GDScriptの `` if``キーワードで始まり、コロンで終わります。条件は、キーワードと行末の間の式です。

このフレームでキーが押されたかどうかを確認するために、Input.is_action_pressed()を呼び出します。このメソッドは入力アクションを表す文字列を受け取り、アクションが押された場合はtrueを、それ以外の場合はfalseを返すようになっています。

上記で使用した2つのアクション、"ui_left" と "ui_right" は、すべてのGodotプロジェクトであらかじめ定義されています。それぞれ、プレイヤーがキーボードの左矢印と右矢印、またはゲームパッドのDパッドの左と右を押したときに起動します。

注釈

プロジェクト("Project") -> プロジェクト設定("Project Settings") から インプットマップ("Input Map") タブをクリックすると、プロジェクト内の入力アクションを確認・編集することができます。

最後に、directionをノードのdirectionの更新時の乗数として使用します。rotation += angular_speed * direction * deltaとします。

このコードでシーンを実行すると、 LeftRight を押したときにアイコンが回転します。

「上」ボタンを押すと動く

キーを押した時だけ動くようにするには、速度を計算するコードを修正する必要があります。var velocityで始まる行を、以下のコードに置き換えます。

var velocity = Vector2.ZERO
if Input.is_action_pressed("ui_up"):
    velocity = Vector2.UP.rotated(rotation) * speed

velocityVector2.ZEROという値で初期化します。これはVector型の組み込み定数の一つで、長さ0の2次元ベクトルを表します。

プレイヤーが"ui_up"アクションを押すと、velocityの値が更新され、スプライトが前に移動するようになります。

Complete script

参考までに、Sprite.gdファイル全体は次のようになります。

extends Sprite

var speed = 400
var angular_speed = PI


func _process(delta):
    var direction = 0
    if Input.is_action_pressed("ui_left"):
        direction = -1
    if Input.is_action_pressed("ui_right"):
        direction = 1

    rotation += angular_speed * direction * delta

    var velocity = Vector2.ZERO
    if Input.is_action_pressed("ui_up"):
        velocity = Vector2.UP.rotated(rotation) * speed

    position += velocity * delta

シーンを実行すると、左右の矢印キーで回転し、 Up を押して前進することができるはずです。

../../_images/scripting_first_script_moving_with_input.gif

概要

要約すると、Godot のすべてのスクリプトはクラスを表し、エンジンの組み込みクラスの 1 つを継承します。クラスが継承するノードタイプによって、スプライトの場合ではrotationpositionなど、プロパティにアクセスできるようになっています。また、この例では使用しませんでしたが、多くの関数も継承しています。

GDScript では、ファイルの先頭に置いた変数は、クラスのプロパティで、メンバー変数とも呼ばれます。また、変数以外にも関数を定義することができますが、これはほとんどの場合、クラスのメソッドになります。

Godotは、クラスとエンジンを接続するために定義可能ないくつかの仮想関数を提供します。例えば、_process()はフレームごとにノードに変更を適用し、_unhandled_input()はユーザからキーやボタンを押すなどの入力イベントを受け取ります。他にもかなりあります。

Inputシングルトンにより、コードの任意の場所でプレーヤーの入力に反応することができます。特に、_process()のループで使用することになります。

In the next lesson Using signals, we'll build upon the relationship between scripts and nodes by having our nodes trigger code in scripts.