VisualScript:2D上で物体を移動させる
もっとも基本的な2Dノードを動かす方法について解説。
キーボードの左右上下を押したときに画像が動くようにする。
前準備
プロジェクトを作成し、Node2D/KinematicBody2D/Iconのノードを追加する。
(ノードの追加については2Dプロジェクト作成手順:リンクを参照)
▲!で警告が出ているが気にしない。(衝突判定をしないだけなので問題ない)
KinematicBody2DにVisualScriptをアタッチ(追加)する。
入力マップ(インプットマップ)の確認
次にキー入力に対応したイベント名の確認をする。
プロジェクト → プロジェクト設定→入力マップを開く。
この一覧からキーボードの上下左右を押したときのイベント名を確認する。
管理人の環境ではui_left/ui_right/ui_down/ui_upとなっていた。
必要な変数の定義
移動させるために必要な変数を指定する。移動スピードの変数が必要になるため定義する。
メンバー:変数を作成の+を選択し、変数を1つ追加する。名前を「speed」とでもしておく。
右クリックをして「メンバーを編集」を選択。Type(型)はInt、値は150としておく。
キー入力の取得
これからの手順として、「キー入力の取得」と「取得したキー入力に応じた速度パラメータの方向を指定する」の2つ。
「キーの状態の取得」はaction関数で取得できる。何もないところで右クリックしてactionと入力しactionブロックを作成する。
Actionブロックを選択した状態で(デフォルト設定では)右にあるインスペクターウィンドウからActionの設定を「ui_right」にする。
同様に「ui_left」「ui_down」「ui_up」のActionブロックを作成する。
このAction関数の出力はbool型と呼ばれるものでTrue/Falseのいずれかが出力される。
速度パラメータの設定
キー入力を取得したbool型はこのままだと使いにくいため、1(True)/0(False)の数値の型(Int型)に変換する。
bool型をInt型に変換するにはConstruct IntBoolブロックを使用する。(追加方法はActionと一緒で右クリックでブロック名で検索)
これを全Action分追加してそれぞれを線でつなぐ。
次に動く方向を計算する。2次元において方向を示す変数はVector2という型を使用する。
Expressionブロックを追加する。これは任意の数式変換が出来るブロックである。Expressionのインスペクターウィンドウから、出力の型をVector2、入力の数を4、入力の変数の型をInt型に設定する。各入力の名前はleft/rightとしておくと分かりやすい。
Expressionの式の中には「Vector2(right-left,down-up)」を入力する。これでキー入力に応じて2次元ベクトルの向きのパラメータが設定される。
その後、出力されたVector2式をVector2 normalizedブロックで長さ1のベクトルに正規化する。
理由として、右と下の同時押しがあった場合、ベクトルの長さが√2≒1.414...になってしまい動く速度が1.4倍ほどになってしまう。
それを防ぐために長さ1のベクトルで正規化したうえでspeedをかける。
単純な掛け算もExpressionを使用する。入力がVector2とInt型のExpressionを作成する。定義した変数を使用したい場合はメンバーの変数からドラック&ドロップしてくると変数の値を取得するブロックが作成できる。これで速度パラメータの設定は終了。
速度パラメータからノードを動かす
いよいよノードを動かす制御を入れる。
KinematicBodyを動かす関数move_and_slideを追加して速度パラメータをそのままつなぐ。
ブロックの左上にある▽はこのブロックを動作させるタイミングを設定する場所である。
刻一刻と変化する処理は基本的に毎フレームごとに実行する。毎フレームごとにトリガー(動作のタイミング)を出力する関数はprocess関数になる。このブロックはメンバー:関数から追加できる。
最後にprocessブロックとmoce_and_slideブロックを繋いで終了。これを実行するとキー入力によって画像が動くプログラムとなっているはずである。