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

今回は、攻撃を受けた時のダメージ処理について説明します。

ダメージ処理は「BP_Char01」ブループリントのコリジョンボックスである、「Damage」と「Damage_for_Bullet」、「Damage_for_Throw」で判定しており、イベント「On Component Begin Overlap」で処理しています。

それでは、コリジョンボックス「Damage」のイベント「On Component Begin Overlap」から説明します。

コリジョンボックス「Damage」は、パンチやキックなどの打撃を受けると、イベント「On Component Begin Overlap」が発生し、Other Actorで攻撃してきたActorの値と、Other Compで攻撃してきたActorのどのコンポーネントかを取得し、マクロ「Judge of Damage」で処理を継続します。

マクロ「Judge of Damage」では、変数”Begin Judge for OL”でバトルが開始されたか確認を行い、Trueであれば、変数”Player01″でダメージを受けたのが、どのPlayerなのか確認を行います。

変数”Player01″がTrueであれば、次のブランチでOther ActorのコントローラーとPlayer Indexが0のコントローラーと同じであるか確認を行い、Falseであれば、間違いなくPlayer02であると断定し、次の処理を行います。

次のブランチでは、オーバーラップしたのが、Player02のコンポーネント「Damage」ではないことを確認し、Falseであれば、変数”Player Side”を使用して、相手キャラクターのどちら側にいるのか判断しています。

その後、変数”Player Side”の値に応じて、オーバーラップしたOther Compの位置を基準とし、変数”Hit Point for Effect”にヒットエフェクトを発生させる位置を代入します。

それから、様々なカスタムイベントを使用して、ダメージの処理や値の初期化を行いますが、まずはそれぞれの概要説明を行います。

イベント「Hit&Damage」では、ヒットかガードしているのかを確認し、ヒットしているのであれば、ダメージ処理を行います。

イベント「Setting Attack-Flag OFF」は攻撃関連の変数初期化を行います。

イベント「Setting Attack-Box OFF」は攻撃の衝突判定を無効にしており、これは攻撃中にダメージを受けたことを想定しています。

イベント「Setting Attack-Flag OFF for Bullet」は必殺技Fireball関連の変数初期化を行っており、これはFireballで攻撃中にダメージを受けたことを想定しています。

次にイベント「Hit Stop For Attacking」はジャンプ攻撃がヒットしたときに、キャラクターが一瞬空中で止まるような処理をしており、これはヒット確認ができる時間を用意するためです。

次の、イベント「Setting Attack-Box OFF」は攻撃しているキャラクターの攻撃判定を無効にしています。

イベント「Cancel OFF」はキャンセル必殺技の変数を初期化しており、これも攻撃中にダメージを受けたことを想定しています。

最後にイベント「Dash OFF」と「Step OFF」は前ステップとバックステップ中にダメージを受けたことを想定しており、値を初期化しています。

それでは、値を初期化しているイベントについては、以前に説明したので省略し、イベント「Hit&Damage」について説明します。

イベント「Hit&Damage」では、マクロ「Controller ID Double」を使用してどちらのPlayerControllerの処理なのか確認し、ノード「P01 Hit&Damage」で処理を継続します。

ノード「P01 Hit&Damage」では、ノード「Sequence」で2つの処理をおこなっており、まず下側の処理では、変数”P01 Stun”でスタンしているか確認し、Trueであれば、スタン関連の変数を初期化しています。

それぞれの変数については、別途スタンの詳細説明で行います。

次に上側の処理では、変数”P01 Hit Back”をTrueにし、攻撃を受けたことを参照できるようにしています。

さらに変数”Cross-up”でめくり攻撃か確認をしており、Trueであれば、変数”Damage Af Ch Side”をTrueにし、キャラクターの向きを変更するのは、ダメージ処理が終了してから実施するようにしています。

その後、関数「Delay」を使用して、1フレーム遅らせて処理することで、ヒットとガードがほぼ同時に発生したときに不具合にならないよう予防しています。

