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

今回はバトル中のパンチやキック、投げについて説明します。

パンチの入力を受け付けているのは、PlayerControllerである「BP_Common_Controller」内のイベント「Input action Punch」で処理しています。

イベント「Input action Punch」では、□ボタンが入力されると”Pressed”の処理が開始され、マクロ「Controller ID Single」にてどちらのプレイヤーが入力したのか確認を行い、マクロ「P01 Kind of P-action」の処理を開始します。

マクロ「P01 Kind of P-action」では、変数”Begin Battle”を使用して、バトル中か確認を行った後、変数”Press Button P”をTrueにして、ボタンが押されたことを参照できるようにし、マクロ「P01 Action Flag For P&K」の処理を開始して攻撃を開始できる状態であるか確認しています。

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

変数”P01 Guard L”と”P01 Guard R”をFalseにし、ガードしている状態であったとしても、攻撃ボタンが押された場合は、ガードを解除するよう設定しています。

マクロ「P01 Action Flag For P&K」で入力条件を満たした後は、次のブランチで変数”P01 Attacking-times in Air”を使用して、P01キャラクターのジャンプ中の攻撃回数が0回であることを確認しており、Trueであれば、変数”P01 Begin to Attack”をTrueにして攻撃を許可し、Falseであれば攻撃を禁止します。

その後、関数「Delay」を使用していますが、これは上方向キーと攻撃がほぼ同時に起こると、地上にいるときの攻撃アニメーションなのにジャンプするなど、不具合が発生するので、1フレーム遅らせてからジャンプやしゃがみなどのキャラクターの状態を確認することで、不具合を予防しています。

それから、攻撃の種類を分けるために、空中にいるのか、しゃがんでいるのか、立っているのかを確認後、さらに立っている時としゃがんでいる時は、キャラクター同士が、変数”Face to Face”を使用して向き合っているのか確認しており、Trueであれば攻撃を許可しますが、Falseであれば攻撃を禁止し、変数”P01 is Attacking”と”P01 Begin to Attack”をFalseにします。

ただし、キャラクター同士が向き合っていない場合でも、攻撃する側が地上にいて、相手のキャラクター方向を向いている時だけは、攻撃を許可するよう処理しています。

攻撃するキャラクターの状態が決定された後は、まず空中にいた場合、変数”P01 Kind of Attack”で攻撃の種類を特定し、変数”Middle Attack”で中段攻撃であることを設定します。

さらに、変数”P01 Attacking-times in Air”に”1″を加算して空中での攻撃回数をカウントした後、変数”Where to Attack”で攻撃場所を特定し、変数”P01 SP”に”0.04″を加算してSPゲージを増やします。

次にしゃがんでいる場合と立っている場合も処理しますが、立っている場合のみ、必殺技を使用しているか確認するための変数”Bullet Flag”と”SP Flag”を使用して、変数”P01 Kind of Attack”の値を指定します。

それでは、パンチのアニメーションについて説明します。

パンチのアニメーションの設定については、アニメーションブループリントである「Char01_AnimBP」内のイベント「Blueprint Update Animation」に繋がっている処理で変数”P01 Begin to Attack”を確認しており、Trueであれば、ノード「Do Once」を使用してカスタムイベント「P01 Attack Animation」の処理を開始します。

カスタムイベント「P01 Attack Animation」では、「BP_Common_Controller」内のカスタムイベント「Setting Attack Flag」で攻撃中であることを設定するために、変数”P01 is Attacking”をTrueにし、変数”Change Side”をFalseにすることで向きを変えるためのアニメーションをキャンセルしています。

カスタムイベント「Setting Attack Flag」を処理した後は、ブランチで必殺技を使用中か確認しており、使用中でなければ、変数”P01 Kind of Attack”の値を参照したSwitchノードで値に応じたアニメーションを再生しています。

アニメーションの再生は、ノード「Play Montage」を使用しており、ターゲットはキャラクターメッシュをセットして、使用するアニメーションモンタージュとセクションを指定します。

このキャラクターのアニメーションモンタージュは、立ちやしゃがみ、ジャンプ等の攻撃の種類でファイルが別れており、他にもダメージやガード、投げ用のモンタージュファイルが用意されています。

それでは、立ち攻撃用のアニメーションモンタージュで設定されているパンチのアニメーションで、アニメーションノーティファイが指定されており、アニメーションブループリントである「Char01 AnimBP」のAnimNotifyイベントで処理をしていますので説明します。

まず、”On Counter”と”Off Counter”については、変数”P01 Open Counter”をTrue/Falseにしており、Trueの間に攻撃を受けると、カウンターヒットとなります。

次に”Enable to Cancel”と”Unable to Cancel”については、変数”Enable to Cancel”をTrue/Falseにしており、Trueの間に必殺技の入力を完成させるとキャンセル必殺技が可能になります。

次に”Begin Attack”と”End Attack”については、カスタムイベント「Setting Attack Box On」やOFFを使用して、攻撃判定のコリジョンボックスが有効や無効になるように設定しており、具体的にはノード「P01 setting attack box」で処理をしています。

ノード「P01 setting attack box」では 、変数”P01 Char Num」を参照して、どのキャラクターを使用しているのか特定しており、その後、変数”P01 Kind of Attack”の値に応じて、コリジョンボックスを有効にしています。

例えば、立ちパンチであれば、関数「Set Collision Object Type」のターゲットをコンポーネント「P01 Arm L」に指定し、Object Typeを”PhysicsBody”に設定することで、有効にしています。

反対に、コリジョンボックスを無効にする場合は、Object Typeを”Destructible”にすることで、無効にしています。

最後に”OFF Anim”は、変数”P01 Begin to Attack”をFalseにしており、攻撃を開始した状態を解除しています。

これでアニメーションモンタージュの処理が終わったのでその後は、カスタムイベント「Setting Attack Flag OFF」の処理を開始し、攻撃関連の変数を初期化しています。

キックも同様の処理をしており、次に投げの説明をします。

投げの入力を受け付けているのは、PlayerControllerである「BP_Common_Controller」内のイベント「Input action Throw」で処理しています。

イベント「Input action Throw」では、L1ボタンが入力されると”Pressed”の処理が開始され、変数”Begin Battle”でバトルが開始されているかの確認後、マクロ「Controller ID Single」にてどちらのプレイヤーが入力したのか確認を行い、マクロ「P01 Action Flag for Throw」の処理を開始します。

マクロ「P01 Action Flag for Throw」では、変数”Press Button Throw”をTrueにして、ボタンが押されたことを参照できるようにし、その後、関数”Delay”で1フレーム遅らせて処理をすることで、ジャンプボタンをほぼ同時に押された時などに不具合が発生しないよう予防処理をしており、その後は、投げをできる状態にあるのか確認をして、すべてFalseであれば、継続して処理を行います。

マクロ「P01 Action Flag for Throw」を処理した後は、変数”P01 Begin to Attack”をTrueにして、投げのアニメーション処理を開始し、変数”P01 Kind of Attack”と”P01 SP”に必要な値を設定しています。

投げのアニメーションモンタージュでは、カウンターや投げ判定のコリジョンボックスをON/OFFする通知や攻撃関連の変数を初期化する通知の処理を行っています。

他の部分はパンチと同様の処理になりますので、今回の説明はこれで終了です。

次回は、必殺技の処理を説明します。

コメントを残す

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

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