「ステート」同士を「リンク」で繋ごう。
今回作成した3つのステートを、リンクでつないで遷移できるようにしていきましょう。
ステートのつなぎ方(遷移条件)を考えよう
今回の動きとしては、左右入力があれば「移動」ジャンプ入力があれば「ジャンプ」何も入力がなければ「待機」というのが基本となります。
「移動」の動きを考えると、左右入力があれば「待機」→「移動」、なければ「移動」→「待機」という動きで実現できそうです。
「ジャンプ」は、ジャンプの入力があれば「待機」→「ジャンプ」、そして移動中もジャンプしたいので、「移動」→「ジャンプ」も必要そうです。「ジャンプ」からは、地面に触れた時・・・つまり、「タイルに下方向が触れた」ときに「ジャンプ」→「待機」があれば良さそうです。
補足:ジャンプから移動にはつながなくてよいのか?
繋いでも問題はありませんが、移動キーを入力しながら着地した場合は、「待機」から「移動」への遷移が瞬時に行われるので繋ぐ必要はありません。
「待機」と「移動」をつなごう。
それでは、「待機」から左右の入力で「移動」、入力がなくなれば「待機」というリンクをつくっていきましょう。
1. 「待機」ステートを右クリックして、「リンクを追加」を選択します。
2. 待機から線がでるので、「移動」ステートをクリックしてリンクを作成します。これで待機と移動がリンクでつながります。次は左右の入力があったら移動になる、となるように切り替わる条件(遷移条件)を設定します。
3. 作成したリンクを選択し、インスペクター画面の「以下の入力操作がされた」のチェックボックスをクリックします。
4. 入力操作リストという新しい項目が出現するので「Array[InputCondition]…」となっている欄をクリックして展開します。
5. 展開された中にある、「+入力を追加」ボタンをクリックします。
6. 入力操作リストの中に<空>というものが出るので、クリックをして「新規 入力に関する条件」をクリックします。
7. 「<空>」が「入力に関する条件」に変わるので再びクリックして展開します。
8. 新しい項目が出現するので、以下のように設定します。
入力形式:4方向の任意の入力
上方向入力キー:なし
下方向入力キー:なし
左方向入力キー:左
右方向入力キー:右
入力の条件:押されている
9. これで、「左」か「右」の入力が「押されている」と待機から移動ステートに遷移するようになります。
10. 続いて、「移動」から「待機」に戻るリンクを作ります。「移動」を右クリックして「リンクを追加」します。
11. 作成された移動から待機へのリンクを選択します。
12. インスペクターで「何も入力されなかった」のチェックをオンにします。これで、何もボタンやキーが押されていない場合、移動から待機に遷移します。
ステージに配置してテストプレイしてみよう。
さて、床の上を左右に動くことだけであればできる状態になりました。stage1.tscnに配置して正常に動くか試してみましょう。stage1のタイルと同じレイヤー、BaseLayerにplayer.tscnを配置してテストプレイをします。
1. まずはエディター画面を「Script」から「2D」に切り替えましょう。
2. 続いてPlayerの変更を保存しましょう。playerタブを右クリックでシーンを保存します。
3. stage1.tscnにタブを切り替えます。
4. シーンウィンドウでBase(TileMapLayer)を選択します。
5. ファイルシステムのplayer.tscnをドラッグ&ドロップでエディター画面の床の上に配置します。
6. 以下の図のようBaseLayerの子としてPlayerが配置されていればOKです。
BaseLayer以外の子になってしまった場合は、シーンウィンドウ上でPlayerをドラッグで動かして場所を移動しましょう。エディター上の配置がずれてしまった場合は移動モードを使って位置を微調整しましょう。
7. 右上の「プロジェクトを実行」ボタンでテストプレイをしましょう。
8. うまく設定できていれば、左右を押せばキャラクターが歩き、はなせば止まるはずです。
動かない場合のチェック項目
キャラクターが動かない: MoveAndJumpSettingsの移動キーが正常に設定されているか確認しましょう。
キャラクターが移動アニメにならない:待機から移動のリンクと、移動ステートのアニメーション設定が正しいか確認しましょう。
キャラクターが待機に戻らない:移動から待機へのリンクが正しいか確認をしましょう。
ERROR: ID is not set in CameraTargetSettings.というエラーが出る。
これは、カメラ追従設定(CameraTargetSettings)があるのに中身が未設定ですよ、という警告です。
現在カメラ追従機能は設定していないので出てしまっています、第4章で設定するので、ここでは一旦無視してもらって大丈夫です。
「待機」「移動」と「ジャンプ」をつなごう
続いて、「待機」「移動」から「ジャンプ」をつなぎましょう。
1. タブをplayerに戻し、エディター画面を2DからScriptに戻しておきましょう。

2. 「待機」を右クリックしてリンクを作成し、「ジャンプ」につなぎます。
3. リンクを選択し、「以下の入力操作がなされた」のチェックボックスをオンにします。
4. 入力操作リストを展開し、「+入力条件を追加」、「<空>」、「入力条件を追加」と選択していきます。
5. 入力形式:入力に使う操作キー、入力キー:ジャンプ、入力の条件:押された瞬間と設定しましょう。これで待機中にジャンプボタンを押された瞬間、ジャンプに遷移します。
6. 続いて移動からジャンプをリンクでつなぐのですが、条件としては待機からジャンプのリンクと全く同一のもの「ジャンプキーが押された瞬間遷移」です。先ほどつくったリンクをコピーして使いましょう。
7. 待機からジャンプのリンクを右クリックして、「コピー」します。
8. 「移動」ステートを右クリックして、「リンクをペースト」します。
9. 新規リンク追加時と同じく、移動から線がでるので「ジャンプ」をクリックしてつなぎます。
10. 「移動」→「ジャンプ」のリンクをクリックして正しくコピーできているか軽くチェックしておきましょう、以下のような表示であれば成功です。
11. 「ジャンプ」→「待機」のリンクを作ります。ジャンプを右クリックしてリンクを作成し、待機につなぎましょう。
12. 「ジャンプ」から「待機」の遷移条件は床と接触したらで、入力とは関係がない条件です。今回は入力条件ではなく、「その他の条件」を使います。インスペクター画面の「+その他条件の追加」をクリックしてください。
13. その他条件の選択、という新しいウィンドウが立ち上がります。ここでは、入力以外の様々な条件を選択できます。今回は床タイルとの接触なので、「タイルと接触」を選択してください。
14. 条件の中身は、「このオブジェクトからみた接触方向」で「下」のチェックボックスをオンにします。これで、オブジェクトの下がタイルと接触したときだけ遷移するようになります。
15. 以下の図のようになっていればOKです。
16. 右上のテストプレイボタンでテストプレイをしてみましょう。待機中、移動中にZキーでジャンプできるか試してみます。正常に動作すれば完成です。
正常に動作しないときのチェックリスト
ジャンプできないとき:移動、待機からジャンプへのリンクが正しいか?ジャンプアクションでジャンプを実行が正しくチェックされているか?
着地できないとき:ジャンプから待機へのリンクが正しいか?