次に変数”P01 In Air”を使用して、キャラクターが空中にいるか確認しており、Trueであれば、さらに変数”P01 Z Velocity”を使用して、ジャンプの上昇か下降中かを確認しており、Falseであれば、効果音の再生とイベント「ON Down」を処理して、変数”P01 Down”をTrueにします。

さらに、コンポーネント「P01 D-Box」と「P01 D-Box For B」の大きさを関数「Set Box Extent」を使用して変更しており、空中でダメージを受けた場合は、その後のダメージ判定領域を小さくしています。

変数”P01 Z Velocity”の確認結果がTrueの場合は、さらに変数”Bullet Damaged”を使用して、Fireballによるダメージか確認しており、Trueであれば、先程と同じダウン処理とイベント「D-Box OFF」によってダメージ判定を無効化しており、Falseであれば、ダウン処理はせずに、イベント「D-Box OFF」によるダメージ判定の無効化のみ処理を行っています。

次に変数”P01 In Air”がFalseだった場合は、変数”Player Side”を使用して、相手のキャラクターに対してどちら側にいるのか判断し、その後、変数”Player Side”の値に応じたガードが入力されているか確認します。

ガードが入力されていない場合は、ダメージ確定となり、変数”P01 Open Counter”を使用して、カウンターヒットであるか確認しており、Trueであれば、変数”P01 is Damaged Counter”をTrueにして、カウンターヒット確定とします。

その後、変数”P01 Crouch”を使用して、しゃがんでいるか立っているのかの確認を行い、ダメージ処理を継続します。

ガードが入力されている場合は、変数”P01 Damaged”を確認して、既にダメージを受けていないか確認した後、変数”P01 Crouch”でしゃがんでいるかの確認をおこない、Trueの場合はさらに、変数”Middle Attack”を使用して中段攻撃か確認を行って、Trueであればダメージ確定、Falseであれば、ガード確定となります。

ガードが入力されていて、しゃがんでいない場合は、変数”Low Attack”を使用して下段攻撃か確認を行い、Trueであれば、ダメージ確定、Falseであれば、ガード確定となります。

次にガードが確定した場合の処理を説明します。

関数「Play Sound 2D」を使用してガードした時の効果音を再生し、次に変数”Bullet Damaged”を使用し、Fireballの攻撃であれば、変数”Bullet Damaged”をFalseにして処理を終了し、Falseであれば、変数”Hit Point For Effect”の値を参照して、ガードエフェクトを表示する位置を指定し、関数「Spawn Emitter Location」を使用して、 ガードエフェクトを表示します。

ガードエフェクトの表示位置については、画面端にいる場合だけ、Y方向の位置がずれて見えるので、位置を補正するような処理をしています。

次にダメージが確定した時の処理を説明します。

変数”P01 Damaged”をTrueにして、ダメージが確定したことを参照できるようにし、その後、変数”Where to Attack”の値に応じて、変数”P01 Kind of Guard&Damage”に値を代入し、どのダメージアニメーションを再生するのか決定します。

空中でのダメージの場合は、ダメージの回数をカウントしており、3回以上であれば、イベント「D-Box OFF」により、ダメージ判定を無効化して処理を継続します。

その他、ダメージが確定したときに、キャラクターの左右の位置が入れ替わっていた場合は、変数”Pre-Change Side”がTrueとなり、変数”Cross-up”にTrueを代入して、めくり攻撃が確定したことを参照できるようにしています。

さらに、下段のダメージが確定した場合はダウン処理を実施し、しゃがみもしくは立ち状態でのダメージが確定した場合は、変数”P01 is Damaged Counter”の値を確認して、Trueの場合は、専用の効果音を再生し、Falseの場合は、ヒットした場所に応じた効果音を再生します。

その後の処理は、変数”Bullet Damaged”を確認し、Trueであれば、Falseに変更して初期化を行い、Falseであれば、変数”Hit Point For Effect”の値を参照して、ヒットエフェクトを表示する位置を指定し、関数「Spawn Emitter Location」を使用して、ヒットエフェクトを表示します。

