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

今回は、キャラクターの向きについて説明します。

キャラクターの向きを変更するのは、下の画像のように、キャラクターの中心位置が左右入れ替わったことをトリガーに処理を開始しますが、例えば、空中にいる時は向きを変えないとか、P02のキャラクターがジャンプ中に、P01のキャラクターがP02の下を前ステップで通り抜けた場合は向きを変えない等、様々な制限があります。

具体的な処理は、「BP_Common_Controller」のイベントTickに繋がった、ノード「P01 Face To Face」で行います。

ノード「P01 Face To Face」では、ノード「Sequence」を使用して2つの処理をしており、まず下側の処理では、P01とP02のX,Y,Z軸に対する回転情報を関数「GetActorRotation」で取得しており、P01とP02のZ軸の回転情報を使用して、乗算を行った結果の値がマイナスであれば、お互いが向き合っていると判断し、変数”Face to Face”をTrueに設定しています。

次に上側の処理では、P01キャラクターの位置と速度の情報を関数「GetActorLocation」と「Get Velocity」で取得しており、それぞれYとZ軸の情報を、変数”P01 Y Position”、”P01 Z Position”、”P01 Y Velocity”、”P01 Z Velocity”へ代入しています。

その後は、P01とP02キャラクターのY軸上の位置を比較して、P01の値が大きければ、変数”Player Side”をTrueに設定し、P02の値が大きければ、Falseに設定します。

また、変数”Player Side”の値がTrueからFalseになったり、FalseからTrueになるなど変化があった場合は、ノード「Do once」を使用して、変数”Game-set”の値がFalseであれば、変数”Pre-Change Side”をTrueにして、向きを変更する準備をします。

その後は、キャラクターが空中にいる場合は、変数”P01 Dash After Landing”をTrueにして、着地後に前後のステップがあることを参照できるようにし、着地後にすぐステップした場合は、向きを変更するアニメーションを再生しないようにします。

さらに、変数”P01 Down”とP01 Stun”のどちらかがTrueだった場合は、変数”Damage Af Ch Side”をTrueにして、ダウンやスタンが解除されてから向きを変更するように処理します。

変数”Player Side”の後の処理から、キャラクターの向きを制御するノードとなり、まずは、変数”P01 In Air”を確認して、空中にいるのか判断しています。

この時、True側の処理が、キャラクターの向きをそのまま維持する処理へ向かっており、False側がP02キャラクターがいる方向へ向きを変更する処理へ向かっています。

ただし、変数”P01 In Air”がFalseの場合だけ、ノード「Sequence」を使用して、2つの処理を行っており、1つは、ノード「Do Once」を使用して、ダウンした場合のダメージ判定の無効化と、空中でダメージを受けた場合にコリジョンボックスのサイズを小さくする変更をしているので、元へ戻す処理をしています。

それでは、キャラクターの向きを制御する処理へ戻りますが、ここから表示する画像の「A」の方向へ向かう処理は、キャラクターの向きを維持し、「B」の方向へ向かう処理は、P02キャラクターがいる方向へ向きを変更する処理へ行きます。

ます、変数”P01 In Air”がFalseの場合は、変数”P01 F Dash”を確認して、Trueであれば向きを維持する処理へ向かい、Falseであれば、P02キャラクターがいる方向へ向きを変更する処理へ向かいます。

次に、変数”P01 In Air”がTrueの場合と変数”P01 F Dash”がTrueの場合は、変数”P01 Dash After Landing”の値を確認しており、Falseであれば向きを維持する処理へ向かい、Trueであれば、P02キャラクターがいる方向へ向きを変更する処理へ向かいます。

さらに、変数”P01 Dash After Landing”がTrueの場合は、再度変数”P01 F Dash”の値を確認しており、Falseであれば向きを維持する処理へ向かい、Trueであれば、P02キャラクターがいる方向へ向きを変更する処理へ向かいます。

そして、変数”P01 F Dash”がFalseの場合は、変数”P01 is Attacking”や”P01 Down”の値を確認して、攻撃やダウン中は、キャラクターの向きを維持する処理を向かいます。

次は、変数”P02 In Air”の値を確認して、P02キャラクターが空中にいるのか確認しており、空中にいる場合は、変数”Distance of Char”の値を確認して、キャラクター間の距離が60cmより小さい場合は、向きを維持する処理へ向かいます。

これは、めくり攻撃を成立させるために、キャラクターの中心軸の位置が左右入れ替わっても、即座に向きを変更しない条件としています。

次に、変数”P02 In Air”がFalseであれば、変数”P01 Stun”を確認し、スタン中はキャラクターの向きを変更しない処理へ向かいますが、その先で変数”P01 Damaged”や変数”P01 Damaged By T”を確認しており、スタン中にキャラクターの位置が入れ替わり、ダメージを受けた場合は、 相手キャラクターの方向へ向きを変更する処理を行います。

次に、変数”P01 Damaged”、”P01 Damaged By T”、”P01 KO”、”P01 Guard L”、”P01 Guard R”を確認して、ダメージやKO、ガードの状態であれば、変数”Damage Af Ch Side”の値を確認して、Trueであれば相手キャラクターの方向へ向きを変更し、Falseであれば、関数「SetActorRotation」を使用してキャラクターの向きを維持する処理を行います。

ダメージやKO、ガードの状態がFalseであれば、変数”Pre-Change Side”の値を確認し、Falseであれば、関数「SetActorRotation」を使用して相手キャラクターの方向へ向きを変更する処理を行いますが、この処理はバトルが始まる最初の処理やラウンドリセットが行われた場合に使用されます。

次に、変数”Pre-Change Side”がTrueであれば、相手キャラクターの方向へ向きを変更する処理を行うので、変数”Cross-up”と”Damage Af Ch Side”の値を初期化し、ノード「Do Once」を使用して、カスタムイベント「Change Side ON」の処理を開始し、変数”Pre-Change Side”の初期化と関数「SetActorRotation」を使用して相手キャラクターの方向へ向きを変更する処理を行います。

それでは、「BP_Common_Controller」のカスタムイベント「Change Side ON」について説明します。

カスタムイベント「Change Side ON」は、キャラクターの向きを変更する場合に、向きを変更するアニメーションを再生するか判断しており、ノード「P01 Change Side Flag」で処理しています。

ノード「P01 Change Side Flag」では、キャラクターが攻撃、ガード、ステップ、ダメージ、KOなどの状態になっていないか確認しており、Trueであれば、変数”Change Side”をFalseにするのと、カスタムイベント「Setting Attack-Flag OFF」を処理して変数の初期化を行います。

攻撃、ガード、ステップ、ダメージ、KOなどの状態が全てFalseであれば、変数”Change Side”をTrueにして、キャラクターの向きを変更するアニメーションを再生する処理を開始します。

キャラクターの向きを変更するアニメーションは、アニメーションブループリント「Char01_AnimBP」のイベント「 Blueprint Update Animation」に繋がった処理で、変数”Chage Side”を確認しており、Trueであれば、ノード「Do Once」を使用して、PlayMotageによる向きを変更するアニメーションを再生します。

このアニメーションモンタージュでは、通知の設定はしていません。

最後に、向きを変更した後は、変数”Player Side”の値に応じて、関数「Set World Scale 3D」を使用して、キャラクターメッシュの描画を鏡に写したような処理を行っています。

例えば、関数「Set World Scale 3D」を使わずにキャラクターの向きだけを変更した場合は以下の画像のようになるため、この処理は必要となります。

以上で説明は終了です。

次回はキャラクター同士が衝突した場合の処理について説明します。

コメントを残す

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

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