格闘ゲームの作り方・プログラムの解説 その11

今回はバトル中のステップやジャンプ、しゃがみについて説明します。

まずは、ステップについての説明を行いますが、ステップはPlayerが右か左の方向キーを2回連続で入力した時に、同様の処理を行いますので、ここでは右を入力した時の処理を説明します。

右方向キーの入力を受け付けているのは、PlayerControllerである「BP_Common_Controller」内のイベント「Input action Right input」で処理しています。

イベント「Input action Right input」では、右方向キーが入力されると”Pressed”の処理が開始され、変数”Right key”をTrueにし、マクロ「Controller ID Double」にてどちらのプレイヤーが入力したのか確認を行い、変数”Player Side”にて相手キャラクターの左右どちら側にいるのか確認を行います。

Player01が 右側にいる場合は、右方向キーの入力はガードすることになるため、変数”P01 Input Guard”をTrueにし、左側にいる場合はそのままマクロ「P01 Dash&Step」を処理します。

マクロ「P01 Dash&Step」では、変数”Begin Battle”を使用して、バトル中か確認を行った後、マクロ「P01 Action Flag For Step」の処理を開始してステップできる状態であるか確認しています。

マクロ「P01 Action Flag For Step」では、前回説明した、マクロ「 P01 Action Flag For Move」と同様の処理を行っていますが、一部違う点があるので説明します。

P01キャラクターが空中にいる場合の処理について、Z座標の位置が170cm以下で、かつZ方向の速度がマイナス、つまり落下している場合は、ステップとしての入力を許可するようにしており、これで、落下直後にステップできるようになります。

マクロ「P01 Action Flag For Step」で入力条件を満たした後は、次のブランチで変数”P02 In Air”を使用して、P02キャラクターがジャンプしているのかを確認しており、Trueであれば、変数”Distance of Char”で、キャラクター同士の距離を確認しており、10cmより大きければ、入力を許可しています。

逆に10cm以内であれば、P02キャラクターがジャンプしているので、P01キャラクターのほぼ頭上にいることになり、その後、変数”Player Side”の値が変わる可能性を考慮すると、前ステップかバックステップかの判断が難しくなるため、ステップの入力を禁止としています。

その後は、変数”P01 Count of Inputted key”やノード「Retriggerable Delay」を使用して、0.2秒以内に2回右方向キーが入力されるとその先の処理が可能になるようにしています。

さらに、変数”Change Side”を使用して、向きが変更される時のアニメーションが再生されていないかを確認しており、Falseであれば、変数”Player Side”の値に応じた処理を行います。

マクロ「P01 Dash&Step」を処理した後は、変数”Player Side”がTrueであれば、変数”P01 F Dash”と”P01 LS F Dash”をTrueにすることで、左側にいる時の前ステップであることを意味しており、Falseであれば、変数”P01 B Step”をTrueにすることで、バックステップを指定することになります。

次に、右方向キーを離した時は、イベント「Input action Right input」の”Released”ノードの処理を開始し、変数”Right Key”をFalseにするのと、変数”P01 Input-Guard”をFalseにしてガードの入力を解除します。

さらにカスタムイベント「Guard OFF」を処理していますが、このイベントは別の記事で説明します。

次にステップが成立した時の移動処理については、「BP_Common_Controller」のTickに繋がったノード「P01 Moving Speed non-Overlap」で処理をしており、変数”P01 F Dash”や”P01 B Step”がTrueになった時の移動量を設定しています。

具体的には関数「SetActorLocation」を使用して、変数”P01 F Dash”や”P01 B Step”がTrueの間、1フレーム当たり何cm移動させるのかを、変数”P01 F Dash LS”や”P01 F Dash RS”の値を参照して指定します。

この時に30fpsや60fps等、FPSが変動した時を考慮して、関数「Get World Delta Seconds」を使用して、1回のTick処理に必要な時間を参照し、その値に60を乗算してから、変数”P01 F Dash LS”等の値と乗算することで、FPSが変動しても、同じ移動量となるようにしています。

それでは次にステップ時のアニメーションの設定については、アニメーションブループリントである「Char01_AnimBP」内のイベント「Blueprint Update Animation」に繋がっている処理で変数”P01 F Dash”と”P01 B Step”を確認しており、Trueであれば、ノード「Do Once」を使用してそれぞれのアニメーションを再生しています。

バックステップについては、一瞬無敵とするため、カスタムイベント「D-BOX OFF」を使用してダメージを判定するコリジョンボックスの判定をOFFにしています。

コリジョンボックスの判定をOFFにする具体的な方法は、コリジョンのオブジェクトタイプを「Destructible」に変更しており、「Destructible」は全てのコリジョンボックスで「無視」と設定しているため、他のボックスとオーバーラップの判定をしないようにしています。

次に具体的なステップのアニメーションについては、アニメーションモンタージュを使用しており、その設定で「通知」を使用しています。

この通知はアニメーションノーティファイと呼ばれ、アニメーション再生中にイベントを発生させることができます。

今回のアニメーションでは、前方向のステップアニメーション終了間際に、変数の初期化を行う通知と、バックステップについては、無敵を解除する通知と変数の初期化を行う通知を設定しています。

通知の処理は、最初のブランチでPlayer01か02を確認後、それぞれのPlayerControllerを参照したイベントを処理しています。