ヒットエフェクトの表示位置については、画面端にいる場合だけ、Y方向の位置がずれて見えるので、位置を補正するような処理をしています。

次に、変数”Time Over”を確認して、時間切れでなければ処理を継続し、変数”P02 Char Num”でどのキャラクターであるか特定後、変数”P02 Kind Of Attack”でどの攻撃だったのかを特定しています。

その後は、変数”P02 Kind Of Attack” の値に応じて、変数”P01 is Damaged Counter”でカウンターヒットしたのか確認後、変数”P01 Life”から攻撃の種類に応じたダメージ量を引き算し、”P01 Stun G”と”P01 SP”へダメージ量に応じた値を加算しています。

それから、変数”P01 Begin Anim D”をTrueにして、ダメージアニメーションを再生する処理を開始し、その後、変数”P01 Stun G”の値を確認して、MAXであれば、ダウンする処理を行ったあと、MAXではない場合も含め、変数”P01 Life”の値を確認し、0であれば、カスタムイベント「KO」の処理を行います。

カスタムイベント「KO」の詳細については、別記事で説明します。

それでは、ダメージアニメーションの説明をします。

アニメーションブループリントの「Char01_AnimBP」のイベント「Blueprint Update Animation」に繋がった処理で、変数”P01 Begin Anim D”を確認しており、Trueであれば、ノード「Do Once」を使用して、カスタムイベント「P01 Damage&Guard Anim」の処理を開始します。

カスタムイベント「P01 Damage&Guard Anim」では、カスタムイベント「D-BOX For T OFF」を処理し、ダメージアニメーション再生中は、投げの判定を無効に設定した後、ノード「Sequence」で2つの処理を実施し、まず下側の処理で、4フレーム後にダメージ関連の一部の変数を初期化しています。

上側の処理では、変数”P01 KO”の値を確認し、Falseであれば、変数”P01 Kind of Guard&Damage”の値を使用したSwitchノードを処理し、Trueであれば、キャラクターが空中にいるのか確認し、空中にいれば、通常のダメージアニメーションを再生し、地上にいれば、KO専用のアニメーションを再生します。

Switchノードでは、変数”P01 Kind of Guard&Damage”の値に応じたアニメーションが、PlayMontageにより再生されますが、ダウンが必要なアニメーションについては、「BP_Common_Controller」のカスタムイベント「ON Down Anim」が処理され、変数”P01 Down Anim”をTrueにします。

アニメーションブループリント「Char01_AnimBP」では、変数”P01 Down Anim”を確認してTrueであれば、KOであるか確認し、KOであれば、ダウンしたアニメーションを継続して再生し、KOでない場合は、ノード「Do Once」を使用して、ダウンしたアニメーションを一度だけ再生して、起き上がりの準備をします。

さらに、ジャンプ上昇時にダメージを受けた場合は、一時的にダメージ判定をOFFにしていたので、カスタムイベント「D-Box ON」を処理して、ダメージ判定を有効にしています。

その後、ダメージ関連の変数を初期化するカスタムイベントを処理していますが、まず「D-BOX For T ON」で投げ判定を有効にもどします。

さらに「OFF Damage」でダメージ関連の変数を初期化しており、変数”P01 Damaged”、”P01 Hit Back”、”P01 is Damaged Counter”、”P01 Damaged By T”をFalseにしています。

その後のカスタムイベント「Setting Attack-Flag OFF」、「Dash OFF」、「Step OFF」については以前説明したとおりです。

これで、ダメージアニメーションの説明が終了したので、次はFireBallやIceBallのダメージを受けた時の処理を説明します。

FireBallやIceBallでダメージを受けた時は、「BP_Char01」のコンポーネント「Damage for bullet」のイベント「On Component Begin Overlap」で処理しています。

コンポーネント「Damage」のイベントとほぼ同様の処理となりますが、違う部分があるので説明します。

まずは、変数”Bullet Damaged”をTrueにし、FireBallやIceBallのダメージであることを参照できるようにしています。

次にIceBallが複数回ヒットとなるので、変数”Multiple Hit Times”が0になるまで繰り返し処理を行っており、変数”P01 Begin Anim D”をFalseにして、再度ダメージアニメーションを再生できるようにし、変数”P01 Stun”がTrueになった場合は、繰り返し処理を中止するようにしています。

FireBallやIceBallのダメージアニメーション処理は先程と同じになりますので、次に投げのダメージを受けた時の処理を説明します。

投げのダメージを受けた時は、「BP_Char01」のコンポーネント「Damage for Throw」のイベント「On Component Begin Overlap」で処理しています。

コンポーネント「Damage」のイベントとほぼ同様の処理となりますが、違う部分があるので説明します。

まずは、「BP_Common_Controller」のカスタムイベント「Throw Tech On」を処理しており、投げ抜けを可能にする変数”P01 Throw Tech”をTrueにしています。

次に、「BP_Common_Controller」のカスタムイベント「Throw Flag」を処理しており、投げによるダメージをうけたことにするため、変数”P01 Damaged By T”をTrueにしています。

次に、「BP_Common_Controller」のカスタムイベント「Throw Damage」を処理していますが、先程説明したノード「P01_Hit&Damage」での処理となります。

ノード「P01_Hit&Damage」では、変数”P01 Hit Back”をTrueにして、攻撃がヒットしたことを参照できるようにし、変数”P01 Kind of Guard&Damage”に値を代入し、投げによるダメージであることを指定します。

さらに、変数”P01 Begin Anim D”をTrueにして、ダメージアニメーションの処理を開始するのと、相手キャラクターによって、投げのダメージ処理が変更されるので、変数”P02 Char Num”を使用した、Switchノードを使用しています。

次に関数「Delay」を使用して、投げられるまでの時間を処理しているのと、変数”P01 Success Throw T”を確認して、Trueであれば、変数”P01 Begin Anim D”と”P01 Kind of Guard&Damage”を初期化し、Falseであれば、ダウンの処理と投げ専用の効果音を再生しています。

その後、アニメーションブループリント「Char01_AnimBP」で、PlayMontageによる、投げのダメージアニメーションが再生されますが、相手のキャラクター毎にアニメーションが変更されるため、変数”P02 Char Num”を使用したSwitchノードを使用して、PlayMontageを個別に処理できるようにしています。

最後に投げ抜けについて説明しますが、投げ抜けは、投げのダメージを受けた後に変数”P01 Throw Tech”がTrueになった後、投げのダメージアニメーションに通知「Throw_Tech_off」が設定してあり、この通知では、変数”P01 Throw Tech”をFalseに設定します。

変数”P01 Throw Tech”がFalseになるまでの間にL1ボタンが押されると、「BP_Common_Controller」のイベント「Input action Throw」で処理している、マクロ「P01 Action Flag Throw」で変数”P01 Damaged By T”がTrueの処理となり、スタンしていなければ、変数”P01 Throw Tech”もTrueの処理となるので、変数”P02 Kind Of Attack”に投げ抜けのアニメーションを指定し、変数”P01 Success Throw T”をTrueにするのと、変数”Gate For HB P01″をTrueにして、投げ抜けのヒットバック処理を実施し、投げ抜け用の効果音も再生します。

その後、アニメーションブループリントの「Char01_AnimBP」のイベント「Blueprint Update Animation」に繋がった処理で、変数”P01 Success Throw T”を確認しており、ノード「Do Once」で投げ抜けのアニメーションを再生し、同時に、P02キャラクターの投げ抜けアニメーションも再生されます。

投げ抜けアニメーション終了後にカスタムイベント「OFF Damage」、「OFF Down」でダメージ関連の変数初期化を行い、「D-Box On」でダメージ判定を有効にし、さらにカスタムイベント「Success Throw T OFF」で投げ抜けの変数を初期化しています。

以上で説明は終了です。

次回は、ガードやヒットバック、ダウンからの起き上がり処理について説明します。

コメントを残す

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

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