カテゴリの最新記事

ジャンプ実装

横スクロールアクションに絶対必要な要素である横移動は完成した。
では縦移動はどうか。絶対必要とは言わないが、ほとんどの横スクロールアクションゲームではジャンプに準ずる行動が行えるだろう。ということで今回はジャンプの実装をする。

と、ジャンプをさせるだけならばさほど難しくはない。ジャンプ専用の便利なノードが用意されてるし、解説サイトも豊富にあるので。
じゃあ何が難しいのか。
……ジャンプ前の溜めモーション。
ボタンを押したら即跳ね上がるタイプのジャンプについては色々なところで説明されているのだが、ジャンプ前の屈伸もとい前兆動作のウェイトについて書いているところがほとんどない。何故なんだ、結構重要な要素だと思うのだが。
Unity弄ってた時も同じことでだいぶ躓いた。確かその時は前兆動作のアニメーションの再生具合をどうにかして取得してアニメーションが終わったことを確認したら跳ね上がらせる、という手法を取っていたのだが、なんだかあまりスマートではない方法だし他の要素が絡んできたらバグが出そうな予感しかしなかった。
まぁうにてぃの話は置いといて、解説サイトが見当たらないので自分で考えて組むしかない。あまりスマートな構造で作れるとは思わないが、とりあえず動けばいいの精神でノードを組んでいくことにしよう。

というわけで、まずジャンプ前動作とジャンプ中動作のFlipbookを作成する。以前と全く同じなので詳しい操作は過去記事参照。まぁSprite突っ込むだけなので。

前回の記事で移動時のアニメーション切り替え方法を変えたので、今回はそれに準じた形で作っていく。エニュメレーター・列挙型・Enumeration、呼び方は何でも良いが、前回作ったEnumファイルであるAnimationStateに新たに追加したいアニメーションについて記述しておく。それと同時にFlipbook変数を同じ数だけ作成し、コンパイル後Flipbookファイルを設定していく。

WS2016-07-10_21_15_45WS2016-07-10_21_40_26

今回はジャンプ前の溜め、上昇中、上昇から下降への中間、下降中の四つを追加した。
次はジャンプボタンが押された際の動作を記述していく……前に変数の作成をする。
地面にいるかどうかを見るためにBool変数の名前をIsFallingにでもして作成する。くどいようだが名前はなんでもいい。
そしてAnim State Machine関数のインプットにも同じく設定しておく。
イベントグラフに戻り、IsFallingノードを設置。これはキャラクターが空中にいるかどうかを判別してくれるノードである。が、Fallingとかいう名前の割には空中にいるかどうかしか判別してくれなくて、落下中かどうかは判別できない。IsFallingのステートを引っ張りAnimStateMachineのインプットに接続。

さて、アニメーションはともかくキャラクターをジャンプさせることにする。
幸いなことに、”Jump”というノードを使うだけで何も考えなくともキャラクターを飛ばすことができる。ActionMappingしたキーを呼び出す、インプットアクションを設置。インプットアクションのPressedをJumpノードへと繋げる。これだけでジャンプボタンを押すことでジャンプができるようになった。

次は上昇中と下降中で別のアニメーションを流すことにする。ただ、上手いこと上昇中下降中を判別する方法が分からなかったので、多少ゴテゴテするがZ軸方向の速度をCompareFloatで比較しながら再生するアニメーションを変えるという手法を取った。
そのCompareFloatも、本当はZ軸方向を-1~1の範囲で取ってから比較するという手法を取りたかったのだが、正規化で0~1は取れても-1~1を取る方法がいまいちわからなかったので、単純に速度の比較をしている。

WS2016-07-11_21_04_17WS2016-07-11_20_59_34

注意としては、GetVelocityはいちいちベクトルをXYZに分解するノードに繋がなくても、ピンの上で右クリックすれば最初から分解したピンを出せるということだろうか。これを知らなくて無駄にごちゃごちゃしたノード配置になってしまっていた……
CompareWithピンについては、変数で60を入れてその数値をちょこっと弄っている。数値に関しては気に入った動作になるまで適当に弄り続けること。今回は上昇速度が30より上のときは上昇モーション、30以下-60以上のときは中間モーション、-60未満のときは下降モーションを取ることにした。

WS2016-07-11_21_21_15

次はジャンプ予備動作についてだが……正直これもよくわからなかった。
bool変数を新たに作り、ジャンプキーが押されたらbool変数をtrueにする。Delayノードに繋げて暫く待機。bool変数をfalseにしつつジャンプ処理。AnimStateMachine関数の方で地上にいて尚且つ前述のbool変数がtrueのときにジャンプ予備動作を流す、という非常に頭の悪そうな処理しか思い浮かばなかった。もっとスマートな方法がありそうに思えるので、誰か知っていたら教えて頂きたい。謝礼は何もできませんが。

とりあえず、ノードの配置の仕方はともかくこれでジャンプ処理は完成した。
キャラクターの基本的な動作は作れただろうか。今度はゲーム内で使う素材でも作ろうかと思うので、しばらくBlueprint弄りは停滞するんだろうなぁ……

UE4

Posted by むいか