ステップの変数初期化を行う処理は、PlayerControllerである「BP_Common_Controller」のカスタムイベント「Dash OFF」と「Step OFF」で処理しており、関係する変数をすべてFalseにしています。

次にジャンプを説明しますが、ジャンプは、「BP_Common_Controller」のカスタムイベント「Input Action Jump」で処理されており、上方向キーが入力されると”Pressed”のノードで変数”Upper key”をTrueに設定し、マクロ「Controller ID Double」にてどのPlayerから入力されたのか確認した後、ノード”P01 Jump”と”P02 Jump” でジャンプ処理を行っています。

ノード”P01 Jump”では、ノード”Sequence”と”Gate”を使用して、上方向キーが入力されるとGateをオープンして処理を継続し、離すと変数”Upper key”をFalseにしてGateをCloseする処理を行い、バトルが開始しているのかを確認する変数”Begin Battle”がTrueであれば、処理を継続します。

その後、以前説明したマクロ「P01 Action Flag for Move」でジャンプできる状態か確認し、処理を継続しますが、どちらの状態でも関数「Retriggerable Delay」を使用し、上方向キーが入力されている状態を維持している場合は、繰り返しジャンプするよう処理しています。

それから、関数「Delay」を使用していますが、これは上方向キーと必殺技の発動やダメージを受けるのがほぼ同時に起こると、ダメージを受けながらジャンプするなど、不具合が発生するので、1フレーム遅らせてからジャンプ処理をすることで、不具合を予防しています。

次に変数”Left Key”や”Right Key”、”Player Side”の値により、垂直にジャンプするのか、斜めにジャンプするのか決定しますが、キャラクター同士が離れて画面の端にいたり、ステージの端にいる場合は、斜め後ろへジャンプしようとしても垂直にジャンプするよう設定しています。

具体的にジャンプさせる方法は、関数「Launch Character」を使用しており、バトル前の初期設定で指定した、変数”P01 Jump to Left”、”P01 Jump to Right”、”P01 Jump to Vertical”を参照して、ジャンプの初速を指定しており、それまでキャラクターに発生していたX,Y,Z方向の速度は無関係になるよう、オーバーライドのチェックボックスをONにしています。

次にジャンプのアニメーション設定について説明します。

ジャンプのアニメーションはアニメーションブループリントである「Char01_AnimBP」内のステートマシンで設定しており、”Idle/Run”ノードから変数”In Air”がTrueになると、”JumpStart”ノードへ状態が移行し、ジャンプを開始するアニメーションを再生します。

次にジャンプを開始するアニメーション再生の残り時間が0.3秒以下になったところで、”JumpLoop”ノードへ移行し、 空中での待機アニメーションを再生します。

さらに、変数”In Air”がFalseになると着地したことになり、”JumpEnd”ノードへ移行し、着地用のアニメーションを再生します。

最後に、着地用のアニメーションの再生の残り時間が、0.3秒以下になると”Idle/Run”ノードへ戻ります。

これでジャンプの説明は終了し、しゃがみの説明をします。

しゃがみは、「BP_Common_Controller」のカスタムイベント「Input Action Crouch」で処理を行っており、方向キー下が入力されると”Pressed”のノードで 変数”Down Key”をTrueに設定し、マクロ「Controller ID Double」にてどのPlayerから入力されたのか確認した後、ノード”P01 Crouch”と”P02 Crouch ” でしゃがみ処理を行っています。

ノード”P01 Crouch”では、ノード”Sequence”と”Gate”を使用して、下方向キーが入力されるとGateをオープンして処理を継続し、離すと変数”Down key”をFalseにしてGateをCloseする処理を行い、バトルが開始しているかを確認する変数”Begin Battle”がTrueであれば、処理を継続します。

その後、マクロ「P01 Action Flag for Crouching」でしゃがむことができる状態か確認し、処理を継続しますが、どちらの状態でも関数「Retriggerable Delay」を使用し、下方向キーが入力されている状態を維持している場合は、繰り返し、処理を行い、しゃがんでいる状態を維持します。

その後、変数”P01 In Air”を確認し、地上にいることが確認できると関数「Crouch」を使用して、キャラクターがしゃがんだ状態になり、変数”P01 Crouch”をTrueにして、しゃがんだことが参照できるようにしています。

次に下方向キーを離すと、”Relesed”ノードの処理を開始し、変数”P01 Crouch”がTrueでしゃがんでいる状態であれば、関数「Un Crouch」でしゃがんでいる状態を解除し、変数”P01 Crouch”をFalseにします。

さらに、しゃがんでいるときは、打撃のダメージ判定を行っているコンポーネント”P01 D-Box”のZ軸の高さを80から60へ変更し、しゃがみ状態を解除した際には、60から80へ変更する処理を行っています。

それではしゃがんだ時のアニメーションについて説明します。

しゃがみのアニメーションはアニメーションブループリントである「Char01_AnimBP」内のステートマシンで設定しており、”Idle/Run”ノードから変数”Crouch”がTrueになると、”CrouchDown”ノードへ状態が移行し、しゃがみを開始するアニメーションを再生します。

次に、変数”Crouch”がFalseになるとしゃがみを解除したことになり、”CrouchDown_1″ノードへ移行し、立ち上がるアニメーションを再生します。

最後に、立ち上がるアニメーション再生の残り時間が、0.1秒以下になると”Idle/Run”ノードへ戻ります。

以上で説明は終了です。

次回はパンチやキックについて説明します。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください