ビデオの内容紹介
前回、ステートマシンとは何かについて説明されていましたが、今回は、そのとおりにステートマシン本体を組んで行きます。(ステートマシンを制御する変数などについては、次回以降となります。)
原題 Introduction to Third Person Blueprint game – 10 – Building the AnimGraph
まず、コンテンツ ブラウザで CharacterAnimBP を開きます。
モードを「グラフ」にします。
スペースで右クリックして、メニューから [新規のステートマシンを追加する] を選択します。
ステートマシン名を Locomation (意味は「移動」くらいでしょうか) にします。
この Locomation をダブルクリックします (Locomotion の内部に入ります)。
ここで Entry から左クリックしながらドラッグして放すとメニューが表示されるので、そこから、[ステートを追加] を選択します。
この新たなステートに Idle_Walk_Run という名前を付けておきます。
このステートをダブルクリックして、ステート内部を開きます。
下のタブを [アセット ブラウザ] に切り替えて、アセット (ファイル) から Idle_Walk_Run をドラッグアンドドロップすると、
Idle_Walk_Run というステートによる最終的なポーズが、このアセットとなります。
ところで、この Idle_Walk_Run を制御するのは、前々回のチュートリアルで見たように、キャラクターの速度 (プレイヤーが動かすキャラクターの速度) でした。
そこで、その速度をここで供給することにします。つまり、プレイヤーの操作による「速度」 → その値を変数に入れる (=これは次回チュートリアルでやります) → この変数が Idle_Walk_Run のブレンドスペースの入力を変化させる (=これがこれからやろうとしていることです) → ブレンドスペースの入力によって最終的なアニメーションが決定される、という流れになります。
そのためには、Idle_Walk_Run のノードの Speed という入力ピンからドラッグして、メニューを開き、[変数へ昇格] をクリックします。
名前を Speed という変数にします。ここにゆくゆくはプレイヤーの操作による「速度」が入ることになります。
ここで、Locomotion に戻り、Locomotion ステートマシンと [最終アニメーション ポーズ] をリンクして、コンパイルしてみます。
そして、左側の [アニメーション ブループリント] タブの [デフォルト] 欄の Speed プロパティを上げていくと、その上のプレビューでキャラクターのポーズが変化します。
まだプレイヤーの操作によるものではありませんが、このように、変数 Speed の値によってアニメーションが変化できるようになったことが確認できます。つまり最初のステートがちゃんと動作することを確認できました。
次に、JumpStart というステートを作ります。JumpStart は、ジャンプが始まる時のアニメーションです。まず、Locomotion 内部に戻り、
Idle_Walk_Run ノードからワイヤーをドラッグして放し、表示されるメニューから、[ステートを追加] を選択して、JumpStart という名前を付けるだけです。
そして、この JumpStart をダブルクリックして、内訳を開き、
JumStart のためのアセット (アニメーション ファイル) をドラッグします。
次に、Idle_Walk_Run ステートから JumpStart ステートに向かう矢印についている丸いマークをダブルクリックして、transition (遷移) のルールを設定します。
transition (遷移) のルールとは、あるステートから別のステートに移行するための条件と考えることができます。
画面に表示されている [結果] ノードの [Can Enter Transition] (遷移に入ることができる) というピンからワイヤーをドラッグして放し、
メニューから [変数へ昇格] を選択。
その変数名に IsInAir? (空中にいるか?) という名前をつけます。
この IsInAir? という変数には、次回のチュートリアルで値を入れるようにします。
IsInAir? という条件が満たされれば、Idle_Walk_Run ステートから JumpStart ステートに移行することになります。つまり、キャラクターが空中に浮いていれば、ジャンプの始動アニメーションが実行されることになります。
次に、これまでと同じようなやり方で、JumpLoop というステートを作ります。
ここでも JumpStart と JumpLoop の間にあるルールのマークをダブルクリックして、移行の条件を設定します。ただし、今回のルールは、JumpStart のアニメーションが残り 10% になった時点で JumpLoop ステートに移行するというものです。そこで、スペースを右クリックしてメニューを表示させて、検索欄に timeremain などと入れます (ただし、[文脈依存] のチェックを取りました)。表示される TimeRemainng (比率) for ‘Jump_Start’ (Jump_Start について残っている時間)を選択します。
さらに、この TimeRemainng ノードからワイヤーをドラッグして放し、表示されるメニューで「<」を検索欄に入れて、Float < Float を選択します。
Float < Float の値を 0.1 (つまり 10%) にして、次のようにワイヤーをつなぎます。
これによって、JumpStart のアニメーションの残りが 10% より小さい場合に、JumpLoop ステートに移行することになります。
なお、Locomation 内部に戻って、ルールマークにマウスオーバーしても、今の設定が確認できます。
また、JumpLoop ステートをダブルクリックして、JumpLoop のためのアセットもこれまでと同じように設定します。
次に、JumpEnd ステートも作り、他のステートと結びます。
JumpEnd ステートをダブルクリックして、JumpEnd のためのアニメーション ファイルもセットします。
JumpLoop ステートから JumpEnd ステートへの遷移ルールを設定します。そのルールは、キャラクターが物理法則に従って落下して、もはや空中にはいなくなった時ということになるので、先に作った変数 IsInAir? を利用します。
「空中にはいない」のだからこれを否定する必要があります。スペースで右クリックして表示されるメニューで「!」を検索欄に入れて、NOT Boolean という関数を選択します。Not Boolean 関数は、その bool 値 (true または false) の反対の値 (true ならば false、false なら true) を返す関数です。
キーワード Boolean
「bool 型」という意味です。bool 型は変数のタイプの一種です。bool 型の変数がもてる値は true (正しい) と false (正しくない) のみです。もしもあるキャラクターが空中にいれば、IsInAir? という変数には true という値を入れることにします (次回チュートリアルで)。空中にいなければ、IsInAir? 変数には false を入れることにします。この bool 型の前に NOT をつけると、その値が反転します。つまり、IsInAir? 変数に false が入っていてそれに NOT をつけると true になります。なぜこのようなことをするのかと言えば、[結果] ノードの [Can Enter Transition] (遷移に入ることができる) というピンは、bool 型変数によって値が供給され、その値が true の場合しか受け付けない (それ以降実行されない) からです。だから false の場合は NOT をつけて true にしてから、そのピンに結びつけているのです。
さらに、JumpEnd ステートから Idle_Walk_Run ステートに移行するためのルールをセットします。ここでも JumpEnd のアニメーションが残り 10% を切った時に移行することにします。
最後に調整として、JumpStart から JumpLoop に移行するルールを 10% ではなく 50% にして、スムーズなアニメーションにしています。
今回はこれでお終いです。次回は、このステートマシンの前段階、つまり変数への値の入れ方などを学びます。お疲れ様でした。