プレイヤーの入力を聞く¶
前回の 初めてのスクリプト作成 を踏まえて、ゲームのもうひとつの重要な機能である、プレイヤーにコントロールを与えることについて見ていきましょう。これを追加するには、Sprite.gd
コードを修正する必要があります。
Godotでは、プレイヤーの入力を処理するために、主に2つのツールが用意されています。
組み込みの入力コールバック。主に
_unhandled_input()
です。これは、_process()
のように、プレーヤーがキーを押すたびに Godot が呼び出す組み込みの仮想関数です。例えば Space を押してジャンプするような、毎フレームで発生しないイベントに反応するために使用するツールです。入力コールバックについて詳しくは、 Using InputEvent を参照してください。Input
シングルトン。シングルトンは、グローバルにアクセス可能なオブジェクトです。Godotはスクリプトでいくつかへのアクセスを提供しています。これは、毎フレーム入力があるかどうかを確認するのに適したツールです。
ここでは、Input
シングルトンを使用します。これは、プレイヤーがフレームごとに回転または移動したいかを知る必要があるからです。
回転させるために、新しい変数を使用する必要があります。これをdirection
とします。_process()
関数の rotation += angular_speed * 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 direction = 0;
if (Input.IsActionPressed("ui_left"))
{
direction = -1;
}
if (Input.IsActionPressed("ui_right"))
{
direction = 1;
}
Rotation += AngularSpeed * 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
とします。
このコードでシーンを実行すると、 Left と Right を押したときにアイコンが回転します。
「上」ボタンを押すと動く¶
キーを押した時だけ動くようにするには、速度を計算するコードを修正する必要があります。var velocity
で始まる行を、以下のコードに置き換えます。
var velocity = Vector2.ZERO
if Input.is_action_pressed("ui_up"):
velocity = Vector2.UP.rotated(rotation) * speed
var velocity = Vector2.Zero;
if (Input.IsActionPressed("ui_up"))
{
velocity = Vector2.Up.Rotated(Rotation) * Speed;
}
velocity
をVector2.ZERO
という値で初期化します。これはVector
型の組み込み定数の一つで、長さ0の2次元ベクトルを表します。
プレイヤーが"ui_up"アクションを押すと、velocityの値が更新され、スプライトが前に移動するようになります。
完全なスクリプト¶
参考までに、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
using Godot;
public class Sprite : Godot.Sprite
{
private float Speed = 400;
private float AngularSpeed = Mathf.Pi;
public override void _Process(float delta)
{
var direction = 0;
if (Input.IsActionPressed("ui_left"))
{
direction = -1;
}
if (Input.IsActionPressed("ui_right"))
{
direction = 1;
}
Rotation += AngularSpeed * direction * delta;
var velocity = Vector2.Zero;
if (Input.IsActionPressed("ui_up"))
{
velocity = Vector2.Up.Rotated(Rotation) * Speed;
}
Position += velocity * delta;
}
}
シーンを実行すると、左右の矢印キーで回転し、 Up を押して前進することができるはずです。
概要¶
要約すると、Godot のすべてのスクリプトはクラスを表し、エンジンの組み込みクラスの 1 つを継承します。クラスが継承するノードタイプによって、スプライトの場合ではrotation
や position
など、プロパティにアクセスできるようになっています。また、この例では使用しませんでしたが、多くの関数も継承しています。
GDScript では、ファイルの先頭に置いた変数は、クラスのプロパティで、メンバー変数とも呼ばれます。また、変数以外にも関数を定義することができますが、これはほとんどの場合、クラスのメソッドになります。
Godotは、クラスとエンジンを接続するために定義可能ないくつかの仮想関数を提供します。例えば、_process()
はフレームごとにノードに変更を適用し、_unhandled_input()
はユーザからキーやボタンを押すなどの入力イベントを受け取ります。他にもたくさんの仮装関数があります。
Input
シングルトンにより、コードの任意の場所でプレーヤーの入力に反応することができます。特に、_process()
のループで使用することになります。
次のレッスン シグナルの使用 では、スクリプトの中でノードにトリガーコードを持たせることで、スクリプトとノードの関係を構築します。